On Thu, Mar 07, 2019 at 10:01:36AM +0100, Arnd Bergmann wrote: > The select() implementation is carefully tuned to put a sensible amount > of data on the stack for holding a copy of the user space fd_set, > but not too large to risk overflowing the kernel stack. > > When building a 32-bit kernel with clang, we need a little more space > than with gcc, which often triggers a warning: > > fs/select.c:619:5: error: stack frame size of 1048 bytes in function 'core_sys_select' [-Werror,-Wframe-larger-than=] > int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp, > > I experimentally found that for 32-bit ARM, reducing the maximum > stack usage by 64 bytes keeps us reliably under the warning limit > again. > > Signed-off-by: Arnd Bergmann > --- > include/linux/poll.h | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/include/linux/poll.h b/include/linux/poll.h > index 7e0fdcf905d2..1cdc32b1f1b0 100644 > --- a/include/linux/poll.h > +++ b/include/linux/poll.h > @@ -16,7 +16,11 @@ > extern struct ctl_table epoll_table[]; /* for sysctl */ > /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating > additional memory. */ > +#ifdef __clang__ > +#define MAX_STACK_ALLOC 768 Hi Arnd, Upon a toolchain upgrade for Android, our 32b x86 image used for first-party developer VMs started tripping -Wframe-larger-than= again (thanks -Werror) which is blocking our ability to upgrade our toolchain. I've attached the zstd compressed .config file that reproduces with ToT LLVM: $ cd linux $ zstd -d path/to/config.zst -o .config $ make ARCH=i386 LLVM=1 -j128 fs/select.o fs/select.c:625:5: error: stack frame size (1028) exceeds limit (1024) in 'core_sys_select' [-Werror,-Wframe-larger-than] int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp, ^ As you can see, we're just barely tipping over the limit. Should I send a patch to reduce this again? If so, any thoughts by how much? Decrementing the current value by 4 builds the config in question, but seems brittle. Do we need to only do this if !CONFIG_64BIT? commit ad312f95d41c ("fs/select: avoid clang stack usage warning") seems to allude to this being more problematic on 32b targets? > +#else > #define MAX_STACK_ALLOC 832 > +#endif > #define FRONTEND_STACK_ALLOC 256 > #define SELECT_STACK_ALLOC FRONTEND_STACK_ALLOC > #define POLL_STACK_ALLOC FRONTEND_STACK_ALLOC > -- > 2.20.0 > >