lkml.org 
[lkml]   [2019]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 118/177] cpufreq: powernv: fix stack bloat and hard limit on number of CPUs
    Date
    From: John Hubbard <jhubbard@nvidia.com>

    commit db0d32d84031188443e25edbd50a71a6e7ac5d1d upstream.

    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 with a cross-compiler based on gcc 8.1.0, which I got from:
    https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/

    The warning is due to putting 1024 bytes on the stack:

    unsigned int chip[256];

    ...and it's also undesirable to have a hard limit on the number of
    CPUs here.

    Fix both problems by dynamically allocating based on num_possible_cpus,
    as recommended by Michael Ellerman.

    Fixes: 053819e0bf840 ("cpufreq: powernv: Handle throttling due to Pmax capping at chip level")
    Signed-off-by: John Hubbard <jhubbard@nvidia.com>
    Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
    Cc: 4.10+ <stable@vger.kernel.org> # 4.10+
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

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

    --- a/drivers/cpufreq/powernv-cpufreq.c
    +++ b/drivers/cpufreq/powernv-cpufreq.c
    @@ -1041,9 +1041,14 @@ static struct cpufreq_driver powernv_cpu

    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(num_possible_cpus(), sizeof(*chip), GFP_KERNEL);
    + if (!chip)
    + 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)

    \
     
     \ /
      Last update: 2019-12-16 19:25    [W:4.170 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site