~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/select.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/select.c (Architecture sparc) and /fs/select.c (Architecture i386)


  1 // SPDX-License-Identifier: GPL-2.0                 1 // SPDX-License-Identifier: GPL-2.0
  2 /*                                                  2 /*
  3  * This file contains the procedures for the h      3  * This file contains the procedures for the handling of select and poll
  4  *                                                  4  *
  5  * Created for Linux based loosely upon Mathiu      5  * Created for Linux based loosely upon Mathius Lattner's minix
  6  * patches by Peter MacDonald. Heavily edited       6  * patches by Peter MacDonald. Heavily edited by Linus.
  7  *                                                  7  *
  8  *  4 February 1994                                 8  *  4 February 1994
  9  *     COFF/ELF binary emulation. If the proce      9  *     COFF/ELF binary emulation. If the process has the STICKY_TIMEOUTS
 10  *     flag set in its personality we do *not*     10  *     flag set in its personality we do *not* modify the given timeout
 11  *     parameter to reflect time remaining.        11  *     parameter to reflect time remaining.
 12  *                                                 12  *
 13  *  24 January 2000                                13  *  24 January 2000
 14  *     Changed sys_poll()/do_poll() to use PAG     14  *     Changed sys_poll()/do_poll() to use PAGE_SIZE chunk-based allocation 
 15  *     of fds to overcome nfds < 16390 descrip     15  *     of fds to overcome nfds < 16390 descriptors limit (Tigran Aivazian).
 16  */                                                16  */
 17                                                    17 
 18 #include <linux/compat.h>                          18 #include <linux/compat.h>
 19 #include <linux/kernel.h>                          19 #include <linux/kernel.h>
 20 #include <linux/sched/signal.h>                    20 #include <linux/sched/signal.h>
 21 #include <linux/sched/rt.h>                        21 #include <linux/sched/rt.h>
 22 #include <linux/syscalls.h>                        22 #include <linux/syscalls.h>
 23 #include <linux/export.h>                          23 #include <linux/export.h>
 24 #include <linux/slab.h>                            24 #include <linux/slab.h>
 25 #include <linux/poll.h>                            25 #include <linux/poll.h>
 26 #include <linux/personality.h> /* for STICKY_T     26 #include <linux/personality.h> /* for STICKY_TIMEOUTS */
 27 #include <linux/file.h>                            27 #include <linux/file.h>
 28 #include <linux/fdtable.h>                         28 #include <linux/fdtable.h>
 29 #include <linux/fs.h>                              29 #include <linux/fs.h>
 30 #include <linux/rcupdate.h>                        30 #include <linux/rcupdate.h>
 31 #include <linux/hrtimer.h>                         31 #include <linux/hrtimer.h>
 32 #include <linux/freezer.h>                         32 #include <linux/freezer.h>
 33 #include <net/busy_poll.h>                         33 #include <net/busy_poll.h>
 34 #include <linux/vmalloc.h>                         34 #include <linux/vmalloc.h>
 35                                                    35 
 36 #include <linux/uaccess.h>                         36 #include <linux/uaccess.h>
 37                                                    37 
 38                                                    38 
 39 /*                                                 39 /*
 40  * Estimate expected accuracy in ns from a tim     40  * Estimate expected accuracy in ns from a timeval.
 41  *                                                 41  *
 42  * After quite a bit of churning around, we've     42  * After quite a bit of churning around, we've settled on
 43  * a simple thing of taking 0.1% of the timeou     43  * a simple thing of taking 0.1% of the timeout as the
 44  * slack, with a cap of 100 msec.                  44  * slack, with a cap of 100 msec.
 45  * "nice" tasks get a 0.5% slack instead.          45  * "nice" tasks get a 0.5% slack instead.
 46  *                                                 46  *
 47  * Consider this comment an open invitation to     47  * Consider this comment an open invitation to come up with even
 48  * better solutions..                              48  * better solutions..
 49  */                                                49  */
 50                                                    50 
 51 #define MAX_SLACK       (100 * NSEC_PER_MSEC)      51 #define MAX_SLACK       (100 * NSEC_PER_MSEC)
 52                                                    52 
 53 static long __estimate_accuracy(struct timespe     53 static long __estimate_accuracy(struct timespec64 *tv)
 54 {                                                  54 {
 55         long slack;                                55         long slack;
 56         int divfactor = 1000;                      56         int divfactor = 1000;
 57                                                    57 
 58         if (tv->tv_sec < 0)                        58         if (tv->tv_sec < 0)
 59                 return 0;                          59                 return 0;
 60                                                    60 
 61         if (task_nice(current) > 0)                61         if (task_nice(current) > 0)
 62                 divfactor = divfactor / 5;         62                 divfactor = divfactor / 5;
 63                                                    63 
 64         if (tv->tv_sec > MAX_SLACK / (NSEC_PER     64         if (tv->tv_sec > MAX_SLACK / (NSEC_PER_SEC/divfactor))
 65                 return MAX_SLACK;                  65                 return MAX_SLACK;
 66                                                    66 
 67         slack = tv->tv_nsec / divfactor;           67         slack = tv->tv_nsec / divfactor;
 68         slack += tv->tv_sec * (NSEC_PER_SEC/di     68         slack += tv->tv_sec * (NSEC_PER_SEC/divfactor);
 69                                                    69 
 70         if (slack > MAX_SLACK)                     70         if (slack > MAX_SLACK)
 71                 return MAX_SLACK;                  71                 return MAX_SLACK;
 72                                                    72 
 73         return slack;                              73         return slack;
 74 }                                                  74 }
 75                                                    75 
 76 u64 select_estimate_accuracy(struct timespec64     76 u64 select_estimate_accuracy(struct timespec64 *tv)
 77 {                                                  77 {
 78         u64 ret;                                   78         u64 ret;
 79         struct timespec64 now;                     79         struct timespec64 now;
 80         u64 slack = current->timer_slack_ns;       80         u64 slack = current->timer_slack_ns;
 81                                                    81 
 82         if (slack == 0)                            82         if (slack == 0)
 83                 return 0;                          83                 return 0;
 84                                                    84 
 85         ktime_get_ts64(&now);                      85         ktime_get_ts64(&now);
 86         now = timespec64_sub(*tv, now);            86         now = timespec64_sub(*tv, now);
 87         ret = __estimate_accuracy(&now);           87         ret = __estimate_accuracy(&now);
 88         if (ret < slack)                           88         if (ret < slack)
 89                 return slack;                      89                 return slack;
 90         return ret;                                90         return ret;
 91 }                                                  91 }
 92                                                    92 
 93                                                    93 
 94                                                    94 
 95 struct poll_table_page {                           95 struct poll_table_page {
 96         struct poll_table_page * next;             96         struct poll_table_page * next;
 97         struct poll_table_entry * entry;           97         struct poll_table_entry * entry;
 98         struct poll_table_entry entries[];         98         struct poll_table_entry entries[];
 99 };                                                 99 };
100                                                   100 
101 #define POLL_TABLE_FULL(table) \                  101 #define POLL_TABLE_FULL(table) \
102         ((unsigned long)((table)->entry+1) > P    102         ((unsigned long)((table)->entry+1) > PAGE_SIZE + (unsigned long)(table))
103                                                   103 
104 /*                                                104 /*
105  * Ok, Peter made a complicated, but straightf    105  * Ok, Peter made a complicated, but straightforward multiple_wait() function.
106  * I have rewritten this, taking some shortcut    106  * I have rewritten this, taking some shortcuts: This code may not be easy to
107  * follow, but it should be free of race-condi    107  * follow, but it should be free of race-conditions, and it's practical. If you
108  * understand what I'm doing here, then you un    108  * understand what I'm doing here, then you understand how the linux
109  * sleep/wakeup mechanism works.                  109  * sleep/wakeup mechanism works.
110  *                                                110  *
111  * Two very simple procedures, poll_wait() and    111  * Two very simple procedures, poll_wait() and poll_freewait() make all the
112  * work.  poll_wait() is an inline-function de    112  * work.  poll_wait() is an inline-function defined in <linux/poll.h>,
113  * as all select/poll functions have to call i    113  * as all select/poll functions have to call it to add an entry to the
114  * poll table.                                    114  * poll table.
115  */                                               115  */
116 static void __pollwait(struct file *filp, wait    116 static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,
117                        poll_table *p);            117                        poll_table *p);
118                                                   118 
119 void poll_initwait(struct poll_wqueues *pwq)      119 void poll_initwait(struct poll_wqueues *pwq)
120 {                                                 120 {
121         init_poll_funcptr(&pwq->pt, __pollwait    121         init_poll_funcptr(&pwq->pt, __pollwait);
122         pwq->polling_task = current;              122         pwq->polling_task = current;
123         pwq->triggered = 0;                       123         pwq->triggered = 0;
124         pwq->error = 0;                           124         pwq->error = 0;
125         pwq->table = NULL;                        125         pwq->table = NULL;
126         pwq->inline_index = 0;                    126         pwq->inline_index = 0;
127 }                                                 127 }
128 EXPORT_SYMBOL(poll_initwait);                     128 EXPORT_SYMBOL(poll_initwait);
129                                                   129 
130 static void free_poll_entry(struct poll_table_    130 static void free_poll_entry(struct poll_table_entry *entry)
131 {                                                 131 {
132         remove_wait_queue(entry->wait_address,    132         remove_wait_queue(entry->wait_address, &entry->wait);
133         fput(entry->filp);                        133         fput(entry->filp);
134 }                                                 134 }
135                                                   135 
136 void poll_freewait(struct poll_wqueues *pwq)      136 void poll_freewait(struct poll_wqueues *pwq)
137 {                                                 137 {
138         struct poll_table_page * p = pwq->tabl    138         struct poll_table_page * p = pwq->table;
139         int i;                                    139         int i;
140         for (i = 0; i < pwq->inline_index; i++    140         for (i = 0; i < pwq->inline_index; i++)
141                 free_poll_entry(pwq->inline_en    141                 free_poll_entry(pwq->inline_entries + i);
142         while (p) {                               142         while (p) {
143                 struct poll_table_entry * entr    143                 struct poll_table_entry * entry;
144                 struct poll_table_page *old;      144                 struct poll_table_page *old;
145                                                   145 
146                 entry = p->entry;                 146                 entry = p->entry;
147                 do {                              147                 do {
148                         entry--;                  148                         entry--;
149                         free_poll_entry(entry)    149                         free_poll_entry(entry);
150                 } while (entry > p->entries);     150                 } while (entry > p->entries);
151                 old = p;                          151                 old = p;
152                 p = p->next;                      152                 p = p->next;
153                 free_page((unsigned long) old)    153                 free_page((unsigned long) old);
154         }                                         154         }
155 }                                                 155 }
156 EXPORT_SYMBOL(poll_freewait);                     156 EXPORT_SYMBOL(poll_freewait);
157                                                   157 
158 static struct poll_table_entry *poll_get_entry    158 static struct poll_table_entry *poll_get_entry(struct poll_wqueues *p)
159 {                                                 159 {
160         struct poll_table_page *table = p->tab    160         struct poll_table_page *table = p->table;
161                                                   161 
162         if (p->inline_index < N_INLINE_POLL_EN    162         if (p->inline_index < N_INLINE_POLL_ENTRIES)
163                 return p->inline_entries + p->    163                 return p->inline_entries + p->inline_index++;
164                                                   164 
165         if (!table || POLL_TABLE_FULL(table))     165         if (!table || POLL_TABLE_FULL(table)) {
166                 struct poll_table_page *new_ta    166                 struct poll_table_page *new_table;
167                                                   167 
168                 new_table = (struct poll_table    168                 new_table = (struct poll_table_page *) __get_free_page(GFP_KERNEL);
169                 if (!new_table) {                 169                 if (!new_table) {
170                         p->error = -ENOMEM;       170                         p->error = -ENOMEM;
171                         return NULL;              171                         return NULL;
172                 }                                 172                 }
173                 new_table->entry = new_table->    173                 new_table->entry = new_table->entries;
174                 new_table->next = table;          174                 new_table->next = table;
175                 p->table = new_table;             175                 p->table = new_table;
176                 table = new_table;                176                 table = new_table;
177         }                                         177         }
178                                                   178 
179         return table->entry++;                    179         return table->entry++;
180 }                                                 180 }
181                                                   181 
182 static int __pollwake(wait_queue_entry_t *wait    182 static int __pollwake(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
183 {                                                 183 {
184         struct poll_wqueues *pwq = wait->priva    184         struct poll_wqueues *pwq = wait->private;
185         DECLARE_WAITQUEUE(dummy_wait, pwq->pol    185         DECLARE_WAITQUEUE(dummy_wait, pwq->polling_task);
186                                                   186 
187         /*                                        187         /*
188          * Although this function is called un    188          * Although this function is called under waitqueue lock, LOCK
189          * doesn't imply write barrier and the    189          * doesn't imply write barrier and the users expect write
190          * barrier semantics on wakeup functio    190          * barrier semantics on wakeup functions.  The following
191          * smp_wmb() is equivalent to smp_wmb(    191          * smp_wmb() is equivalent to smp_wmb() in try_to_wake_up()
192          * and is paired with smp_store_mb() i    192          * and is paired with smp_store_mb() in poll_schedule_timeout.
193          */                                       193          */
194         smp_wmb();                                194         smp_wmb();
195         pwq->triggered = 1;                       195         pwq->triggered = 1;
196                                                   196 
197         /*                                        197         /*
198          * Perform the default wake up operati    198          * Perform the default wake up operation using a dummy
199          * waitqueue.                             199          * waitqueue.
200          *                                        200          *
201          * TODO: This is hacky but there curre    201          * TODO: This is hacky but there currently is no interface to
202          * pass in @sync.  @sync is scheduled     202          * pass in @sync.  @sync is scheduled to be removed and once
203          * that happens, wake_up_process() can    203          * that happens, wake_up_process() can be used directly.
204          */                                       204          */
205         return default_wake_function(&dummy_wa    205         return default_wake_function(&dummy_wait, mode, sync, key);
206 }                                                 206 }
207                                                   207 
208 static int pollwake(wait_queue_entry_t *wait,     208 static int pollwake(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
209 {                                                 209 {
210         struct poll_table_entry *entry;           210         struct poll_table_entry *entry;
211                                                   211 
212         entry = container_of(wait, struct poll    212         entry = container_of(wait, struct poll_table_entry, wait);
213         if (key && !(key_to_poll(key) & entry-    213         if (key && !(key_to_poll(key) & entry->key))
214                 return 0;                         214                 return 0;
215         return __pollwake(wait, mode, sync, ke    215         return __pollwake(wait, mode, sync, key);
216 }                                                 216 }
217                                                   217 
218 /* Add a new entry */                             218 /* Add a new entry */
219 static void __pollwait(struct file *filp, wait    219 static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,
220                                 poll_table *p)    220                                 poll_table *p)
221 {                                                 221 {
222         struct poll_wqueues *pwq = container_o    222         struct poll_wqueues *pwq = container_of(p, struct poll_wqueues, pt);
223         struct poll_table_entry *entry = poll_    223         struct poll_table_entry *entry = poll_get_entry(pwq);
224         if (!entry)                               224         if (!entry)
225                 return;                           225                 return;
226         entry->filp = get_file(filp);             226         entry->filp = get_file(filp);
227         entry->wait_address = wait_address;       227         entry->wait_address = wait_address;
228         entry->key = p->_key;                     228         entry->key = p->_key;
229         init_waitqueue_func_entry(&entry->wait    229         init_waitqueue_func_entry(&entry->wait, pollwake);
230         entry->wait.private = pwq;                230         entry->wait.private = pwq;
231         add_wait_queue(wait_address, &entry->w    231         add_wait_queue(wait_address, &entry->wait);
232 }                                                 232 }
233                                                   233 
234 static int poll_schedule_timeout(struct poll_w    234 static int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
235                           ktime_t *expires, un    235                           ktime_t *expires, unsigned long slack)
236 {                                                 236 {
237         int rc = -EINTR;                          237         int rc = -EINTR;
238                                                   238 
239         set_current_state(state);                 239         set_current_state(state);
240         if (!pwq->triggered)                      240         if (!pwq->triggered)
241                 rc = schedule_hrtimeout_range(    241                 rc = schedule_hrtimeout_range(expires, slack, HRTIMER_MODE_ABS);
242         __set_current_state(TASK_RUNNING);        242         __set_current_state(TASK_RUNNING);
243                                                   243 
244         /*                                        244         /*
245          * Prepare for the next iteration.        245          * Prepare for the next iteration.
246          *                                        246          *
247          * The following smp_store_mb() serves    247          * The following smp_store_mb() serves two purposes.  First, it's
248          * the counterpart rmb of the wmb in p    248          * the counterpart rmb of the wmb in pollwake() such that data
249          * written before wake up is always vi    249          * written before wake up is always visible after wake up.
250          * Second, the full barrier guarantees    250          * Second, the full barrier guarantees that triggered clearing
251          * doesn't pass event check of the nex    251          * doesn't pass event check of the next iteration.  Note that
252          * this problem doesn't exist for the     252          * this problem doesn't exist for the first iteration as
253          * add_wait_queue() has full barrier s    253          * add_wait_queue() has full barrier semantics.
254          */                                       254          */
255         smp_store_mb(pwq->triggered, 0);          255         smp_store_mb(pwq->triggered, 0);
256                                                   256 
257         return rc;                                257         return rc;
258 }                                                 258 }
259                                                   259 
260 /**                                               260 /**
261  * poll_select_set_timeout - helper function t    261  * poll_select_set_timeout - helper function to setup the timeout value
262  * @to:         pointer to timespec64 variable    262  * @to:         pointer to timespec64 variable for the final timeout
263  * @sec:        seconds (from user space)         263  * @sec:        seconds (from user space)
264  * @nsec:       nanoseconds (from user space)     264  * @nsec:       nanoseconds (from user space)
265  *                                                265  *
266  * Note, we do not use a timespec for the user    266  * Note, we do not use a timespec for the user space value here, That
267  * way we can use the function for timeval and    267  * way we can use the function for timeval and compat interfaces as well.
268  *                                                268  *
269  * Returns -EINVAL if sec/nsec are not normali    269  * Returns -EINVAL if sec/nsec are not normalized. Otherwise 0.
270  */                                               270  */
271 int poll_select_set_timeout(struct timespec64     271 int poll_select_set_timeout(struct timespec64 *to, time64_t sec, long nsec)
272 {                                                 272 {
273         struct timespec64 ts = {.tv_sec = sec,    273         struct timespec64 ts = {.tv_sec = sec, .tv_nsec = nsec};
274                                                   274 
275         if (!timespec64_valid(&ts))               275         if (!timespec64_valid(&ts))
276                 return -EINVAL;                   276                 return -EINVAL;
277                                                   277 
278         /* Optimize for the zero timeout value    278         /* Optimize for the zero timeout value here */
279         if (!sec && !nsec) {                      279         if (!sec && !nsec) {
280                 to->tv_sec = to->tv_nsec = 0;     280                 to->tv_sec = to->tv_nsec = 0;
281         } else {                                  281         } else {
282                 ktime_get_ts64(to);               282                 ktime_get_ts64(to);
283                 *to = timespec64_add_safe(*to,    283                 *to = timespec64_add_safe(*to, ts);
284         }                                         284         }
285         return 0;                                 285         return 0;
286 }                                                 286 }
287                                                   287 
288 enum poll_time_type {                             288 enum poll_time_type {
289         PT_TIMEVAL = 0,                           289         PT_TIMEVAL = 0,
290         PT_OLD_TIMEVAL = 1,                       290         PT_OLD_TIMEVAL = 1,
291         PT_TIMESPEC = 2,                          291         PT_TIMESPEC = 2,
292         PT_OLD_TIMESPEC = 3,                      292         PT_OLD_TIMESPEC = 3,
293 };                                                293 };
294                                                   294 
295 static int poll_select_finish(struct timespec6    295 static int poll_select_finish(struct timespec64 *end_time,
296                               void __user *p,     296                               void __user *p,
297                               enum poll_time_t    297                               enum poll_time_type pt_type, int ret)
298 {                                                 298 {
299         struct timespec64 rts;                    299         struct timespec64 rts;
300                                                   300 
301         restore_saved_sigmask_unless(ret == -E    301         restore_saved_sigmask_unless(ret == -ERESTARTNOHAND);
302                                                   302 
303         if (!p)                                   303         if (!p)
304                 return ret;                       304                 return ret;
305                                                   305 
306         if (current->personality & STICKY_TIME    306         if (current->personality & STICKY_TIMEOUTS)
307                 goto sticky;                      307                 goto sticky;
308                                                   308 
309         /* No update for zero timeout */          309         /* No update for zero timeout */
310         if (!end_time->tv_sec && !end_time->tv    310         if (!end_time->tv_sec && !end_time->tv_nsec)
311                 return ret;                       311                 return ret;
312                                                   312 
313         ktime_get_ts64(&rts);                     313         ktime_get_ts64(&rts);
314         rts = timespec64_sub(*end_time, rts);     314         rts = timespec64_sub(*end_time, rts);
315         if (rts.tv_sec < 0)                       315         if (rts.tv_sec < 0)
316                 rts.tv_sec = rts.tv_nsec = 0;     316                 rts.tv_sec = rts.tv_nsec = 0;
317                                                   317 
318                                                   318 
319         switch (pt_type) {                        319         switch (pt_type) {
320         case PT_TIMEVAL:                          320         case PT_TIMEVAL:
321                 {                                 321                 {
322                         struct __kernel_old_ti    322                         struct __kernel_old_timeval rtv;
323                                                   323 
324                         if (sizeof(rtv) > size    324                         if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec))
325                                 memset(&rtv, 0    325                                 memset(&rtv, 0, sizeof(rtv));
326                         rtv.tv_sec = rts.tv_se    326                         rtv.tv_sec = rts.tv_sec;
327                         rtv.tv_usec = rts.tv_n    327                         rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC;
328                         if (!copy_to_user(p, &    328                         if (!copy_to_user(p, &rtv, sizeof(rtv)))
329                                 return ret;       329                                 return ret;
330                 }                                 330                 }
331                 break;                            331                 break;
332         case PT_OLD_TIMEVAL:                      332         case PT_OLD_TIMEVAL:
333                 {                                 333                 {
334                         struct old_timeval32 r    334                         struct old_timeval32 rtv;
335                                                   335 
336                         rtv.tv_sec = rts.tv_se    336                         rtv.tv_sec = rts.tv_sec;
337                         rtv.tv_usec = rts.tv_n    337                         rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC;
338                         if (!copy_to_user(p, &    338                         if (!copy_to_user(p, &rtv, sizeof(rtv)))
339                                 return ret;       339                                 return ret;
340                 }                                 340                 }
341                 break;                            341                 break;
342         case PT_TIMESPEC:                         342         case PT_TIMESPEC:
343                 if (!put_timespec64(&rts, p))     343                 if (!put_timespec64(&rts, p))
344                         return ret;               344                         return ret;
345                 break;                            345                 break;
346         case PT_OLD_TIMESPEC:                     346         case PT_OLD_TIMESPEC:
347                 if (!put_old_timespec32(&rts,     347                 if (!put_old_timespec32(&rts, p))
348                         return ret;               348                         return ret;
349                 break;                            349                 break;
350         default:                                  350         default:
351                 BUG();                            351                 BUG();
352         }                                         352         }
353         /*                                        353         /*
354          * If an application puts its timeval     354          * If an application puts its timeval in read-only memory, we
355          * don't want the Linux-specific updat    355          * don't want the Linux-specific update to the timeval to
356          * cause a fault after the select has     356          * cause a fault after the select has completed
357          * successfully. However, because we'r    357          * successfully. However, because we're not updating the
358          * timeval, we can't restart the syste    358          * timeval, we can't restart the system call.
359          */                                       359          */
360                                                   360 
361 sticky:                                           361 sticky:
362         if (ret == -ERESTARTNOHAND)               362         if (ret == -ERESTARTNOHAND)
363                 ret = -EINTR;                     363                 ret = -EINTR;
364         return ret;                               364         return ret;
365 }                                                 365 }
366                                                   366 
367 /*                                                367 /*
368  * Scalable version of the fd_set.                368  * Scalable version of the fd_set.
369  */                                               369  */
370                                                   370 
371 typedef struct {                                  371 typedef struct {
372         unsigned long *in, *out, *ex;             372         unsigned long *in, *out, *ex;
373         unsigned long *res_in, *res_out, *res_    373         unsigned long *res_in, *res_out, *res_ex;
374 } fd_set_bits;                                    374 } fd_set_bits;
375                                                   375 
376 /*                                                376 /*
377  * How many longwords for "nr" bits?              377  * How many longwords for "nr" bits?
378  */                                               378  */
379 #define FDS_BITPERLONG  (8*sizeof(long))          379 #define FDS_BITPERLONG  (8*sizeof(long))
380 #define FDS_LONGS(nr)   (((nr)+FDS_BITPERLONG-    380 #define FDS_LONGS(nr)   (((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG)
381 #define FDS_BYTES(nr)   (FDS_LONGS(nr)*sizeof(    381 #define FDS_BYTES(nr)   (FDS_LONGS(nr)*sizeof(long))
382                                                   382 
383 /*                                                383 /*
384  * Use "unsigned long" accesses to let user-mo    384  * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
385  */                                               385  */
386 static inline                                     386 static inline
387 int get_fd_set(unsigned long nr, void __user *    387 int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
388 {                                                 388 {
389         nr = FDS_BYTES(nr);                       389         nr = FDS_BYTES(nr);
390         if (ufdset)                               390         if (ufdset)
391                 return copy_from_user(fdset, u    391                 return copy_from_user(fdset, ufdset, nr) ? -EFAULT : 0;
392                                                   392 
393         memset(fdset, 0, nr);                     393         memset(fdset, 0, nr);
394         return 0;                                 394         return 0;
395 }                                                 395 }
396                                                   396 
397 static inline unsigned long __must_check          397 static inline unsigned long __must_check
398 set_fd_set(unsigned long nr, void __user *ufds    398 set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
399 {                                                 399 {
400         if (ufdset)                               400         if (ufdset)
401                 return __copy_to_user(ufdset,     401                 return __copy_to_user(ufdset, fdset, FDS_BYTES(nr));
402         return 0;                                 402         return 0;
403 }                                                 403 }
404                                                   404 
405 static inline                                     405 static inline
406 void zero_fd_set(unsigned long nr, unsigned lo    406 void zero_fd_set(unsigned long nr, unsigned long *fdset)
407 {                                                 407 {
408         memset(fdset, 0, FDS_BYTES(nr));          408         memset(fdset, 0, FDS_BYTES(nr));
409 }                                                 409 }
410                                                   410 
411 #define FDS_IN(fds, n)          (fds->in + n)     411 #define FDS_IN(fds, n)          (fds->in + n)
412 #define FDS_OUT(fds, n)         (fds->out + n)    412 #define FDS_OUT(fds, n)         (fds->out + n)
413 #define FDS_EX(fds, n)          (fds->ex + n)     413 #define FDS_EX(fds, n)          (fds->ex + n)
414                                                   414 
415 #define BITS(fds, n)    (*FDS_IN(fds, n)|*FDS_    415 #define BITS(fds, n)    (*FDS_IN(fds, n)|*FDS_OUT(fds, n)|*FDS_EX(fds, n))
416                                                   416 
417 static int max_select_fd(unsigned long n, fd_s    417 static int max_select_fd(unsigned long n, fd_set_bits *fds)
418 {                                                 418 {
419         unsigned long *open_fds;                  419         unsigned long *open_fds;
420         unsigned long set;                        420         unsigned long set;
421         int max;                                  421         int max;
422         struct fdtable *fdt;                      422         struct fdtable *fdt;
423                                                   423 
424         /* handle last in-complete long-word f    424         /* handle last in-complete long-word first */
425         set = ~(~0UL << (n & (BITS_PER_LONG-1)    425         set = ~(~0UL << (n & (BITS_PER_LONG-1)));
426         n /= BITS_PER_LONG;                       426         n /= BITS_PER_LONG;
427         fdt = files_fdtable(current->files);      427         fdt = files_fdtable(current->files);
428         open_fds = fdt->open_fds + n;             428         open_fds = fdt->open_fds + n;
429         max = 0;                                  429         max = 0;
430         if (set) {                                430         if (set) {
431                 set &= BITS(fds, n);              431                 set &= BITS(fds, n);
432                 if (set) {                        432                 if (set) {
433                         if (!(set & ~*open_fds    433                         if (!(set & ~*open_fds))
434                                 goto get_max;     434                                 goto get_max;
435                         return -EBADF;            435                         return -EBADF;
436                 }                                 436                 }
437         }                                         437         }
438         while (n) {                               438         while (n) {
439                 open_fds--;                       439                 open_fds--;
440                 n--;                              440                 n--;
441                 set = BITS(fds, n);               441                 set = BITS(fds, n);
442                 if (!set)                         442                 if (!set)
443                         continue;                 443                         continue;
444                 if (set & ~*open_fds)             444                 if (set & ~*open_fds)
445                         return -EBADF;            445                         return -EBADF;
446                 if (max)                          446                 if (max)
447                         continue;                 447                         continue;
448 get_max:                                          448 get_max:
449                 do {                              449                 do {
450                         max++;                    450                         max++;
451                         set >>= 1;                451                         set >>= 1;
452                 } while (set);                    452                 } while (set);
453                 max += n * BITS_PER_LONG;         453                 max += n * BITS_PER_LONG;
454         }                                         454         }
455                                                   455 
456         return max;                               456         return max;
457 }                                                 457 }
458                                                   458 
459 #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND     459 #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | EPOLLHUP | EPOLLERR |\
460                         EPOLLNVAL)                460                         EPOLLNVAL)
461 #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM    461 #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT | EPOLLERR |\
462                          EPOLLNVAL)               462                          EPOLLNVAL)
463 #define POLLEX_SET (EPOLLPRI | EPOLLNVAL)         463 #define POLLEX_SET (EPOLLPRI | EPOLLNVAL)
464                                                   464 
465 static inline void wait_key_set(poll_table *wa    465 static inline void wait_key_set(poll_table *wait, unsigned long in,
466                                 unsigned long     466                                 unsigned long out, unsigned long bit,
467                                 __poll_t ll_fl    467                                 __poll_t ll_flag)
468 {                                                 468 {
469         wait->_key = POLLEX_SET | ll_flag;        469         wait->_key = POLLEX_SET | ll_flag;
470         if (in & bit)                             470         if (in & bit)
471                 wait->_key |= POLLIN_SET;         471                 wait->_key |= POLLIN_SET;
472         if (out & bit)                            472         if (out & bit)
473                 wait->_key |= POLLOUT_SET;        473                 wait->_key |= POLLOUT_SET;
474 }                                                 474 }
475                                                   475 
476 static noinline_for_stack int do_select(int n,    476 static noinline_for_stack int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
477 {                                                 477 {
478         ktime_t expire, *to = NULL;               478         ktime_t expire, *to = NULL;
479         struct poll_wqueues table;                479         struct poll_wqueues table;
480         poll_table *wait;                         480         poll_table *wait;
481         int retval, i, timed_out = 0;             481         int retval, i, timed_out = 0;
482         u64 slack = 0;                            482         u64 slack = 0;
483         __poll_t busy_flag = net_busy_loop_on(    483         __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
484         unsigned long busy_start = 0;             484         unsigned long busy_start = 0;
485                                                   485 
486         rcu_read_lock();                          486         rcu_read_lock();
487         retval = max_select_fd(n, fds);           487         retval = max_select_fd(n, fds);
488         rcu_read_unlock();                        488         rcu_read_unlock();
489                                                   489 
490         if (retval < 0)                           490         if (retval < 0)
491                 return retval;                    491                 return retval;
492         n = retval;                               492         n = retval;
493                                                   493 
494         poll_initwait(&table);                    494         poll_initwait(&table);
495         wait = &table.pt;                         495         wait = &table.pt;
496         if (end_time && !end_time->tv_sec && !    496         if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
497                 wait->_qproc = NULL;              497                 wait->_qproc = NULL;
498                 timed_out = 1;                    498                 timed_out = 1;
499         }                                         499         }
500                                                   500 
501         if (end_time && !timed_out)               501         if (end_time && !timed_out)
502                 slack = select_estimate_accura    502                 slack = select_estimate_accuracy(end_time);
503                                                   503 
504         retval = 0;                               504         retval = 0;
505         for (;;) {                                505         for (;;) {
506                 unsigned long *rinp, *routp, *    506                 unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;
507                 bool can_busy_loop = false;       507                 bool can_busy_loop = false;
508                                                   508 
509                 inp = fds->in; outp = fds->out    509                 inp = fds->in; outp = fds->out; exp = fds->ex;
510                 rinp = fds->res_in; routp = fd    510                 rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;
511                                                   511 
512                 for (i = 0; i < n; ++rinp, ++r    512                 for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
513                         unsigned long in, out,    513                         unsigned long in, out, ex, all_bits, bit = 1, j;
514                         unsigned long res_in =    514                         unsigned long res_in = 0, res_out = 0, res_ex = 0;
515                         __poll_t mask;            515                         __poll_t mask;
516                                                   516 
517                         in = *inp++; out = *ou    517                         in = *inp++; out = *outp++; ex = *exp++;
518                         all_bits = in | out |     518                         all_bits = in | out | ex;
519                         if (all_bits == 0) {      519                         if (all_bits == 0) {
520                                 i += BITS_PER_    520                                 i += BITS_PER_LONG;
521                                 continue;         521                                 continue;
522                         }                         522                         }
523                                                   523 
524                         for (j = 0; j < BITS_P    524                         for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) {
525                                 struct fd f;      525                                 struct fd f;
526                                 if (i >= n)       526                                 if (i >= n)
527                                         break;    527                                         break;
528                                 if (!(bit & al    528                                 if (!(bit & all_bits))
529                                         contin    529                                         continue;
530                                 mask = EPOLLNV    530                                 mask = EPOLLNVAL;
531                                 f = fdget(i);     531                                 f = fdget(i);
532                                 if (fd_file(f)    532                                 if (fd_file(f)) {
533                                         wait_k    533                                         wait_key_set(wait, in, out, bit,
534                                                   534                                                      busy_flag);
535                                         mask =    535                                         mask = vfs_poll(fd_file(f), wait);
536                                                   536 
537                                         fdput(    537                                         fdput(f);
538                                 }                 538                                 }
539                                 if ((mask & PO    539                                 if ((mask & POLLIN_SET) && (in & bit)) {
540                                         res_in    540                                         res_in |= bit;
541                                         retval    541                                         retval++;
542                                         wait->    542                                         wait->_qproc = NULL;
543                                 }                 543                                 }
544                                 if ((mask & PO    544                                 if ((mask & POLLOUT_SET) && (out & bit)) {
545                                         res_ou    545                                         res_out |= bit;
546                                         retval    546                                         retval++;
547                                         wait->    547                                         wait->_qproc = NULL;
548                                 }                 548                                 }
549                                 if ((mask & PO    549                                 if ((mask & POLLEX_SET) && (ex & bit)) {
550                                         res_ex    550                                         res_ex |= bit;
551                                         retval    551                                         retval++;
552                                         wait->    552                                         wait->_qproc = NULL;
553                                 }                 553                                 }
554                                 /* got somethi    554                                 /* got something, stop busy polling */
555                                 if (retval) {     555                                 if (retval) {
556                                         can_bu    556                                         can_busy_loop = false;
557                                         busy_f    557                                         busy_flag = 0;
558                                                   558 
559                                 /*                559                                 /*
560                                  * only rememb    560                                  * only remember a returned
561                                  * POLL_BUSY_L    561                                  * POLL_BUSY_LOOP if we asked for it
562                                  */               562                                  */
563                                 } else if (bus    563                                 } else if (busy_flag & mask)
564                                         can_bu    564                                         can_busy_loop = true;
565                                                   565 
566                         }                         566                         }
567                         if (res_in)               567                         if (res_in)
568                                 *rinp = res_in    568                                 *rinp = res_in;
569                         if (res_out)              569                         if (res_out)
570                                 *routp = res_o    570                                 *routp = res_out;
571                         if (res_ex)               571                         if (res_ex)
572                                 *rexp = res_ex    572                                 *rexp = res_ex;
573                         cond_resched();           573                         cond_resched();
574                 }                                 574                 }
575                 wait->_qproc = NULL;              575                 wait->_qproc = NULL;
576                 if (retval || timed_out || sig    576                 if (retval || timed_out || signal_pending(current))
577                         break;                    577                         break;
578                 if (table.error) {                578                 if (table.error) {
579                         retval = table.error;     579                         retval = table.error;
580                         break;                    580                         break;
581                 }                                 581                 }
582                                                   582 
583                 /* only if found POLL_BUSY_LOO    583                 /* only if found POLL_BUSY_LOOP sockets && not out of time */
584                 if (can_busy_loop && !need_res    584                 if (can_busy_loop && !need_resched()) {
585                         if (!busy_start) {        585                         if (!busy_start) {
586                                 busy_start = b    586                                 busy_start = busy_loop_current_time();
587                                 continue;         587                                 continue;
588                         }                         588                         }
589                         if (!busy_loop_timeout    589                         if (!busy_loop_timeout(busy_start))
590                                 continue;         590                                 continue;
591                 }                                 591                 }
592                 busy_flag = 0;                    592                 busy_flag = 0;
593                                                   593 
594                 /*                                594                 /*
595                  * If this is the first loop a    595                  * If this is the first loop and we have a timeout
596                  * given, then we convert to k    596                  * given, then we convert to ktime_t and set the to
597                  * pointer to the expiry value    597                  * pointer to the expiry value.
598                  */                               598                  */
599                 if (end_time && !to) {            599                 if (end_time && !to) {
600                         expire = timespec64_to    600                         expire = timespec64_to_ktime(*end_time);
601                         to = &expire;             601                         to = &expire;
602                 }                                 602                 }
603                                                   603 
604                 if (!poll_schedule_timeout(&ta    604                 if (!poll_schedule_timeout(&table, TASK_INTERRUPTIBLE,
605                                            to,    605                                            to, slack))
606                         timed_out = 1;            606                         timed_out = 1;
607         }                                         607         }
608                                                   608 
609         poll_freewait(&table);                    609         poll_freewait(&table);
610                                                   610 
611         return retval;                            611         return retval;
612 }                                                 612 }
613                                                   613 
614 /*                                                614 /*
615  * We can actually return ERESTARTSYS instead     615  * We can actually return ERESTARTSYS instead of EINTR, but I'd
616  * like to be certain this leads to no problem    616  * like to be certain this leads to no problems. So I return
617  * EINTR just for safety.                         617  * EINTR just for safety.
618  *                                                618  *
619  * Update: ERESTARTSYS breaks at least the xvi    619  * Update: ERESTARTSYS breaks at least the xview clock binary, so
620  * I'm trying ERESTARTNOHAND which restart onl    620  * I'm trying ERESTARTNOHAND which restart only when you want to.
621  */                                               621  */
622 int core_sys_select(int n, fd_set __user *inp,    622 int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
623                            fd_set __user *exp,    623                            fd_set __user *exp, struct timespec64 *end_time)
624 {                                                 624 {
625         fd_set_bits fds;                          625         fd_set_bits fds;
626         void *bits;                               626         void *bits;
627         int ret, max_fds;                         627         int ret, max_fds;
628         size_t size, alloc_size;                  628         size_t size, alloc_size;
629         struct fdtable *fdt;                      629         struct fdtable *fdt;
630         /* Allocate small arguments on the sta    630         /* Allocate small arguments on the stack to save memory and be faster */
631         long stack_fds[SELECT_STACK_ALLOC/size    631         long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
632                                                   632 
633         ret = -EINVAL;                            633         ret = -EINVAL;
634         if (n < 0)                                634         if (n < 0)
635                 goto out_nofds;                   635                 goto out_nofds;
636                                                   636 
637         /* max_fds can increase, so grab it on    637         /* max_fds can increase, so grab it once to avoid race */
638         rcu_read_lock();                          638         rcu_read_lock();
639         fdt = files_fdtable(current->files);      639         fdt = files_fdtable(current->files);
640         max_fds = fdt->max_fds;                   640         max_fds = fdt->max_fds;
641         rcu_read_unlock();                        641         rcu_read_unlock();
642         if (n > max_fds)                          642         if (n > max_fds)
643                 n = max_fds;                      643                 n = max_fds;
644                                                   644 
645         /*                                        645         /*
646          * We need 6 bitmaps (in/out/ex for bo    646          * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
647          * since we used fdset we need to allo    647          * since we used fdset we need to allocate memory in units of
648          * long-words.                            648          * long-words. 
649          */                                       649          */
650         size = FDS_BYTES(n);                      650         size = FDS_BYTES(n);
651         bits = stack_fds;                         651         bits = stack_fds;
652         if (size > sizeof(stack_fds) / 6) {       652         if (size > sizeof(stack_fds) / 6) {
653                 /* Not enough space in on-stac    653                 /* Not enough space in on-stack array; must use kmalloc */
654                 ret = -ENOMEM;                    654                 ret = -ENOMEM;
655                 if (size > (SIZE_MAX / 6))        655                 if (size > (SIZE_MAX / 6))
656                         goto out_nofds;           656                         goto out_nofds;
657                                                   657 
658                 alloc_size = 6 * size;            658                 alloc_size = 6 * size;
659                 bits = kvmalloc(alloc_size, GF    659                 bits = kvmalloc(alloc_size, GFP_KERNEL);
660                 if (!bits)                        660                 if (!bits)
661                         goto out_nofds;           661                         goto out_nofds;
662         }                                         662         }
663         fds.in      = bits;                       663         fds.in      = bits;
664         fds.out     = bits +   size;              664         fds.out     = bits +   size;
665         fds.ex      = bits + 2*size;              665         fds.ex      = bits + 2*size;
666         fds.res_in  = bits + 3*size;              666         fds.res_in  = bits + 3*size;
667         fds.res_out = bits + 4*size;              667         fds.res_out = bits + 4*size;
668         fds.res_ex  = bits + 5*size;              668         fds.res_ex  = bits + 5*size;
669                                                   669 
670         if ((ret = get_fd_set(n, inp, fds.in))    670         if ((ret = get_fd_set(n, inp, fds.in)) ||
671             (ret = get_fd_set(n, outp, fds.out    671             (ret = get_fd_set(n, outp, fds.out)) ||
672             (ret = get_fd_set(n, exp, fds.ex))    672             (ret = get_fd_set(n, exp, fds.ex)))
673                 goto out;                         673                 goto out;
674         zero_fd_set(n, fds.res_in);               674         zero_fd_set(n, fds.res_in);
675         zero_fd_set(n, fds.res_out);              675         zero_fd_set(n, fds.res_out);
676         zero_fd_set(n, fds.res_ex);               676         zero_fd_set(n, fds.res_ex);
677                                                   677 
678         ret = do_select(n, &fds, end_time);       678         ret = do_select(n, &fds, end_time);
679                                                   679 
680         if (ret < 0)                              680         if (ret < 0)
681                 goto out;                         681                 goto out;
682         if (!ret) {                               682         if (!ret) {
683                 ret = -ERESTARTNOHAND;            683                 ret = -ERESTARTNOHAND;
684                 if (signal_pending(current))      684                 if (signal_pending(current))
685                         goto out;                 685                         goto out;
686                 ret = 0;                          686                 ret = 0;
687         }                                         687         }
688                                                   688 
689         if (set_fd_set(n, inp, fds.res_in) ||     689         if (set_fd_set(n, inp, fds.res_in) ||
690             set_fd_set(n, outp, fds.res_out) |    690             set_fd_set(n, outp, fds.res_out) ||
691             set_fd_set(n, exp, fds.res_ex))       691             set_fd_set(n, exp, fds.res_ex))
692                 ret = -EFAULT;                    692                 ret = -EFAULT;
693                                                   693 
694 out:                                              694 out:
695         if (bits != stack_fds)                    695         if (bits != stack_fds)
696                 kvfree(bits);                     696                 kvfree(bits);
697 out_nofds:                                        697 out_nofds:
698         return ret;                               698         return ret;
699 }                                                 699 }
700                                                   700 
701 static int kern_select(int n, fd_set __user *i    701 static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
702                        fd_set __user *exp, str    702                        fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
703 {                                                 703 {
704         struct timespec64 end_time, *to = NULL    704         struct timespec64 end_time, *to = NULL;
705         struct __kernel_old_timeval tv;           705         struct __kernel_old_timeval tv;
706         int ret;                                  706         int ret;
707                                                   707 
708         if (tvp) {                                708         if (tvp) {
709                 if (copy_from_user(&tv, tvp, s    709                 if (copy_from_user(&tv, tvp, sizeof(tv)))
710                         return -EFAULT;           710                         return -EFAULT;
711                                                   711 
712                 to = &end_time;                   712                 to = &end_time;
713                 if (poll_select_set_timeout(to    713                 if (poll_select_set_timeout(to,
714                                 tv.tv_sec + (t    714                                 tv.tv_sec + (tv.tv_usec / USEC_PER_SEC),
715                                 (tv.tv_usec %     715                                 (tv.tv_usec % USEC_PER_SEC) * NSEC_PER_USEC))
716                         return -EINVAL;           716                         return -EINVAL;
717         }                                         717         }
718                                                   718 
719         ret = core_sys_select(n, inp, outp, ex    719         ret = core_sys_select(n, inp, outp, exp, to);
720         return poll_select_finish(&end_time, t    720         return poll_select_finish(&end_time, tvp, PT_TIMEVAL, ret);
721 }                                                 721 }
722                                                   722 
723 SYSCALL_DEFINE5(select, int, n, fd_set __user     723 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
724                 fd_set __user *, exp, struct _    724                 fd_set __user *, exp, struct __kernel_old_timeval __user *, tvp)
725 {                                                 725 {
726         return kern_select(n, inp, outp, exp,     726         return kern_select(n, inp, outp, exp, tvp);
727 }                                                 727 }
728                                                   728 
729 static long do_pselect(int n, fd_set __user *i    729 static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
730                        fd_set __user *exp, voi    730                        fd_set __user *exp, void __user *tsp,
731                        const sigset_t __user *    731                        const sigset_t __user *sigmask, size_t sigsetsize,
732                        enum poll_time_type typ    732                        enum poll_time_type type)
733 {                                                 733 {
734         struct timespec64 ts, end_time, *to =     734         struct timespec64 ts, end_time, *to = NULL;
735         int ret;                                  735         int ret;
736                                                   736 
737         if (tsp) {                                737         if (tsp) {
738                 switch (type) {                   738                 switch (type) {
739                 case PT_TIMESPEC:                 739                 case PT_TIMESPEC:
740                         if (get_timespec64(&ts    740                         if (get_timespec64(&ts, tsp))
741                                 return -EFAULT    741                                 return -EFAULT;
742                         break;                    742                         break;
743                 case PT_OLD_TIMESPEC:             743                 case PT_OLD_TIMESPEC:
744                         if (get_old_timespec32    744                         if (get_old_timespec32(&ts, tsp))
745                                 return -EFAULT    745                                 return -EFAULT;
746                         break;                    746                         break;
747                 default:                          747                 default:
748                         BUG();                    748                         BUG();
749                 }                                 749                 }
750                                                   750 
751                 to = &end_time;                   751                 to = &end_time;
752                 if (poll_select_set_timeout(to    752                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
753                         return -EINVAL;           753                         return -EINVAL;
754         }                                         754         }
755                                                   755 
756         ret = set_user_sigmask(sigmask, sigset    756         ret = set_user_sigmask(sigmask, sigsetsize);
757         if (ret)                                  757         if (ret)
758                 return ret;                       758                 return ret;
759                                                   759 
760         ret = core_sys_select(n, inp, outp, ex    760         ret = core_sys_select(n, inp, outp, exp, to);
761         return poll_select_finish(&end_time, t    761         return poll_select_finish(&end_time, tsp, type, ret);
762 }                                                 762 }
763                                                   763 
764 /*                                                764 /*
765  * Most architectures can't handle 7-argument     765  * Most architectures can't handle 7-argument syscalls. So we provide a
766  * 6-argument version where the sixth argument    766  * 6-argument version where the sixth argument is a pointer to a structure
767  * which has a pointer to the sigset_t itself     767  * which has a pointer to the sigset_t itself followed by a size_t containing
768  * the sigset size.                               768  * the sigset size.
769  */                                               769  */
770 struct sigset_argpack {                           770 struct sigset_argpack {
771         sigset_t __user *p;                       771         sigset_t __user *p;
772         size_t size;                              772         size_t size;
773 };                                                773 };
774                                                   774 
775 static inline int get_sigset_argpack(struct si    775 static inline int get_sigset_argpack(struct sigset_argpack *to,
776                                      struct si    776                                      struct sigset_argpack __user *from)
777 {                                                 777 {
778         // the path is hot enough for overhead    778         // the path is hot enough for overhead of copy_from_user() to matter
779         if (from) {                               779         if (from) {
780                 if (can_do_masked_user_access(    780                 if (can_do_masked_user_access())
781                         from = masked_user_acc    781                         from = masked_user_access_begin(from);
782                 else if (!user_read_access_beg    782                 else if (!user_read_access_begin(from, sizeof(*from)))
783                         return -EFAULT;           783                         return -EFAULT;
784                 unsafe_get_user(to->p, &from->    784                 unsafe_get_user(to->p, &from->p, Efault);
785                 unsafe_get_user(to->size, &fro    785                 unsafe_get_user(to->size, &from->size, Efault);
786                 user_read_access_end();           786                 user_read_access_end();
787         }                                         787         }
788         return 0;                                 788         return 0;
789 Efault:                                           789 Efault:
790         user_access_end();                        790         user_access_end();
791         return -EFAULT;                           791         return -EFAULT;
792 }                                                 792 }
793                                                   793 
794 SYSCALL_DEFINE6(pselect6, int, n, fd_set __use    794 SYSCALL_DEFINE6(pselect6, int, n, fd_set __user *, inp, fd_set __user *, outp,
795                 fd_set __user *, exp, struct _    795                 fd_set __user *, exp, struct __kernel_timespec __user *, tsp,
796                 void __user *, sig)               796                 void __user *, sig)
797 {                                                 797 {
798         struct sigset_argpack x = {NULL, 0};      798         struct sigset_argpack x = {NULL, 0};
799                                                   799 
800         if (get_sigset_argpack(&x, sig))          800         if (get_sigset_argpack(&x, sig))
801                 return -EFAULT;                   801                 return -EFAULT;
802                                                   802 
803         return do_pselect(n, inp, outp, exp, t    803         return do_pselect(n, inp, outp, exp, tsp, x.p, x.size, PT_TIMESPEC);
804 }                                                 804 }
805                                                   805 
806 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defi    806 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defined(CONFIG_64BIT)
807                                                   807 
808 SYSCALL_DEFINE6(pselect6_time32, int, n, fd_se    808 SYSCALL_DEFINE6(pselect6_time32, int, n, fd_set __user *, inp, fd_set __user *, outp,
809                 fd_set __user *, exp, struct o    809                 fd_set __user *, exp, struct old_timespec32 __user *, tsp,
810                 void __user *, sig)               810                 void __user *, sig)
811 {                                                 811 {
812         struct sigset_argpack x = {NULL, 0};      812         struct sigset_argpack x = {NULL, 0};
813                                                   813 
814         if (get_sigset_argpack(&x, sig))          814         if (get_sigset_argpack(&x, sig))
815                 return -EFAULT;                   815                 return -EFAULT;
816                                                   816 
817         return do_pselect(n, inp, outp, exp, t    817         return do_pselect(n, inp, outp, exp, tsp, x.p, x.size, PT_OLD_TIMESPEC);
818 }                                                 818 }
819                                                   819 
820 #endif                                            820 #endif
821                                                   821 
822 #ifdef __ARCH_WANT_SYS_OLD_SELECT                 822 #ifdef __ARCH_WANT_SYS_OLD_SELECT
823 struct sel_arg_struct {                           823 struct sel_arg_struct {
824         unsigned long n;                          824         unsigned long n;
825         fd_set __user *inp, *outp, *exp;          825         fd_set __user *inp, *outp, *exp;
826         struct __kernel_old_timeval __user *tv    826         struct __kernel_old_timeval __user *tvp;
827 };                                                827 };
828                                                   828 
829 SYSCALL_DEFINE1(old_select, struct sel_arg_str    829 SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
830 {                                                 830 {
831         struct sel_arg_struct a;                  831         struct sel_arg_struct a;
832                                                   832 
833         if (copy_from_user(&a, arg, sizeof(a))    833         if (copy_from_user(&a, arg, sizeof(a)))
834                 return -EFAULT;                   834                 return -EFAULT;
835         return kern_select(a.n, a.inp, a.outp,    835         return kern_select(a.n, a.inp, a.outp, a.exp, a.tvp);
836 }                                                 836 }
837 #endif                                            837 #endif
838                                                   838 
839 struct poll_list {                                839 struct poll_list {
840         struct poll_list *next;                   840         struct poll_list *next;
841         unsigned int len;                         841         unsigned int len;
842         struct pollfd entries[] __counted_by(l    842         struct pollfd entries[] __counted_by(len);
843 };                                                843 };
844                                                   844 
845 #define POLLFD_PER_PAGE  ((PAGE_SIZE-sizeof(st    845 #define POLLFD_PER_PAGE  ((PAGE_SIZE-sizeof(struct poll_list)) / sizeof(struct pollfd))
846                                                   846 
847 /*                                                847 /*
848  * Fish for pollable events on the pollfd->fd     848  * Fish for pollable events on the pollfd->fd file descriptor. We're only
849  * interested in events matching the pollfd->e    849  * interested in events matching the pollfd->events mask, and the result
850  * matching that mask is both recorded in poll    850  * matching that mask is both recorded in pollfd->revents and returned. The
851  * pwait poll_table will be used by the fd-pro    851  * pwait poll_table will be used by the fd-provided poll handler for waiting,
852  * if pwait->_qproc is non-NULL.                  852  * if pwait->_qproc is non-NULL.
853  */                                               853  */
854 static inline __poll_t do_pollfd(struct pollfd    854 static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
855                                      bool *can    855                                      bool *can_busy_poll,
856                                      __poll_t     856                                      __poll_t busy_flag)
857 {                                                 857 {
858         int fd = pollfd->fd;                      858         int fd = pollfd->fd;
859         __poll_t mask = 0, filter;                859         __poll_t mask = 0, filter;
860         struct fd f;                              860         struct fd f;
861                                                   861 
862         if (fd < 0)                               862         if (fd < 0)
863                 goto out;                         863                 goto out;
864         mask = EPOLLNVAL;                         864         mask = EPOLLNVAL;
865         f = fdget(fd);                            865         f = fdget(fd);
866         if (!fd_file(f))                          866         if (!fd_file(f))
867                 goto out;                         867                 goto out;
868                                                   868 
869         /* userland u16 ->events contains POLL    869         /* userland u16 ->events contains POLL... bitmap */
870         filter = demangle_poll(pollfd->events)    870         filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
871         pwait->_key = filter | busy_flag;         871         pwait->_key = filter | busy_flag;
872         mask = vfs_poll(fd_file(f), pwait);       872         mask = vfs_poll(fd_file(f), pwait);
873         if (mask & busy_flag)                     873         if (mask & busy_flag)
874                 *can_busy_poll = true;            874                 *can_busy_poll = true;
875         mask &= filter;         /* Mask out un    875         mask &= filter;         /* Mask out unneeded events. */
876         fdput(f);                                 876         fdput(f);
877                                                   877 
878 out:                                              878 out:
879         /* ... and so does ->revents */           879         /* ... and so does ->revents */
880         pollfd->revents = mangle_poll(mask);      880         pollfd->revents = mangle_poll(mask);
881         return mask;                              881         return mask;
882 }                                                 882 }
883                                                   883 
884 static int do_poll(struct poll_list *list, str    884 static int do_poll(struct poll_list *list, struct poll_wqueues *wait,
885                    struct timespec64 *end_time    885                    struct timespec64 *end_time)
886 {                                                 886 {
887         poll_table* pt = &wait->pt;               887         poll_table* pt = &wait->pt;
888         ktime_t expire, *to = NULL;               888         ktime_t expire, *to = NULL;
889         int timed_out = 0, count = 0;             889         int timed_out = 0, count = 0;
890         u64 slack = 0;                            890         u64 slack = 0;
891         __poll_t busy_flag = net_busy_loop_on(    891         __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
892         unsigned long busy_start = 0;             892         unsigned long busy_start = 0;
893                                                   893 
894         /* Optimise the no-wait case */           894         /* Optimise the no-wait case */
895         if (end_time && !end_time->tv_sec && !    895         if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
896                 pt->_qproc = NULL;                896                 pt->_qproc = NULL;
897                 timed_out = 1;                    897                 timed_out = 1;
898         }                                         898         }
899                                                   899 
900         if (end_time && !timed_out)               900         if (end_time && !timed_out)
901                 slack = select_estimate_accura    901                 slack = select_estimate_accuracy(end_time);
902                                                   902 
903         for (;;) {                                903         for (;;) {
904                 struct poll_list *walk;           904                 struct poll_list *walk;
905                 bool can_busy_loop = false;       905                 bool can_busy_loop = false;
906                                                   906 
907                 for (walk = list; walk != NULL    907                 for (walk = list; walk != NULL; walk = walk->next) {
908                         struct pollfd * pfd, *    908                         struct pollfd * pfd, * pfd_end;
909                                                   909 
910                         pfd = walk->entries;      910                         pfd = walk->entries;
911                         pfd_end = pfd + walk->    911                         pfd_end = pfd + walk->len;
912                         for (; pfd != pfd_end;    912                         for (; pfd != pfd_end; pfd++) {
913                                 /*                913                                 /*
914                                  * Fish for ev    914                                  * Fish for events. If we found one, record it
915                                  * and kill po    915                                  * and kill poll_table->_qproc, so we don't
916                                  * needlessly     916                                  * needlessly register any other waiters after
917                                  * this. They'    917                                  * this. They'll get immediately deregistered
918                                  * when we bre    918                                  * when we break out and return.
919                                  */               919                                  */
920                                 if (do_pollfd(    920                                 if (do_pollfd(pfd, pt, &can_busy_loop,
921                                                   921                                               busy_flag)) {
922                                         count+    922                                         count++;
923                                         pt->_q    923                                         pt->_qproc = NULL;
924                                         /* fou    924                                         /* found something, stop busy polling */
925                                         busy_f    925                                         busy_flag = 0;
926                                         can_bu    926                                         can_busy_loop = false;
927                                 }                 927                                 }
928                         }                         928                         }
929                 }                                 929                 }
930                 /*                                930                 /*
931                  * All waiters have already be    931                  * All waiters have already been registered, so don't provide
932                  * a poll_table->_qproc to the    932                  * a poll_table->_qproc to them on the next loop iteration.
933                  */                               933                  */
934                 pt->_qproc = NULL;                934                 pt->_qproc = NULL;
935                 if (!count) {                     935                 if (!count) {
936                         count = wait->error;      936                         count = wait->error;
937                         if (signal_pending(cur    937                         if (signal_pending(current))
938                                 count = -EREST    938                                 count = -ERESTARTNOHAND;
939                 }                                 939                 }
940                 if (count || timed_out)           940                 if (count || timed_out)
941                         break;                    941                         break;
942                                                   942 
943                 /* only if found POLL_BUSY_LOO    943                 /* only if found POLL_BUSY_LOOP sockets && not out of time */
944                 if (can_busy_loop && !need_res    944                 if (can_busy_loop && !need_resched()) {
945                         if (!busy_start) {        945                         if (!busy_start) {
946                                 busy_start = b    946                                 busy_start = busy_loop_current_time();
947                                 continue;         947                                 continue;
948                         }                         948                         }
949                         if (!busy_loop_timeout    949                         if (!busy_loop_timeout(busy_start))
950                                 continue;         950                                 continue;
951                 }                                 951                 }
952                 busy_flag = 0;                    952                 busy_flag = 0;
953                                                   953 
954                 /*                                954                 /*
955                  * If this is the first loop a    955                  * If this is the first loop and we have a timeout
956                  * given, then we convert to k    956                  * given, then we convert to ktime_t and set the to
957                  * pointer to the expiry value    957                  * pointer to the expiry value.
958                  */                               958                  */
959                 if (end_time && !to) {            959                 if (end_time && !to) {
960                         expire = timespec64_to    960                         expire = timespec64_to_ktime(*end_time);
961                         to = &expire;             961                         to = &expire;
962                 }                                 962                 }
963                                                   963 
964                 if (!poll_schedule_timeout(wai    964                 if (!poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack))
965                         timed_out = 1;            965                         timed_out = 1;
966         }                                         966         }
967         return count;                             967         return count;
968 }                                                 968 }
969                                                   969 
970 #define N_STACK_PPS ((sizeof(stack_pps) - size    970 #define N_STACK_PPS ((sizeof(stack_pps) - sizeof(struct poll_list))  / \
971                         sizeof(struct pollfd))    971                         sizeof(struct pollfd))
972                                                   972 
973 static int do_sys_poll(struct pollfd __user *u    973 static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds,
974                 struct timespec64 *end_time)      974                 struct timespec64 *end_time)
975 {                                                 975 {
976         struct poll_wqueues table;                976         struct poll_wqueues table;
977         int err = -EFAULT, fdcount;               977         int err = -EFAULT, fdcount;
978         /* Allocate small arguments on the sta    978         /* Allocate small arguments on the stack to save memory and be
979            faster - use long to make sure the     979            faster - use long to make sure the buffer is aligned properly
980            on 64 bit archs to avoid unaligned     980            on 64 bit archs to avoid unaligned access */
981         long stack_pps[POLL_STACK_ALLOC/sizeof    981         long stack_pps[POLL_STACK_ALLOC/sizeof(long)];
982         struct poll_list *const head = (struct    982         struct poll_list *const head = (struct poll_list *)stack_pps;
983         struct poll_list *walk = head;            983         struct poll_list *walk = head;
984         unsigned int todo = nfds;                 984         unsigned int todo = nfds;
985         unsigned int len;                         985         unsigned int len;
986                                                   986 
987         if (nfds > rlimit(RLIMIT_NOFILE))         987         if (nfds > rlimit(RLIMIT_NOFILE))
988                 return -EINVAL;                   988                 return -EINVAL;
989                                                   989 
990         len = min_t(unsigned int, nfds, N_STAC    990         len = min_t(unsigned int, nfds, N_STACK_PPS);
991         for (;;) {                                991         for (;;) {
992                 walk->next = NULL;                992                 walk->next = NULL;
993                 walk->len = len;                  993                 walk->len = len;
994                 if (!len)                         994                 if (!len)
995                         break;                    995                         break;
996                                                   996 
997                 if (copy_from_user(walk->entri    997                 if (copy_from_user(walk->entries, ufds + nfds-todo,
998                                         sizeof    998                                         sizeof(struct pollfd) * walk->len))
999                         goto out_fds;             999                         goto out_fds;
1000                                                  1000 
1001                 if (walk->len >= todo)           1001                 if (walk->len >= todo)
1002                         break;                   1002                         break;
1003                 todo -= walk->len;               1003                 todo -= walk->len;
1004                                                  1004 
1005                 len = min(todo, POLLFD_PER_PA    1005                 len = min(todo, POLLFD_PER_PAGE);
1006                 walk = walk->next = kmalloc(s    1006                 walk = walk->next = kmalloc(struct_size(walk, entries, len),
1007                                             G    1007                                             GFP_KERNEL);
1008                 if (!walk) {                     1008                 if (!walk) {
1009                         err = -ENOMEM;           1009                         err = -ENOMEM;
1010                         goto out_fds;            1010                         goto out_fds;
1011                 }                                1011                 }
1012         }                                        1012         }
1013                                                  1013 
1014         poll_initwait(&table);                   1014         poll_initwait(&table);
1015         fdcount = do_poll(head, &table, end_t    1015         fdcount = do_poll(head, &table, end_time);
1016         poll_freewait(&table);                   1016         poll_freewait(&table);
1017                                                  1017 
1018         if (!user_write_access_begin(ufds, nf    1018         if (!user_write_access_begin(ufds, nfds * sizeof(*ufds)))
1019                 goto out_fds;                    1019                 goto out_fds;
1020                                                  1020 
1021         for (walk = head; walk; walk = walk->    1021         for (walk = head; walk; walk = walk->next) {
1022                 struct pollfd *fds = walk->en    1022                 struct pollfd *fds = walk->entries;
1023                 unsigned int j;                  1023                 unsigned int j;
1024                                                  1024 
1025                 for (j = walk->len; j; fds++,    1025                 for (j = walk->len; j; fds++, ufds++, j--)
1026                         unsafe_put_user(fds->    1026                         unsafe_put_user(fds->revents, &ufds->revents, Efault);
1027         }                                        1027         }
1028         user_write_access_end();                 1028         user_write_access_end();
1029                                                  1029 
1030         err = fdcount;                           1030         err = fdcount;
1031 out_fds:                                         1031 out_fds:
1032         walk = head->next;                       1032         walk = head->next;
1033         while (walk) {                           1033         while (walk) {
1034                 struct poll_list *pos = walk;    1034                 struct poll_list *pos = walk;
1035                 walk = walk->next;               1035                 walk = walk->next;
1036                 kfree(pos);                      1036                 kfree(pos);
1037         }                                        1037         }
1038                                                  1038 
1039         return err;                              1039         return err;
1040                                                  1040 
1041 Efault:                                          1041 Efault:
1042         user_write_access_end();                 1042         user_write_access_end();
1043         err = -EFAULT;                           1043         err = -EFAULT;
1044         goto out_fds;                            1044         goto out_fds;
1045 }                                                1045 }
1046                                                  1046 
1047 static long do_restart_poll(struct restart_bl    1047 static long do_restart_poll(struct restart_block *restart_block)
1048 {                                                1048 {
1049         struct pollfd __user *ufds = restart_    1049         struct pollfd __user *ufds = restart_block->poll.ufds;
1050         int nfds = restart_block->poll.nfds;     1050         int nfds = restart_block->poll.nfds;
1051         struct timespec64 *to = NULL, end_tim    1051         struct timespec64 *to = NULL, end_time;
1052         int ret;                                 1052         int ret;
1053                                                  1053 
1054         if (restart_block->poll.has_timeout)     1054         if (restart_block->poll.has_timeout) {
1055                 end_time.tv_sec = restart_blo    1055                 end_time.tv_sec = restart_block->poll.tv_sec;
1056                 end_time.tv_nsec = restart_bl    1056                 end_time.tv_nsec = restart_block->poll.tv_nsec;
1057                 to = &end_time;                  1057                 to = &end_time;
1058         }                                        1058         }
1059                                                  1059 
1060         ret = do_sys_poll(ufds, nfds, to);       1060         ret = do_sys_poll(ufds, nfds, to);
1061                                                  1061 
1062         if (ret == -ERESTARTNOHAND)              1062         if (ret == -ERESTARTNOHAND)
1063                 ret = set_restart_fn(restart_    1063                 ret = set_restart_fn(restart_block, do_restart_poll);
1064                                                  1064 
1065         return ret;                              1065         return ret;
1066 }                                                1066 }
1067                                                  1067 
1068 SYSCALL_DEFINE3(poll, struct pollfd __user *,    1068 SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,
1069                 int, timeout_msecs)              1069                 int, timeout_msecs)
1070 {                                                1070 {
1071         struct timespec64 end_time, *to = NUL    1071         struct timespec64 end_time, *to = NULL;
1072         int ret;                                 1072         int ret;
1073                                                  1073 
1074         if (timeout_msecs >= 0) {                1074         if (timeout_msecs >= 0) {
1075                 to = &end_time;                  1075                 to = &end_time;
1076                 poll_select_set_timeout(to, t    1076                 poll_select_set_timeout(to, timeout_msecs / MSEC_PER_SEC,
1077                         NSEC_PER_MSEC * (time    1077                         NSEC_PER_MSEC * (timeout_msecs % MSEC_PER_SEC));
1078         }                                        1078         }
1079                                                  1079 
1080         ret = do_sys_poll(ufds, nfds, to);       1080         ret = do_sys_poll(ufds, nfds, to);
1081                                                  1081 
1082         if (ret == -ERESTARTNOHAND) {            1082         if (ret == -ERESTARTNOHAND) {
1083                 struct restart_block *restart    1083                 struct restart_block *restart_block;
1084                                                  1084 
1085                 restart_block = &current->res    1085                 restart_block = &current->restart_block;
1086                 restart_block->poll.ufds = uf    1086                 restart_block->poll.ufds = ufds;
1087                 restart_block->poll.nfds = nf    1087                 restart_block->poll.nfds = nfds;
1088                                                  1088 
1089                 if (timeout_msecs >= 0) {        1089                 if (timeout_msecs >= 0) {
1090                         restart_block->poll.t    1090                         restart_block->poll.tv_sec = end_time.tv_sec;
1091                         restart_block->poll.t    1091                         restart_block->poll.tv_nsec = end_time.tv_nsec;
1092                         restart_block->poll.h    1092                         restart_block->poll.has_timeout = 1;
1093                 } else                           1093                 } else
1094                         restart_block->poll.h    1094                         restart_block->poll.has_timeout = 0;
1095                                                  1095 
1096                 ret = set_restart_fn(restart_    1096                 ret = set_restart_fn(restart_block, do_restart_poll);
1097         }                                        1097         }
1098         return ret;                              1098         return ret;
1099 }                                                1099 }
1100                                                  1100 
1101 SYSCALL_DEFINE5(ppoll, struct pollfd __user *    1101 SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
1102                 struct __kernel_timespec __us    1102                 struct __kernel_timespec __user *, tsp, const sigset_t __user *, sigmask,
1103                 size_t, sigsetsize)              1103                 size_t, sigsetsize)
1104 {                                                1104 {
1105         struct timespec64 ts, end_time, *to =    1105         struct timespec64 ts, end_time, *to = NULL;
1106         int ret;                                 1106         int ret;
1107                                                  1107 
1108         if (tsp) {                               1108         if (tsp) {
1109                 if (get_timespec64(&ts, tsp))    1109                 if (get_timespec64(&ts, tsp))
1110                         return -EFAULT;          1110                         return -EFAULT;
1111                                                  1111 
1112                 to = &end_time;                  1112                 to = &end_time;
1113                 if (poll_select_set_timeout(t    1113                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1114                         return -EINVAL;          1114                         return -EINVAL;
1115         }                                        1115         }
1116                                                  1116 
1117         ret = set_user_sigmask(sigmask, sigse    1117         ret = set_user_sigmask(sigmask, sigsetsize);
1118         if (ret)                                 1118         if (ret)
1119                 return ret;                      1119                 return ret;
1120                                                  1120 
1121         ret = do_sys_poll(ufds, nfds, to);       1121         ret = do_sys_poll(ufds, nfds, to);
1122         return poll_select_finish(&end_time,     1122         return poll_select_finish(&end_time, tsp, PT_TIMESPEC, ret);
1123 }                                                1123 }
1124                                                  1124 
1125 #if defined(CONFIG_COMPAT_32BIT_TIME) && !def    1125 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defined(CONFIG_64BIT)
1126                                                  1126 
1127 SYSCALL_DEFINE5(ppoll_time32, struct pollfd _    1127 SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, unsigned int, nfds,
1128                 struct old_timespec32 __user     1128                 struct old_timespec32 __user *, tsp, const sigset_t __user *, sigmask,
1129                 size_t, sigsetsize)              1129                 size_t, sigsetsize)
1130 {                                                1130 {
1131         struct timespec64 ts, end_time, *to =    1131         struct timespec64 ts, end_time, *to = NULL;
1132         int ret;                                 1132         int ret;
1133                                                  1133 
1134         if (tsp) {                               1134         if (tsp) {
1135                 if (get_old_timespec32(&ts, t    1135                 if (get_old_timespec32(&ts, tsp))
1136                         return -EFAULT;          1136                         return -EFAULT;
1137                                                  1137 
1138                 to = &end_time;                  1138                 to = &end_time;
1139                 if (poll_select_set_timeout(t    1139                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1140                         return -EINVAL;          1140                         return -EINVAL;
1141         }                                        1141         }
1142                                                  1142 
1143         ret = set_user_sigmask(sigmask, sigse    1143         ret = set_user_sigmask(sigmask, sigsetsize);
1144         if (ret)                                 1144         if (ret)
1145                 return ret;                      1145                 return ret;
1146                                                  1146 
1147         ret = do_sys_poll(ufds, nfds, to);       1147         ret = do_sys_poll(ufds, nfds, to);
1148         return poll_select_finish(&end_time,     1148         return poll_select_finish(&end_time, tsp, PT_OLD_TIMESPEC, ret);
1149 }                                                1149 }
1150 #endif                                           1150 #endif
1151                                                  1151 
1152 #ifdef CONFIG_COMPAT                             1152 #ifdef CONFIG_COMPAT
1153 #define __COMPAT_NFDBITS       (8 * sizeof(co    1153 #define __COMPAT_NFDBITS       (8 * sizeof(compat_ulong_t))
1154                                                  1154 
1155 /*                                               1155 /*
1156  * Ooo, nasty.  We need here to frob 32-bit u    1156  * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
1157  * 64-bit unsigned longs.                        1157  * 64-bit unsigned longs.
1158  */                                              1158  */
1159 static                                           1159 static
1160 int compat_get_fd_set(unsigned long nr, compa    1160 int compat_get_fd_set(unsigned long nr, compat_ulong_t __user *ufdset,
1161                         unsigned long *fdset)    1161                         unsigned long *fdset)
1162 {                                                1162 {
1163         if (ufdset) {                            1163         if (ufdset) {
1164                 return compat_get_bitmap(fdse    1164                 return compat_get_bitmap(fdset, ufdset, nr);
1165         } else {                                 1165         } else {
1166                 zero_fd_set(nr, fdset);          1166                 zero_fd_set(nr, fdset);
1167                 return 0;                        1167                 return 0;
1168         }                                        1168         }
1169 }                                                1169 }
1170                                                  1170 
1171 static                                           1171 static
1172 int compat_set_fd_set(unsigned long nr, compa    1172 int compat_set_fd_set(unsigned long nr, compat_ulong_t __user *ufdset,
1173                       unsigned long *fdset)      1173                       unsigned long *fdset)
1174 {                                                1174 {
1175         if (!ufdset)                             1175         if (!ufdset)
1176                 return 0;                        1176                 return 0;
1177         return compat_put_bitmap(ufdset, fdse    1177         return compat_put_bitmap(ufdset, fdset, nr);
1178 }                                                1178 }
1179                                                  1179 
1180                                                  1180 
1181 /*                                               1181 /*
1182  * This is a virtual copy of sys_select from     1182  * This is a virtual copy of sys_select from fs/select.c and probably
1183  * should be compared to it from time to time    1183  * should be compared to it from time to time
1184  */                                              1184  */
1185                                                  1185 
1186 /*                                               1186 /*
1187  * We can actually return ERESTARTSYS instead    1187  * We can actually return ERESTARTSYS instead of EINTR, but I'd
1188  * like to be certain this leads to no proble    1188  * like to be certain this leads to no problems. So I return
1189  * EINTR just for safety.                        1189  * EINTR just for safety.
1190  *                                               1190  *
1191  * Update: ERESTARTSYS breaks at least the xv    1191  * Update: ERESTARTSYS breaks at least the xview clock binary, so
1192  * I'm trying ERESTARTNOHAND which restart on    1192  * I'm trying ERESTARTNOHAND which restart only when you want to.
1193  */                                              1193  */
1194 static int compat_core_sys_select(int n, comp    1194 static int compat_core_sys_select(int n, compat_ulong_t __user *inp,
1195         compat_ulong_t __user *outp, compat_u    1195         compat_ulong_t __user *outp, compat_ulong_t __user *exp,
1196         struct timespec64 *end_time)             1196         struct timespec64 *end_time)
1197 {                                                1197 {
1198         fd_set_bits fds;                         1198         fd_set_bits fds;
1199         void *bits;                              1199         void *bits;
1200         int size, max_fds, ret = -EINVAL;        1200         int size, max_fds, ret = -EINVAL;
1201         struct fdtable *fdt;                     1201         struct fdtable *fdt;
1202         long stack_fds[SELECT_STACK_ALLOC/siz    1202         long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
1203                                                  1203 
1204         if (n < 0)                               1204         if (n < 0)
1205                 goto out_nofds;                  1205                 goto out_nofds;
1206                                                  1206 
1207         /* max_fds can increase, so grab it o    1207         /* max_fds can increase, so grab it once to avoid race */
1208         rcu_read_lock();                         1208         rcu_read_lock();
1209         fdt = files_fdtable(current->files);     1209         fdt = files_fdtable(current->files);
1210         max_fds = fdt->max_fds;                  1210         max_fds = fdt->max_fds;
1211         rcu_read_unlock();                       1211         rcu_read_unlock();
1212         if (n > max_fds)                         1212         if (n > max_fds)
1213                 n = max_fds;                     1213                 n = max_fds;
1214                                                  1214 
1215         /*                                       1215         /*
1216          * We need 6 bitmaps (in/out/ex for b    1216          * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
1217          * since we used fdset we need to all    1217          * since we used fdset we need to allocate memory in units of
1218          * long-words.                           1218          * long-words.
1219          */                                      1219          */
1220         size = FDS_BYTES(n);                     1220         size = FDS_BYTES(n);
1221         bits = stack_fds;                        1221         bits = stack_fds;
1222         if (size > sizeof(stack_fds) / 6) {      1222         if (size > sizeof(stack_fds) / 6) {
1223                 bits = kmalloc_array(6, size,    1223                 bits = kmalloc_array(6, size, GFP_KERNEL);
1224                 ret = -ENOMEM;                   1224                 ret = -ENOMEM;
1225                 if (!bits)                       1225                 if (!bits)
1226                         goto out_nofds;          1226                         goto out_nofds;
1227         }                                        1227         }
1228         fds.in      = (unsigned long *)  bits    1228         fds.in      = (unsigned long *)  bits;
1229         fds.out     = (unsigned long *) (bits    1229         fds.out     = (unsigned long *) (bits +   size);
1230         fds.ex      = (unsigned long *) (bits    1230         fds.ex      = (unsigned long *) (bits + 2*size);
1231         fds.res_in  = (unsigned long *) (bits    1231         fds.res_in  = (unsigned long *) (bits + 3*size);
1232         fds.res_out = (unsigned long *) (bits    1232         fds.res_out = (unsigned long *) (bits + 4*size);
1233         fds.res_ex  = (unsigned long *) (bits    1233         fds.res_ex  = (unsigned long *) (bits + 5*size);
1234                                                  1234 
1235         if ((ret = compat_get_fd_set(n, inp,     1235         if ((ret = compat_get_fd_set(n, inp, fds.in)) ||
1236             (ret = compat_get_fd_set(n, outp,    1236             (ret = compat_get_fd_set(n, outp, fds.out)) ||
1237             (ret = compat_get_fd_set(n, exp,     1237             (ret = compat_get_fd_set(n, exp, fds.ex)))
1238                 goto out;                        1238                 goto out;
1239         zero_fd_set(n, fds.res_in);              1239         zero_fd_set(n, fds.res_in);
1240         zero_fd_set(n, fds.res_out);             1240         zero_fd_set(n, fds.res_out);
1241         zero_fd_set(n, fds.res_ex);              1241         zero_fd_set(n, fds.res_ex);
1242                                                  1242 
1243         ret = do_select(n, &fds, end_time);      1243         ret = do_select(n, &fds, end_time);
1244                                                  1244 
1245         if (ret < 0)                             1245         if (ret < 0)
1246                 goto out;                        1246                 goto out;
1247         if (!ret) {                              1247         if (!ret) {
1248                 ret = -ERESTARTNOHAND;           1248                 ret = -ERESTARTNOHAND;
1249                 if (signal_pending(current))     1249                 if (signal_pending(current))
1250                         goto out;                1250                         goto out;
1251                 ret = 0;                         1251                 ret = 0;
1252         }                                        1252         }
1253                                                  1253 
1254         if (compat_set_fd_set(n, inp, fds.res    1254         if (compat_set_fd_set(n, inp, fds.res_in) ||
1255             compat_set_fd_set(n, outp, fds.re    1255             compat_set_fd_set(n, outp, fds.res_out) ||
1256             compat_set_fd_set(n, exp, fds.res    1256             compat_set_fd_set(n, exp, fds.res_ex))
1257                 ret = -EFAULT;                   1257                 ret = -EFAULT;
1258 out:                                             1258 out:
1259         if (bits != stack_fds)                   1259         if (bits != stack_fds)
1260                 kfree(bits);                     1260                 kfree(bits);
1261 out_nofds:                                       1261 out_nofds:
1262         return ret;                              1262         return ret;
1263 }                                                1263 }
1264                                                  1264 
1265 static int do_compat_select(int n, compat_ulo    1265 static int do_compat_select(int n, compat_ulong_t __user *inp,
1266         compat_ulong_t __user *outp, compat_u    1266         compat_ulong_t __user *outp, compat_ulong_t __user *exp,
1267         struct old_timeval32 __user *tvp)        1267         struct old_timeval32 __user *tvp)
1268 {                                                1268 {
1269         struct timespec64 end_time, *to = NUL    1269         struct timespec64 end_time, *to = NULL;
1270         struct old_timeval32 tv;                 1270         struct old_timeval32 tv;
1271         int ret;                                 1271         int ret;
1272                                                  1272 
1273         if (tvp) {                               1273         if (tvp) {
1274                 if (copy_from_user(&tv, tvp,     1274                 if (copy_from_user(&tv, tvp, sizeof(tv)))
1275                         return -EFAULT;          1275                         return -EFAULT;
1276                                                  1276 
1277                 to = &end_time;                  1277                 to = &end_time;
1278                 if (poll_select_set_timeout(t    1278                 if (poll_select_set_timeout(to,
1279                                 tv.tv_sec + (    1279                                 tv.tv_sec + (tv.tv_usec / USEC_PER_SEC),
1280                                 (tv.tv_usec %    1280                                 (tv.tv_usec % USEC_PER_SEC) * NSEC_PER_USEC))
1281                         return -EINVAL;          1281                         return -EINVAL;
1282         }                                        1282         }
1283                                                  1283 
1284         ret = compat_core_sys_select(n, inp,     1284         ret = compat_core_sys_select(n, inp, outp, exp, to);
1285         return poll_select_finish(&end_time,     1285         return poll_select_finish(&end_time, tvp, PT_OLD_TIMEVAL, ret);
1286 }                                                1286 }
1287                                                  1287 
1288 COMPAT_SYSCALL_DEFINE5(select, int, n, compat    1288 COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
1289         compat_ulong_t __user *, outp, compat    1289         compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
1290         struct old_timeval32 __user *, tvp)      1290         struct old_timeval32 __user *, tvp)
1291 {                                                1291 {
1292         return do_compat_select(n, inp, outp,    1292         return do_compat_select(n, inp, outp, exp, tvp);
1293 }                                                1293 }
1294                                                  1294 
1295 struct compat_sel_arg_struct {                   1295 struct compat_sel_arg_struct {
1296         compat_ulong_t n;                        1296         compat_ulong_t n;
1297         compat_uptr_t inp;                       1297         compat_uptr_t inp;
1298         compat_uptr_t outp;                      1298         compat_uptr_t outp;
1299         compat_uptr_t exp;                       1299         compat_uptr_t exp;
1300         compat_uptr_t tvp;                       1300         compat_uptr_t tvp;
1301 };                                               1301 };
1302                                                  1302 
1303 COMPAT_SYSCALL_DEFINE1(old_select, struct com    1303 COMPAT_SYSCALL_DEFINE1(old_select, struct compat_sel_arg_struct __user *, arg)
1304 {                                                1304 {
1305         struct compat_sel_arg_struct a;          1305         struct compat_sel_arg_struct a;
1306                                                  1306 
1307         if (copy_from_user(&a, arg, sizeof(a)    1307         if (copy_from_user(&a, arg, sizeof(a)))
1308                 return -EFAULT;                  1308                 return -EFAULT;
1309         return do_compat_select(a.n, compat_p    1309         return do_compat_select(a.n, compat_ptr(a.inp), compat_ptr(a.outp),
1310                                 compat_ptr(a.    1310                                 compat_ptr(a.exp), compat_ptr(a.tvp));
1311 }                                                1311 }
1312                                                  1312 
1313 static long do_compat_pselect(int n, compat_u    1313 static long do_compat_pselect(int n, compat_ulong_t __user *inp,
1314         compat_ulong_t __user *outp, compat_u    1314         compat_ulong_t __user *outp, compat_ulong_t __user *exp,
1315         void __user *tsp, compat_sigset_t __u    1315         void __user *tsp, compat_sigset_t __user *sigmask,
1316         compat_size_t sigsetsize, enum poll_t    1316         compat_size_t sigsetsize, enum poll_time_type type)
1317 {                                                1317 {
1318         struct timespec64 ts, end_time, *to =    1318         struct timespec64 ts, end_time, *to = NULL;
1319         int ret;                                 1319         int ret;
1320                                                  1320 
1321         if (tsp) {                               1321         if (tsp) {
1322                 switch (type) {                  1322                 switch (type) {
1323                 case PT_OLD_TIMESPEC:            1323                 case PT_OLD_TIMESPEC:
1324                         if (get_old_timespec3    1324                         if (get_old_timespec32(&ts, tsp))
1325                                 return -EFAUL    1325                                 return -EFAULT;
1326                         break;                   1326                         break;
1327                 case PT_TIMESPEC:                1327                 case PT_TIMESPEC:
1328                         if (get_timespec64(&t    1328                         if (get_timespec64(&ts, tsp))
1329                                 return -EFAUL    1329                                 return -EFAULT;
1330                         break;                   1330                         break;
1331                 default:                         1331                 default:
1332                         BUG();                   1332                         BUG();
1333                 }                                1333                 }
1334                                                  1334 
1335                 to = &end_time;                  1335                 to = &end_time;
1336                 if (poll_select_set_timeout(t    1336                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1337                         return -EINVAL;          1337                         return -EINVAL;
1338         }                                        1338         }
1339                                                  1339 
1340         ret = set_compat_user_sigmask(sigmask    1340         ret = set_compat_user_sigmask(sigmask, sigsetsize);
1341         if (ret)                                 1341         if (ret)
1342                 return ret;                      1342                 return ret;
1343                                                  1343 
1344         ret = compat_core_sys_select(n, inp,     1344         ret = compat_core_sys_select(n, inp, outp, exp, to);
1345         return poll_select_finish(&end_time,     1345         return poll_select_finish(&end_time, tsp, type, ret);
1346 }                                                1346 }
1347                                                  1347 
1348 struct compat_sigset_argpack {                   1348 struct compat_sigset_argpack {
1349         compat_uptr_t p;                         1349         compat_uptr_t p;
1350         compat_size_t size;                      1350         compat_size_t size;
1351 };                                               1351 };
1352 static inline int get_compat_sigset_argpack(s    1352 static inline int get_compat_sigset_argpack(struct compat_sigset_argpack *to,
1353                                             s    1353                                             struct compat_sigset_argpack __user *from)
1354 {                                                1354 {
1355         if (from) {                              1355         if (from) {
1356                 if (!user_read_access_begin(f    1356                 if (!user_read_access_begin(from, sizeof(*from)))
1357                         return -EFAULT;          1357                         return -EFAULT;
1358                 unsafe_get_user(to->p, &from-    1358                 unsafe_get_user(to->p, &from->p, Efault);
1359                 unsafe_get_user(to->size, &fr    1359                 unsafe_get_user(to->size, &from->size, Efault);
1360                 user_read_access_end();          1360                 user_read_access_end();
1361         }                                        1361         }
1362         return 0;                                1362         return 0;
1363 Efault:                                          1363 Efault:
1364         user_access_end();                       1364         user_access_end();
1365         return -EFAULT;                          1365         return -EFAULT;
1366 }                                                1366 }
1367                                                  1367 
1368 COMPAT_SYSCALL_DEFINE6(pselect6_time64, int,     1368 COMPAT_SYSCALL_DEFINE6(pselect6_time64, int, n, compat_ulong_t __user *, inp,
1369         compat_ulong_t __user *, outp, compat    1369         compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
1370         struct __kernel_timespec __user *, ts    1370         struct __kernel_timespec __user *, tsp, void __user *, sig)
1371 {                                                1371 {
1372         struct compat_sigset_argpack x = {0,     1372         struct compat_sigset_argpack x = {0, 0};
1373                                                  1373 
1374         if (get_compat_sigset_argpack(&x, sig    1374         if (get_compat_sigset_argpack(&x, sig))
1375                 return -EFAULT;                  1375                 return -EFAULT;
1376                                                  1376 
1377         return do_compat_pselect(n, inp, outp    1377         return do_compat_pselect(n, inp, outp, exp, tsp, compat_ptr(x.p),
1378                                  x.size, PT_T    1378                                  x.size, PT_TIMESPEC);
1379 }                                                1379 }
1380                                                  1380 
1381 #if defined(CONFIG_COMPAT_32BIT_TIME)            1381 #if defined(CONFIG_COMPAT_32BIT_TIME)
1382                                                  1382 
1383 COMPAT_SYSCALL_DEFINE6(pselect6_time32, int,     1383 COMPAT_SYSCALL_DEFINE6(pselect6_time32, int, n, compat_ulong_t __user *, inp,
1384         compat_ulong_t __user *, outp, compat    1384         compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
1385         struct old_timespec32 __user *, tsp,     1385         struct old_timespec32 __user *, tsp, void __user *, sig)
1386 {                                                1386 {
1387         struct compat_sigset_argpack x = {0,     1387         struct compat_sigset_argpack x = {0, 0};
1388                                                  1388 
1389         if (get_compat_sigset_argpack(&x, sig    1389         if (get_compat_sigset_argpack(&x, sig))
1390                 return -EFAULT;                  1390                 return -EFAULT;
1391                                                  1391 
1392         return do_compat_pselect(n, inp, outp    1392         return do_compat_pselect(n, inp, outp, exp, tsp, compat_ptr(x.p),
1393                                  x.size, PT_O    1393                                  x.size, PT_OLD_TIMESPEC);
1394 }                                                1394 }
1395                                                  1395 
1396 #endif                                           1396 #endif
1397                                                  1397 
1398 #if defined(CONFIG_COMPAT_32BIT_TIME)            1398 #if defined(CONFIG_COMPAT_32BIT_TIME)
1399 COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct p    1399 COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds,
1400         unsigned int,  nfds, struct old_times    1400         unsigned int,  nfds, struct old_timespec32 __user *, tsp,
1401         const compat_sigset_t __user *, sigma    1401         const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
1402 {                                                1402 {
1403         struct timespec64 ts, end_time, *to =    1403         struct timespec64 ts, end_time, *to = NULL;
1404         int ret;                                 1404         int ret;
1405                                                  1405 
1406         if (tsp) {                               1406         if (tsp) {
1407                 if (get_old_timespec32(&ts, t    1407                 if (get_old_timespec32(&ts, tsp))
1408                         return -EFAULT;          1408                         return -EFAULT;
1409                                                  1409 
1410                 to = &end_time;                  1410                 to = &end_time;
1411                 if (poll_select_set_timeout(t    1411                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1412                         return -EINVAL;          1412                         return -EINVAL;
1413         }                                        1413         }
1414                                                  1414 
1415         ret = set_compat_user_sigmask(sigmask    1415         ret = set_compat_user_sigmask(sigmask, sigsetsize);
1416         if (ret)                                 1416         if (ret)
1417                 return ret;                      1417                 return ret;
1418                                                  1418 
1419         ret = do_sys_poll(ufds, nfds, to);       1419         ret = do_sys_poll(ufds, nfds, to);
1420         return poll_select_finish(&end_time,     1420         return poll_select_finish(&end_time, tsp, PT_OLD_TIMESPEC, ret);
1421 }                                                1421 }
1422 #endif                                           1422 #endif
1423                                                  1423 
1424 /* New compat syscall for 64 bit time_t*/        1424 /* New compat syscall for 64 bit time_t*/
1425 COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct p    1425 COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct pollfd __user *, ufds,
1426         unsigned int,  nfds, struct __kernel_    1426         unsigned int,  nfds, struct __kernel_timespec __user *, tsp,
1427         const compat_sigset_t __user *, sigma    1427         const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
1428 {                                                1428 {
1429         struct timespec64 ts, end_time, *to =    1429         struct timespec64 ts, end_time, *to = NULL;
1430         int ret;                                 1430         int ret;
1431                                                  1431 
1432         if (tsp) {                               1432         if (tsp) {
1433                 if (get_timespec64(&ts, tsp))    1433                 if (get_timespec64(&ts, tsp))
1434                         return -EFAULT;          1434                         return -EFAULT;
1435                                                  1435 
1436                 to = &end_time;                  1436                 to = &end_time;
1437                 if (poll_select_set_timeout(t    1437                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1438                         return -EINVAL;          1438                         return -EINVAL;
1439         }                                        1439         }
1440                                                  1440 
1441         ret = set_compat_user_sigmask(sigmask    1441         ret = set_compat_user_sigmask(sigmask, sigsetsize);
1442         if (ret)                                 1442         if (ret)
1443                 return ret;                      1443                 return ret;
1444                                                  1444 
1445         ret = do_sys_poll(ufds, nfds, to);       1445         ret = do_sys_poll(ufds, nfds, to);
1446         return poll_select_finish(&end_time,     1446         return poll_select_finish(&end_time, tsp, PT_TIMESPEC, ret);
1447 }                                                1447 }
1448                                                  1448 
1449 #endif                                           1449 #endif
1450                                                  1450 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php