lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.5 353/542] vme: bridges: reduce stack usage
    Date
    From: Arnd Bergmann <arnd@arndb.de>

    [ Upstream commit 7483e7a939c074d887450ef1c4d9ccc5909405f8 ]

    With CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3, the stack usage in vme_fake
    grows above the warning limit:

    drivers/vme/bridges/vme_fake.c: In function 'fake_master_read':
    drivers/vme/bridges/vme_fake.c:610:1: error: the frame size of 1160 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
    drivers/vme/bridges/vme_fake.c: In function 'fake_master_write':
    drivers/vme/bridges/vme_fake.c:797:1: error: the frame size of 1160 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]

    The problem is that in some configurations, each call to
    fake_vmereadX() puts another variable on the stack.

    Reduce the amount of inlining to get back to the previous state,
    with no function using more than 200 bytes each.

    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20200107200610.3482901-1-arnd@arndb.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/vme/bridges/vme_fake.c | 30 ++++++++++++++++++------------
    1 file changed, 18 insertions(+), 12 deletions(-)

    diff --git a/drivers/vme/bridges/vme_fake.c b/drivers/vme/bridges/vme_fake.c
    index 3208a4409e44e..6a1bc284f297c 100644
    --- a/drivers/vme/bridges/vme_fake.c
    +++ b/drivers/vme/bridges/vme_fake.c
    @@ -414,8 +414,9 @@ static void fake_lm_check(struct fake_driver *bridge, unsigned long long addr,
    }
    }

    -static u8 fake_vmeread8(struct fake_driver *bridge, unsigned long long addr,
    - u32 aspace, u32 cycle)
    +static noinline_for_stack u8 fake_vmeread8(struct fake_driver *bridge,
    + unsigned long long addr,
    + u32 aspace, u32 cycle)
    {
    u8 retval = 0xff;
    int i;
    @@ -446,8 +447,9 @@ static u8 fake_vmeread8(struct fake_driver *bridge, unsigned long long addr,
    return retval;
    }

    -static u16 fake_vmeread16(struct fake_driver *bridge, unsigned long long addr,
    - u32 aspace, u32 cycle)
    +static noinline_for_stack u16 fake_vmeread16(struct fake_driver *bridge,
    + unsigned long long addr,
    + u32 aspace, u32 cycle)
    {
    u16 retval = 0xffff;
    int i;
    @@ -478,8 +480,9 @@ static u16 fake_vmeread16(struct fake_driver *bridge, unsigned long long addr,
    return retval;
    }

    -static u32 fake_vmeread32(struct fake_driver *bridge, unsigned long long addr,
    - u32 aspace, u32 cycle)
    +static noinline_for_stack u32 fake_vmeread32(struct fake_driver *bridge,
    + unsigned long long addr,
    + u32 aspace, u32 cycle)
    {
    u32 retval = 0xffffffff;
    int i;
    @@ -609,8 +612,9 @@ static ssize_t fake_master_read(struct vme_master_resource *image, void *buf,
    return retval;
    }

    -static void fake_vmewrite8(struct fake_driver *bridge, u8 *buf,
    - unsigned long long addr, u32 aspace, u32 cycle)
    +static noinline_for_stack void fake_vmewrite8(struct fake_driver *bridge,
    + u8 *buf, unsigned long long addr,
    + u32 aspace, u32 cycle)
    {
    int i;
    unsigned long long start, end, offset;
    @@ -639,8 +643,9 @@ static void fake_vmewrite8(struct fake_driver *bridge, u8 *buf,

    }

    -static void fake_vmewrite16(struct fake_driver *bridge, u16 *buf,
    - unsigned long long addr, u32 aspace, u32 cycle)
    +static noinline_for_stack void fake_vmewrite16(struct fake_driver *bridge,
    + u16 *buf, unsigned long long addr,
    + u32 aspace, u32 cycle)
    {
    int i;
    unsigned long long start, end, offset;
    @@ -669,8 +674,9 @@ static void fake_vmewrite16(struct fake_driver *bridge, u16 *buf,

    }

    -static void fake_vmewrite32(struct fake_driver *bridge, u32 *buf,
    - unsigned long long addr, u32 aspace, u32 cycle)
    +static noinline_for_stack void fake_vmewrite32(struct fake_driver *bridge,
    + u32 *buf, unsigned long long addr,
    + u32 aspace, u32 cycle)
    {
    int i;
    unsigned long long start, end, offset;
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 16:56    [W:4.115 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site