| From ad312f95d41c9de19313c51e388c4984451c010f Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Tue, 14 May 2019 15:41:42 -0700 |
| Subject: fs/select: avoid clang stack usage warning |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit ad312f95d41c9de19313c51e388c4984451c010f upstream. |
| |
| 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. |
| |
| Link: http://lkml.kernel.org/r/20190307090146.1874906-1-arnd@arndb.de |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Reviewed-by: Andi Kleen <ak@linux.intel.com> |
| Cc: Nick Desaulniers <ndesaulniers@google.com> |
| Cc: Alexander Viro <viro@zeniv.linux.org.uk> |
| Cc: Christoph Hellwig <hch@lst.de> |
| Cc: Eric Dumazet <edumazet@google.com> |
| Cc: "Darrick J. Wong" <darrick.wong@oracle.com> |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Miles Chen <miles.chen@mediatek.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/poll.h | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- 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 |
| +#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 |