Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp631527ybl; Wed, 8 Jan 2020 03:18:42 -0800 (PST) X-Google-Smtp-Source: APXvYqzE7qQQ9hNavKvPXTYsxtb062BRtZkvLSELrCAjyUnyFPzPm2lsmjsUB/kXOzcjkp9oImrX X-Received: by 2002:aca:b60a:: with SMTP id g10mr2518079oif.102.1578482322055; Wed, 08 Jan 2020 03:18:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578482322; cv=none; d=google.com; s=arc-20160816; b=tKp6JZUAEZOtC6s9iEHuzaafYVIH7Js6AIuE640N/ynVccRK26bnqJrRxdDTgP7fJk uLNrq/dA7vYTQINYr/yiHOx3+TcxNxCgEkc6B3dV2kSCS6h4L/UrtlOFAK2SK8W2SJTX DYfTXNDVK1BCpbnWQNvprpLi2MwRPSsQQvdgvE5CTNsQ8UHFFVYFLUGRbl5hCLnHd8K8 CQhza6g4APdnTT9NxFscvifHR3Xu0ZPAlZlbE/HQLsvwTUwq/R//Q9gJn4lT/XBItBBQ gmyW9Wtcu4i3d/faiWjcEtXcexY5nmj+RP2H4smqv9oug8zYcVBJqDkOV5bMGBxylt6g 5qwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version; bh=0gnTn117ZGLxjNVLb7cGcu+k6EBBmDz4i3bGE3tDCWM=; b=yj0OGM1lnrz0wRG4dfDPL5HnfY6Cya3Oeu4pcMilPKsdJDborsWWxC8aWHAhsNNw9/ C8IiqH1QuM6fjJsOpFTa8reu3thjuv116NfAO2Q2A3KMn7Wq96AYoYeNf3/k/NnhBzIv 0Eat5dS8VyuVUp5B9uuR9nYEbFG4dGDkBpYs4+3Z0Tf1s8dce28OaAHMnhU3j+Yw04Zp sQqdoRZg9uk4KHjj7see1hifGQstm8RSyQARFVeATh0AQn9j0e9RpoWYjJrS+pDprKoK oj6WToXtO4jNJuqPQ9BNxgjg0RbGpIALfqnL3bIotkLmHV2CVVFYmualU6I+M7JVv7iS yJ/A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p8si2038082otc.118.2020.01.08.03.18.29; Wed, 08 Jan 2020 03:18:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727727AbgAHKb0 (ORCPT + 99 others); Wed, 8 Jan 2020 05:31:26 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:40343 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726751AbgAHKbZ (ORCPT ); Wed, 8 Jan 2020 05:31:25 -0500 Received: from mail-qk1-f169.google.com ([209.85.222.169]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.145]) with ESMTPSA (Nemesis) id 1N63NW-1jmRKF0pwW-016MwO for ; Wed, 08 Jan 2020 11:31:23 +0100 Received: by mail-qk1-f169.google.com with SMTP id w127so2102058qkb.11 for ; Wed, 08 Jan 2020 02:31:22 -0800 (PST) X-Gm-Message-State: APjAAAVZvAyZXmIooq0zHL4BcCmen79dwCorVwbQ9Z9gsIlC/zvMtRjW IflaFd2XNINY1UgArGX9gecBY45x9qwJ67JlGg4= X-Received: by 2002:a37:a8d4:: with SMTP id r203mr3552221qke.394.1578479482002; Wed, 08 Jan 2020 02:31:22 -0800 (PST) MIME-Version: 1.0 References: <20200107212747.4182515-1-arnd@arndb.de> <20200107220019.GC7869@pendragon.ideasonboard.com> <20200107221222.GE7869@pendragon.ideasonboard.com> In-Reply-To: From: Arnd Bergmann Date: Wed, 8 Jan 2020 11:31:05 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] drm: panel: fix excessive stack usage in td028ttec1_prepare To: Laurent Pinchart Cc: Thierry Reding , David Airlie , Daniel Vetter , Oleksandr Natalenko , Sam Ravnborg , Linus Walleij , Boris Brezillon , Tomi Valkeinen , dri-devel , "linux-kernel@vger.kernel.org" , Kees Cook , Ard Biesheuvel Content-Type: text/plain; charset="UTF-8" X-Provags-ID: V03:K1:GtSMX4d6Pz5+tPvODnEJzQvB/bhyjAvBIfauWzsYIVJcj5rA3VV YgaUAoun6UVgLndki4qxnDEglABz1M1fe0PLxqKXriQCL87uDX9IKb4/t/8b9FRWBcv6iKt K3n3GT3ng11csmax7QEGId9oQigxEQ90MFLER2+VDdXc9r5b8awHKY3Vw0URfFEljIQwEm5 zdVrZhTalLTw4pCSYQO+g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:pcrRbgLk2R4=:UzMIkbY37PcIjyr9XH0v1S UU7wE7/ER2kiZpkZ5Y0MRsYa0+5gD/VC4RzzCqRYTpw8hjHj4Hda1r9JpgLk5r746lb0LvbZN fP94xZF82W2gOhpUGLU8YM+++O8OcH/RZ8hQ3JU20CjZuleQGgDf/7zAoz7DJrVTIrp8nD7Jd jK6CFqIOSzn9oNAgsanbrjJl4QeE9vv8p4rx8vWgchf6qCW3e2kFYdmkUSkBRoh7tUc4gExgo O4w/g5kFJPEHCidI2wenlnsAmVGH1jPiq2k/R2dGzDmBToWpfw3FHQJpkBnV3nm4vGTGt7kDn JkwD5cik4xVNJR81ZDBuHWMSTR7YrXv+m7aWA32bfpo7w56r/XnjSZB9qnuvTp08knCgX6Kst 6XTTYGRnUFmwgke+2LvaQKghAPywQJjGgSFmS7RSBVHMDIV/UfdBMMJGfl+uaS0Pbp6SKxU/K 4pokgr0ouiWSbvuWdFyO2cX33q6MReVfODcJ+xLP+mmVPTGI5+84RkeILsyBfj+TDhmlUIr6Z u+5W+FXEtLYu33/7yrcOaRTrjwJKyaAUGMRsb0TVnPunnVx6hoauAxOhySRuuNLDO9lCLadtD d/RdWEltuRx0VPXSW5b3zcWQCxoYtUSjLhZARrBFGieQdewsnMJrBDppCcynXM1kuZc2bwtQf ZDfl4Q7qLNYZX+HNIk00fDScVBnt2lZST8GOv31mXxGr0ZwdedUFyvaLzWQd2mxd645cjjWmT wdlmRvkV4G2uzki32x+K1xrU+Qq+FhkcF9P3OCjn259+57DDm5CPZ6dTBy3y996mLbRQPdzv6 n9EQ26mV8QBpVgLhmGSP1YE5sCVgxnhI9g7A1f+KyKlZvnSYA+N55ek75AO0eTZ8BlWn/bz/s 2y8WafEgSnv2emJ28xKQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 7, 2020 at 11:26 PM Arnd Bergmann wrote: > > On Tue, Jan 7, 2020 at 11:12 PM Laurent Pinchart > wrote: > > On Tue, Jan 07, 2020 at 11:09:13PM +0100, Arnd Bergmann wrote: > > > On Tue, Jan 7, 2020 at 11:00 PM Laurent Pinchart wrote: > > > > > Isn't this something that should be fixed at the compiler level ? > > > > > > I suspect but have not verified that structleak gcc plugin is partly at > > > fault here as well, it has caused similar problems elsewhere. > > I checked that now, and it's indeed the structleak plugin. > > Interestingly the problem goes away without the -fconserve-stack > option, which is meant to reduce the stack usage bug has the > opposite effect here (!). > > I'll do some more tests tomorrow. Here's a reduced test case: struct list_head { struct list_head *next, *prev; } typedef initcall_t; struct sg_table { int sgl; int nents; int orig_nents; }; struct spi_transfer { void *tx_buf; void *rx_buf; unsigned len; int tx_dma; int rx_dma; struct sg_table tx_sg; struct sg_table rx_sg; short delay_usecs; int delay; int cs_change_delay; int word_delay; int speed_hz; int effective_speed_hz; int ptp_sts_word_pre; int ptp_sts_word_post; int ptp_sts; _Bool timestamped_pre; struct list_head transfer_list; }; void spi_sync_transfer(struct spi_transfer *, int); void spi_write(void) { struct spi_transfer t; spi_sync_transfer(&t, 0); } int jbt_ret_write_0_err; void jbt_ret_write_0(void) { if (jbt_ret_write_0_err) spi_write(); } void jbt_reg_write_1(int *err) { if (*err) { struct spi_transfer t; spi_sync_transfer(&t, 1); } } void jbt_reg_write_2(int *err) { short tx_buf[3]; if (err) { struct spi_transfer t = {tx_buf}; spi_sync_transfer(&t, 0); } } int td028ttec1_prepare_i; void td028ttec1_prepare() { int ret; for (; td028ttec1_prepare_i; ++td028ttec1_prepare_i) { jbt_ret_write_0(); } jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_2(&ret); jbt_ret_write_0(); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); jbt_reg_write_1(&ret); } $ arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc panel-tpo-td028ttec1.c -fplugin=scripts/gcc-plugins/structleak_plugin.so -fplugin-arg-structleak_plugin-byref-all -S -O3 -Wframe-larger-than=128 panel-tpo-td028ttec1.i: In function 'td028ttec1_prepare': panel-tpo-td028ttec1.i:80:1: warning: the frame size of 192 bytes is larger than 128 bytes [-Wframe-larger-than=] $ arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc panel-tpo-td028ttec1.c -fplugin=scripts/gcc-plugins/structleak_plugin.so -fplugin-arg-structleak_plugin-byref-all -S -O3 -Wframe-larger-than=128 -fconserve-stack panel-tpo-td028ttec1.i: In function 'td028ttec1_prepare': panel-tpo-td028ttec1.i:80:1: warning: the frame size of 2032 bytes is larger than 128 bytes [-Wframe-larger-than=] I'm still not entirely sure what to make of this. The -fconserve-stack is supposed to prevent inlining when the frames get too large, but it appears that inlining less has the opposite effect here, as it leaves larger structures on the stack of the caller. structleak_plugin-byref-all causes each copy of the 'struct spi_transfer' to be initialized (intentionally) and left on the stack (as a side-effect of a somewhat suboptimal implementation). Arnd