lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0521/1039] cxl/core: Remove cxld_const_init in cxl_decoder_alloc()
    Date
    From: Nathan Chancellor <nathan@kernel.org>

    [ Upstream commit be185c2988b48db65348d94168c793bdbc8d23c3 ]

    Commit 48667f676189 ("cxl/core: Split decoder setup into alloc + add")
    aimed to fix a large stack frame warning but from v5 to v6, it
    introduced a new instance of the warning due to allocating
    cxld_const_init on the stack, which was done due to the use of const on
    the nr_target member of the cxl_decoder struct. With ARCH=arm
    allmodconfig minus CONFIG_KASAN:

    GCC 11.2.0:

    drivers/cxl/core/bus.c: In function ‘cxl_decoder_alloc’:
    drivers/cxl/core/bus.c:523:1: error: the frame size of 1032 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
    523 | }
    | ^
    cc1: all warnings being treated as errors

    Clang 12.0.1:

    drivers/cxl/core/bus.c:486:21: error: stack frame size of 1056 bytes in function 'cxl_decoder_alloc' [-Werror,-Wframe-larger-than=]
    struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port, int nr_targets)
    ^
    1 error generated.

    Revert that part of the change, which makes the stack frame of
    cxl_decoder_alloc() much more reasonable.

    Fixes: 48667f676189 ("cxl/core: Split decoder setup into alloc + add")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1539
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Link: https://lore.kernel.org/r/20211210213627.2477370-1-nathan@kernel.org
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/cxl/core/bus.c | 6 ++----
    drivers/cxl/cxl.h | 2 +-
    2 files changed, 3 insertions(+), 5 deletions(-)

    diff --git a/drivers/cxl/core/bus.c b/drivers/cxl/core/bus.c
    index ebd061d039508..46ce58376580b 100644
    --- a/drivers/cxl/core/bus.c
    +++ b/drivers/cxl/core/bus.c
    @@ -485,9 +485,7 @@ out_unlock:

    struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port, int nr_targets)
    {
    - struct cxl_decoder *cxld, cxld_const_init = {
    - .nr_targets = nr_targets,
    - };
    + struct cxl_decoder *cxld;
    struct device *dev;
    int rc = 0;

    @@ -497,13 +495,13 @@ struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port, int nr_targets)
    cxld = kzalloc(struct_size(cxld, target, nr_targets), GFP_KERNEL);
    if (!cxld)
    return ERR_PTR(-ENOMEM);
    - memcpy(cxld, &cxld_const_init, sizeof(cxld_const_init));

    rc = ida_alloc(&port->decoder_ida, GFP_KERNEL);
    if (rc < 0)
    goto err;

    cxld->id = rc;
    + cxld->nr_targets = nr_targets;
    dev = &cxld->dev;
    device_initialize(dev);
    device_set_pm_not_required(dev);
    diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
    index 3af704e9b448e..7c2b51746e318 100644
    --- a/drivers/cxl/cxl.h
    +++ b/drivers/cxl/cxl.h
    @@ -191,7 +191,7 @@ struct cxl_decoder {
    int interleave_granularity;
    enum cxl_decoder_type target_type;
    unsigned long flags;
    - const int nr_targets;
    + int nr_targets;
    struct cxl_dport *target[];
    };

    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-25 01:11    [W:4.031 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site