Jiri Slaby ef7db2
From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Jiri Slaby ef7db2
Date: Fri, 16 Sep 2022 11:22:05 +0300
Jiri Slaby ef7db2
Subject: [PATCH] drm/omap: dsi: Fix excessive stack usage
Jiri Slaby ef7db2
References: bsc#1012628
Jiri Slaby ef7db2
Patch-mainline: 6.2.3
Jiri Slaby ef7db2
Git-commit: cfca78971b9233aef0891507a98fba62046d4542
Jiri Slaby ef7db2
Jiri Slaby ef7db2
[ Upstream commit cfca78971b9233aef0891507a98fba62046d4542 ]
Jiri Slaby ef7db2
Jiri Slaby ef7db2
dsi_dump_dsi_irqs(), a function used for debugfs prints, has a large
Jiri Slaby ef7db2
struct in its frame, which can result in:
Jiri Slaby ef7db2
Jiri Slaby ef7db2
drivers/gpu/drm/omapdrm/dss/dsi.c:1126:1: warning: the frame size of 1060 bytes is larger than 1024 bytes [-Wframe-larger-than=]
Jiri Slaby ef7db2
Jiri Slaby ef7db2
As the performance of the function is of no concern, let's allocate the
Jiri Slaby ef7db2
struct with kmalloc instead.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Compile-tested only.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Jiri Slaby ef7db2
Reported-by: kernel test robot <lkp@intel.com>
Jiri Slaby ef7db2
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Jiri Slaby ef7db2
Link: https://patchwork.freedesktop.org/patch/msgid/20220916082206.167427-1-tomi.valkeinen@ideasonboard.com
Jiri Slaby ef7db2
Signed-off-by: Sasha Levin <sashal@kernel.org>
Jiri Slaby ef7db2
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby ef7db2
---
Jiri Slaby ef7db2
 drivers/gpu/drm/omapdrm/dss/dsi.c | 26 ++++++++++++++++----------
Jiri Slaby ef7db2
 1 file changed, 16 insertions(+), 10 deletions(-)
Jiri Slaby ef7db2
Jiri Slaby ef7db2
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
Jiri Slaby ef7db2
index a6845856..4c1084eb 100644
Jiri Slaby ef7db2
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
Jiri Slaby ef7db2
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
Jiri Slaby ef7db2
@@ -1039,22 +1039,26 @@ static int dsi_dump_dsi_irqs(struct seq_file *s, void *p)
Jiri Slaby ef7db2
 {
Jiri Slaby ef7db2
 	struct dsi_data *dsi = s->private;
Jiri Slaby ef7db2
 	unsigned long flags;
Jiri Slaby ef7db2
-	struct dsi_irq_stats stats;
Jiri Slaby ef7db2
+	struct dsi_irq_stats *stats;
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+	stats = kmalloc(sizeof(*stats), GFP_KERNEL);
Jiri Slaby ef7db2
+	if (!stats)
Jiri Slaby ef7db2
+		return -ENOMEM;
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	spin_lock_irqsave(&dsi->irq_stats_lock, flags);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-	stats = dsi->irq_stats;
Jiri Slaby ef7db2
+	*stats = dsi->irq_stats;
Jiri Slaby ef7db2
 	memset(&dsi->irq_stats, 0, sizeof(dsi->irq_stats));
Jiri Slaby ef7db2
 	dsi->irq_stats.last_reset = jiffies;
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	spin_unlock_irqrestore(&dsi->irq_stats_lock, flags);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	seq_printf(s, "period %u ms\n",
Jiri Slaby ef7db2
-			jiffies_to_msecs(jiffies - stats.last_reset));
Jiri Slaby ef7db2
+			jiffies_to_msecs(jiffies - stats->last_reset));
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-	seq_printf(s, "irqs %d\n", stats.irq_count);
Jiri Slaby ef7db2
+	seq_printf(s, "irqs %d\n", stats->irq_count);
Jiri Slaby ef7db2
 #define PIS(x) \
Jiri Slaby ef7db2
-	seq_printf(s, "%-20s %10d\n", #x, stats.dsi_irqs[ffs(DSI_IRQ_##x)-1]);
Jiri Slaby ef7db2
+	seq_printf(s, "%-20s %10d\n", #x, stats->dsi_irqs[ffs(DSI_IRQ_##x)-1]);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	seq_printf(s, "-- DSI%d interrupts --\n", dsi->module_id + 1);
Jiri Slaby ef7db2
 	PIS(VC0);
Jiri Slaby ef7db2
@@ -1078,10 +1082,10 @@ static int dsi_dump_dsi_irqs(struct seq_file *s, void *p)
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 #define PIS(x) \
Jiri Slaby ef7db2
 	seq_printf(s, "%-20s %10d %10d %10d %10d\n", #x, \
Jiri Slaby ef7db2
-			stats.vc_irqs[0][ffs(DSI_VC_IRQ_##x)-1], \
Jiri Slaby ef7db2
-			stats.vc_irqs[1][ffs(DSI_VC_IRQ_##x)-1], \
Jiri Slaby ef7db2
-			stats.vc_irqs[2][ffs(DSI_VC_IRQ_##x)-1], \
Jiri Slaby ef7db2
-			stats.vc_irqs[3][ffs(DSI_VC_IRQ_##x)-1]);
Jiri Slaby ef7db2
+			stats->vc_irqs[0][ffs(DSI_VC_IRQ_##x)-1], \
Jiri Slaby ef7db2
+			stats->vc_irqs[1][ffs(DSI_VC_IRQ_##x)-1], \
Jiri Slaby ef7db2
+			stats->vc_irqs[2][ffs(DSI_VC_IRQ_##x)-1], \
Jiri Slaby ef7db2
+			stats->vc_irqs[3][ffs(DSI_VC_IRQ_##x)-1]);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	seq_printf(s, "-- VC interrupts --\n");
Jiri Slaby ef7db2
 	PIS(CS);
Jiri Slaby ef7db2
@@ -1097,7 +1101,7 @@ static int dsi_dump_dsi_irqs(struct seq_file *s, void *p)
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 #define PIS(x) \
Jiri Slaby ef7db2
 	seq_printf(s, "%-20s %10d\n", #x, \
Jiri Slaby ef7db2
-			stats.cio_irqs[ffs(DSI_CIO_IRQ_##x)-1]);
Jiri Slaby ef7db2
+			stats->cio_irqs[ffs(DSI_CIO_IRQ_##x)-1]);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	seq_printf(s, "-- CIO interrupts --\n");
Jiri Slaby ef7db2
 	PIS(ERRSYNCESC1);
Jiri Slaby ef7db2
@@ -1122,6 +1126,8 @@ static int dsi_dump_dsi_irqs(struct seq_file *s, void *p)
Jiri Slaby ef7db2
 	PIS(ULPSACTIVENOT_ALL1);
Jiri Slaby ef7db2
 #undef PIS
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
+	kfree(stats);
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
 	return 0;
Jiri Slaby ef7db2
 }
Jiri Slaby ef7db2
 #endif
Jiri Slaby ef7db2
-- 
Jiri Slaby ef7db2
2.35.3
Jiri Slaby ef7db2