Re: [PATCH v2 03/11] tty: kbd: reduce stack size with KASAN

From: Dmitry Torokhov
Date: Fri Jun 16 2017 - 17:08:08 EST

On Fri, Jun 16, 2017 at 1:56 PM, Arnd Bergmann <arnd@xxxxxxxx> wrote:
> On Fri, Jun 16, 2017 at 7:29 PM, Dmitry Torokhov
> <dmitry.torokhov@xxxxxxxxx> wrote:
>> On Fri, Jun 16, 2017 at 8:58 AM, Samuel Thibault
>> <samuel.thibault@xxxxxxxxxxxx> wrote:
>>> I'm however afraid we'd have to mark a lot of static functions that way,
>>> depending on the aggressivity of gcc... I'd indeed really argue that gcc
>>> should consider stack usage when inlining.
>>> static int f(int foo) {
>>> char c[256];
>>> g(c, foo);
>>> }
>>> is really not something that I'd want to see the compiler to inline.
>> Why would not we want it be inlined? What we do not want us several
>> calls having _separate_ instances of 'c' generated on the stack, all
>> inlined calls should share 'c'. And of course if we have f1, f2, and
>> f3 with c1, c2, and c3, GCC should not blow up the stack inlining and
>> allocating stack for all 3 of them beforehand.
>> But this all seems to me issue that should be solved in toolchain, not
>> trying to play whack-a-mole with kernel sources.
> The problem for the Samuel's example is that
> a) the "--param asan-stack=1" option in KASAN does blow up the
> stack, which is why the annotation is now called 'noinline_if_stackbloat'.
> b) The toolchain cannot solve the problem, as most instances of the
> problem (unlike kbd_put_queue) force the inlining unless you build
> with the x86-specific CONFIG_OPTIMIZE_INLINING.

If inlining done right there should be no change in stack size,
because if calls are not inlined then stack storage is "shared"
between calls, and it should similarly be shared when calls are
inlined. And that is toolchain issue.