From: David Miller > Sent: 09 February 2017 21:31 > From: Arnd Bergmann <a...@arndb.de> > Date: Wed, 8 Feb 2017 22:18:26 +0100 > > > When CONFIG_KASAN is enabled, the "--param asan-stack=1" causes rather large > > stack frames in some functions. This goes unnoticed normally because > > CONFIG_FRAME_WARN is disabled with CONFIG_KASAN by default as of commit > > 3f181b4d8652 ("lib/Kconfig.debug: disable -Wframe-larger-than warnings with > > KASAN=y"). > > > > The kernelci.org build bot however has the warning enabled and that led > > me to investigate it a little further, as every build produces these > > warnings: > > > > net/wireless/nl80211.c:4389:1: warning: the frame size of 2240 bytes is > > larger than 2048 bytes [- ... > > > > It turns out that there is a relatively simple workaround for the netlink > > users that currently use a local variable in order to do the type > > conversion: > > Moving the three functions (for each of the typical sizes) to lib/nlattr.c > > avoids using local variables in the caller, which drastically reduces the > > stack usage for nl80211 and br_netlink. > > > > It would be good if we could enable the frame size check after that again, > > but that should be a separate patch and it requires some more testing > > to see which the largest acceptable frame size should be. ... > You should only extern these things when KASAN is enabled. > > The reason is that uninlining these routines makes attribute emission > more expensive and for some applications performance of this matters.
If performance of nla_put() matters, then adding 1, 2 and 4 byte attributes ought to be doable without writing the values to memory and later doing (I presume) a memcpy(). I also can't help feeling that the gcc KASAN stuff needs some way to annotate an 'extern' to say that a value passed by reference isn't treated as an array. Otherwise I suspect you get a lot of bloat all over the place. David