linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] cpufreq: powernv: fix stack bloat and NR_CPUS limitation
@ 2019-10-18  0:04 John Hubbard
  2019-10-18  4:27 ` Viresh Kumar
  0 siblings, 1 reply; 6+ messages in thread
From: John Hubbard @ 2019-10-18  0:04 UTC (permalink / raw)
  To: Shilpasri G Bhat
  Cc: LKML, John Hubbard, Preeti U Murthy, Viresh Kumar,
	Rafael J . Wysocki, linux-pm, linuxppc-dev

The following build warning occurred on powerpc 64-bit builds:

drivers/cpufreq/powernv-cpufreq.c: In function 'init_chip_info':
drivers/cpufreq/powernv-cpufreq.c:1070:1: warning: the frame size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]

This is due to putting 1024 bytes on the stack:

    unsigned int chip[256];

...and while looking at this, it also has a bug: it fails with a stack
overrun, if CONFIG_NR_CPUS > 256.

Fix both problems by dynamically allocating based on CONFIG_NR_CPUS.

Fixes: 053819e0bf840 ("cpufreq: powernv: Handle throttling due to Pmax capping at chip level")
Cc: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
Cc: Preeti U Murthy <preeti@linux.vnet.ibm.com>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: linux-pm@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: John Hubbard <jhubbard@nvidia.com>
---

Hi,

I have only compile-tested this, so I would appreciate if anyone
could do a basic runtime test on it. But (famous last words) it
seems simple enough that I'm confident it's correct. oh boy. :)

thanks,
John Hubbard
NVIDIA

 drivers/cpufreq/powernv-cpufreq.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
index 6061850e59c9..78e04402125f 100644
--- a/drivers/cpufreq/powernv-cpufreq.c
+++ b/drivers/cpufreq/powernv-cpufreq.c
@@ -1041,9 +1041,14 @@ static struct cpufreq_driver powernv_cpufreq_driver = {
 
 static int init_chip_info(void)
 {
-	unsigned int chip[256];
+	unsigned int *chip;
 	unsigned int cpu, i;
 	unsigned int prev_chip_id = UINT_MAX;
+	int ret = 0;
+
+	chip = kcalloc(CONFIG_NR_CPUS, sizeof(int), GFP_KERNEL);
+	if (!chips)
+		return -ENOMEM;
 
 	for_each_possible_cpu(cpu) {
 		unsigned int id = cpu_to_chip_id(cpu);
@@ -1055,8 +1060,10 @@ static int init_chip_info(void)
 	}
 
 	chips = kcalloc(nr_chips, sizeof(struct chip), GFP_KERNEL);
-	if (!chips)
-		return -ENOMEM;
+	if (!chips) {
+		ret = -ENOMEM;
+		goto free_and_return;
+	}
 
 	for (i = 0; i < nr_chips; i++) {
 		chips[i].id = chip[i];
@@ -1066,7 +1073,9 @@ static int init_chip_info(void)
 			per_cpu(chip_info, cpu) =  &chips[i];
 	}
 
-	return 0;
+free_and_return:
+	kfree(chip);
+	return ret;
 }
 
 static inline void clean_chip_info(void)
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-10-18  5:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-18  0:04 [PATCH] cpufreq: powernv: fix stack bloat and NR_CPUS limitation John Hubbard
2019-10-18  4:27 ` Viresh Kumar
2019-10-18  4:34   ` John Hubbard
2019-10-18  4:38     ` Viresh Kumar
2019-10-18  4:41       ` John Hubbard
2019-10-18  4:50         ` Viresh Kumar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).