struct poll_wqueues table caused the stack usage of do_select() to grow beyond the warning limit on 32-bit architectures w/ gcc. fs/select.c: In function ‘do_select’: fs/select.c:615:1: warning: the frame size of 1152 bytes is larger than 1024 bytes [-Wframe-larger-than=] Allocating dynamic memory in do_select() to fix this issue. Signed-off-by: Chao Yu <chao@xxxxxxxxxx> --- fs/select.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/fs/select.c b/fs/select.c index 0ee55af1a55c..1b729494b4e9 100644 --- a/fs/select.c +++ b/fs/select.c @@ -479,23 +479,29 @@ static inline void wait_key_set(poll_table *wait, unsigned long in, static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time) { ktime_t expire, *to = NULL; - struct poll_wqueues table; + struct poll_wqueues *table; poll_table *wait; int retval, i, timed_out = 0; u64 slack = 0; __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0; unsigned long busy_start = 0; + table = kmalloc(sizeof(struct poll_wqueues), GFP_KERNEL); + if (!table) + return -ENOMEM; + rcu_read_lock(); retval = max_select_fd(n, fds); rcu_read_unlock(); - if (retval < 0) + if (retval < 0) { + kfree(table); return retval; + } n = retval; - poll_initwait(&table); - wait = &table.pt; + poll_initwait(table); + wait = &table->pt; if (end_time && !end_time->tv_sec && !end_time->tv_nsec) { wait->_qproc = NULL; timed_out = 1; @@ -578,8 +584,8 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time) wait->_qproc = NULL; if (retval || timed_out || signal_pending(current)) break; - if (table.error) { - retval = table.error; + if (table->error) { + retval = table->error; break; } @@ -604,12 +610,14 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time) to = &expire; } - if (!poll_schedule_timeout(&table, TASK_INTERRUPTIBLE, + if (!poll_schedule_timeout(table, TASK_INTERRUPTIBLE, to, slack)) timed_out = 1; } - poll_freewait(&table); + poll_freewait(table); + + kfree(table); return retval; } -- 2.40.1