~ [ 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 (Version linux-6.12-rc7) and /fs/select.c (Version linux-6.7.12)


  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;   << 
 81                                                    80 
 82         if (slack == 0)                        !!  81         /*
                                                   >>  82          * Realtime tasks get a slack of 0 for obvious reasons.
                                                   >>  83          */
                                                   >>  84 
                                                   >>  85         if (rt_task(current))
 83                 return 0;                          86                 return 0;
 84                                                    87 
 85         ktime_get_ts64(&now);                      88         ktime_get_ts64(&now);
 86         now = timespec64_sub(*tv, now);            89         now = timespec64_sub(*tv, now);
 87         ret = __estimate_accuracy(&now);           90         ret = __estimate_accuracy(&now);
 88         if (ret < slack)                       !!  91         if (ret < current->timer_slack_ns)
 89                 return slack;                  !!  92                 return current->timer_slack_ns;
 90         return ret;                                93         return ret;
 91 }                                                  94 }
 92                                                    95 
 93                                                    96 
 94                                                    97 
 95 struct poll_table_page {                           98 struct poll_table_page {
 96         struct poll_table_page * next;             99         struct poll_table_page * next;
 97         struct poll_table_entry * entry;          100         struct poll_table_entry * entry;
 98         struct poll_table_entry entries[];        101         struct poll_table_entry entries[];
 99 };                                                102 };
100                                                   103 
101 #define POLL_TABLE_FULL(table) \                  104 #define POLL_TABLE_FULL(table) \
102         ((unsigned long)((table)->entry+1) > P    105         ((unsigned long)((table)->entry+1) > PAGE_SIZE + (unsigned long)(table))
103                                                   106 
104 /*                                                107 /*
105  * Ok, Peter made a complicated, but straightf    108  * Ok, Peter made a complicated, but straightforward multiple_wait() function.
106  * I have rewritten this, taking some shortcut    109  * I have rewritten this, taking some shortcuts: This code may not be easy to
107  * follow, but it should be free of race-condi    110  * 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    111  * understand what I'm doing here, then you understand how the linux
109  * sleep/wakeup mechanism works.                  112  * sleep/wakeup mechanism works.
110  *                                                113  *
111  * Two very simple procedures, poll_wait() and    114  * Two very simple procedures, poll_wait() and poll_freewait() make all the
112  * work.  poll_wait() is an inline-function de    115  * work.  poll_wait() is an inline-function defined in <linux/poll.h>,
113  * as all select/poll functions have to call i    116  * as all select/poll functions have to call it to add an entry to the
114  * poll table.                                    117  * poll table.
115  */                                               118  */
116 static void __pollwait(struct file *filp, wait    119 static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,
117                        poll_table *p);            120                        poll_table *p);
118                                                   121 
119 void poll_initwait(struct poll_wqueues *pwq)      122 void poll_initwait(struct poll_wqueues *pwq)
120 {                                                 123 {
121         init_poll_funcptr(&pwq->pt, __pollwait    124         init_poll_funcptr(&pwq->pt, __pollwait);
122         pwq->polling_task = current;              125         pwq->polling_task = current;
123         pwq->triggered = 0;                       126         pwq->triggered = 0;
124         pwq->error = 0;                           127         pwq->error = 0;
125         pwq->table = NULL;                        128         pwq->table = NULL;
126         pwq->inline_index = 0;                    129         pwq->inline_index = 0;
127 }                                                 130 }
128 EXPORT_SYMBOL(poll_initwait);                     131 EXPORT_SYMBOL(poll_initwait);
129                                                   132 
130 static void free_poll_entry(struct poll_table_    133 static void free_poll_entry(struct poll_table_entry *entry)
131 {                                                 134 {
132         remove_wait_queue(entry->wait_address,    135         remove_wait_queue(entry->wait_address, &entry->wait);
133         fput(entry->filp);                        136         fput(entry->filp);
134 }                                                 137 }
135                                                   138 
136 void poll_freewait(struct poll_wqueues *pwq)      139 void poll_freewait(struct poll_wqueues *pwq)
137 {                                                 140 {
138         struct poll_table_page * p = pwq->tabl    141         struct poll_table_page * p = pwq->table;
139         int i;                                    142         int i;
140         for (i = 0; i < pwq->inline_index; i++    143         for (i = 0; i < pwq->inline_index; i++)
141                 free_poll_entry(pwq->inline_en    144                 free_poll_entry(pwq->inline_entries + i);
142         while (p) {                               145         while (p) {
143                 struct poll_table_entry * entr    146                 struct poll_table_entry * entry;
144                 struct poll_table_page *old;      147                 struct poll_table_page *old;
145                                                   148 
146                 entry = p->entry;                 149                 entry = p->entry;
147                 do {                              150                 do {
148                         entry--;                  151                         entry--;
149                         free_poll_entry(entry)    152                         free_poll_entry(entry);
150                 } while (entry > p->entries);     153                 } while (entry > p->entries);
151                 old = p;                          154                 old = p;
152                 p = p->next;                      155                 p = p->next;
153                 free_page((unsigned long) old)    156                 free_page((unsigned long) old);
154         }                                         157         }
155 }                                                 158 }
156 EXPORT_SYMBOL(poll_freewait);                     159 EXPORT_SYMBOL(poll_freewait);
157                                                   160 
158 static struct poll_table_entry *poll_get_entry    161 static struct poll_table_entry *poll_get_entry(struct poll_wqueues *p)
159 {                                                 162 {
160         struct poll_table_page *table = p->tab    163         struct poll_table_page *table = p->table;
161                                                   164 
162         if (p->inline_index < N_INLINE_POLL_EN    165         if (p->inline_index < N_INLINE_POLL_ENTRIES)
163                 return p->inline_entries + p->    166                 return p->inline_entries + p->inline_index++;
164                                                   167 
165         if (!table || POLL_TABLE_FULL(table))     168         if (!table || POLL_TABLE_FULL(table)) {
166                 struct poll_table_page *new_ta    169                 struct poll_table_page *new_table;
167                                                   170 
168                 new_table = (struct poll_table    171                 new_table = (struct poll_table_page *) __get_free_page(GFP_KERNEL);
169                 if (!new_table) {                 172                 if (!new_table) {
170                         p->error = -ENOMEM;       173                         p->error = -ENOMEM;
171                         return NULL;              174                         return NULL;
172                 }                                 175                 }
173                 new_table->entry = new_table->    176                 new_table->entry = new_table->entries;
174                 new_table->next = table;          177                 new_table->next = table;
175                 p->table = new_table;             178                 p->table = new_table;
176                 table = new_table;                179                 table = new_table;
177         }                                         180         }
178                                                   181 
179         return table->entry++;                    182         return table->entry++;
180 }                                                 183 }
181                                                   184 
182 static int __pollwake(wait_queue_entry_t *wait    185 static int __pollwake(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
183 {                                                 186 {
184         struct poll_wqueues *pwq = wait->priva    187         struct poll_wqueues *pwq = wait->private;
185         DECLARE_WAITQUEUE(dummy_wait, pwq->pol    188         DECLARE_WAITQUEUE(dummy_wait, pwq->polling_task);
186                                                   189 
187         /*                                        190         /*
188          * Although this function is called un    191          * Although this function is called under waitqueue lock, LOCK
189          * doesn't imply write barrier and the    192          * doesn't imply write barrier and the users expect write
190          * barrier semantics on wakeup functio    193          * barrier semantics on wakeup functions.  The following
191          * smp_wmb() is equivalent to smp_wmb(    194          * smp_wmb() is equivalent to smp_wmb() in try_to_wake_up()
192          * and is paired with smp_store_mb() i    195          * and is paired with smp_store_mb() in poll_schedule_timeout.
193          */                                       196          */
194         smp_wmb();                                197         smp_wmb();
195         pwq->triggered = 1;                       198         pwq->triggered = 1;
196                                                   199 
197         /*                                        200         /*
198          * Perform the default wake up operati    201          * Perform the default wake up operation using a dummy
199          * waitqueue.                             202          * waitqueue.
200          *                                        203          *
201          * TODO: This is hacky but there curre    204          * TODO: This is hacky but there currently is no interface to
202          * pass in @sync.  @sync is scheduled     205          * pass in @sync.  @sync is scheduled to be removed and once
203          * that happens, wake_up_process() can    206          * that happens, wake_up_process() can be used directly.
204          */                                       207          */
205         return default_wake_function(&dummy_wa    208         return default_wake_function(&dummy_wait, mode, sync, key);
206 }                                                 209 }
207                                                   210 
208 static int pollwake(wait_queue_entry_t *wait,     211 static int pollwake(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
209 {                                                 212 {
210         struct poll_table_entry *entry;           213         struct poll_table_entry *entry;
211                                                   214 
212         entry = container_of(wait, struct poll    215         entry = container_of(wait, struct poll_table_entry, wait);
213         if (key && !(key_to_poll(key) & entry-    216         if (key && !(key_to_poll(key) & entry->key))
214                 return 0;                         217                 return 0;
215         return __pollwake(wait, mode, sync, ke    218         return __pollwake(wait, mode, sync, key);
216 }                                                 219 }
217                                                   220 
218 /* Add a new entry */                             221 /* Add a new entry */
219 static void __pollwait(struct file *filp, wait    222 static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,
220                                 poll_table *p)    223                                 poll_table *p)
221 {                                                 224 {
222         struct poll_wqueues *pwq = container_o    225         struct poll_wqueues *pwq = container_of(p, struct poll_wqueues, pt);
223         struct poll_table_entry *entry = poll_    226         struct poll_table_entry *entry = poll_get_entry(pwq);
224         if (!entry)                               227         if (!entry)
225                 return;                           228                 return;
226         entry->filp = get_file(filp);             229         entry->filp = get_file(filp);
227         entry->wait_address = wait_address;       230         entry->wait_address = wait_address;
228         entry->key = p->_key;                     231         entry->key = p->_key;
229         init_waitqueue_func_entry(&entry->wait    232         init_waitqueue_func_entry(&entry->wait, pollwake);
230         entry->wait.private = pwq;                233         entry->wait.private = pwq;
231         add_wait_queue(wait_address, &entry->w    234         add_wait_queue(wait_address, &entry->wait);
232 }                                                 235 }
233                                                   236 
234 static int poll_schedule_timeout(struct poll_w    237 static int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
235                           ktime_t *expires, un    238                           ktime_t *expires, unsigned long slack)
236 {                                                 239 {
237         int rc = -EINTR;                          240         int rc = -EINTR;
238                                                   241 
239         set_current_state(state);                 242         set_current_state(state);
240         if (!pwq->triggered)                      243         if (!pwq->triggered)
241                 rc = schedule_hrtimeout_range(    244                 rc = schedule_hrtimeout_range(expires, slack, HRTIMER_MODE_ABS);
242         __set_current_state(TASK_RUNNING);        245         __set_current_state(TASK_RUNNING);
243                                                   246 
244         /*                                        247         /*
245          * Prepare for the next iteration.        248          * Prepare for the next iteration.
246          *                                        249          *
247          * The following smp_store_mb() serves    250          * The following smp_store_mb() serves two purposes.  First, it's
248          * the counterpart rmb of the wmb in p    251          * the counterpart rmb of the wmb in pollwake() such that data
249          * written before wake up is always vi    252          * written before wake up is always visible after wake up.
250          * Second, the full barrier guarantees    253          * Second, the full barrier guarantees that triggered clearing
251          * doesn't pass event check of the nex    254          * doesn't pass event check of the next iteration.  Note that
252          * this problem doesn't exist for the     255          * this problem doesn't exist for the first iteration as
253          * add_wait_queue() has full barrier s    256          * add_wait_queue() has full barrier semantics.
254          */                                       257          */
255         smp_store_mb(pwq->triggered, 0);          258         smp_store_mb(pwq->triggered, 0);
256                                                   259 
257         return rc;                                260         return rc;
258 }                                                 261 }
259                                                   262 
260 /**                                               263 /**
261  * poll_select_set_timeout - helper function t    264  * poll_select_set_timeout - helper function to setup the timeout value
262  * @to:         pointer to timespec64 variable    265  * @to:         pointer to timespec64 variable for the final timeout
263  * @sec:        seconds (from user space)         266  * @sec:        seconds (from user space)
264  * @nsec:       nanoseconds (from user space)     267  * @nsec:       nanoseconds (from user space)
265  *                                                268  *
266  * Note, we do not use a timespec for the user    269  * Note, we do not use a timespec for the user space value here, That
267  * way we can use the function for timeval and    270  * way we can use the function for timeval and compat interfaces as well.
268  *                                                271  *
269  * Returns -EINVAL if sec/nsec are not normali    272  * Returns -EINVAL if sec/nsec are not normalized. Otherwise 0.
270  */                                               273  */
271 int poll_select_set_timeout(struct timespec64     274 int poll_select_set_timeout(struct timespec64 *to, time64_t sec, long nsec)
272 {                                                 275 {
273         struct timespec64 ts = {.tv_sec = sec,    276         struct timespec64 ts = {.tv_sec = sec, .tv_nsec = nsec};
274                                                   277 
275         if (!timespec64_valid(&ts))               278         if (!timespec64_valid(&ts))
276                 return -EINVAL;                   279                 return -EINVAL;
277                                                   280 
278         /* Optimize for the zero timeout value    281         /* Optimize for the zero timeout value here */
279         if (!sec && !nsec) {                      282         if (!sec && !nsec) {
280                 to->tv_sec = to->tv_nsec = 0;     283                 to->tv_sec = to->tv_nsec = 0;
281         } else {                                  284         } else {
282                 ktime_get_ts64(to);               285                 ktime_get_ts64(to);
283                 *to = timespec64_add_safe(*to,    286                 *to = timespec64_add_safe(*to, ts);
284         }                                         287         }
285         return 0;                                 288         return 0;
286 }                                                 289 }
287                                                   290 
288 enum poll_time_type {                             291 enum poll_time_type {
289         PT_TIMEVAL = 0,                           292         PT_TIMEVAL = 0,
290         PT_OLD_TIMEVAL = 1,                       293         PT_OLD_TIMEVAL = 1,
291         PT_TIMESPEC = 2,                          294         PT_TIMESPEC = 2,
292         PT_OLD_TIMESPEC = 3,                      295         PT_OLD_TIMESPEC = 3,
293 };                                                296 };
294                                                   297 
295 static int poll_select_finish(struct timespec6    298 static int poll_select_finish(struct timespec64 *end_time,
296                               void __user *p,     299                               void __user *p,
297                               enum poll_time_t    300                               enum poll_time_type pt_type, int ret)
298 {                                                 301 {
299         struct timespec64 rts;                    302         struct timespec64 rts;
300                                                   303 
301         restore_saved_sigmask_unless(ret == -E    304         restore_saved_sigmask_unless(ret == -ERESTARTNOHAND);
302                                                   305 
303         if (!p)                                   306         if (!p)
304                 return ret;                       307                 return ret;
305                                                   308 
306         if (current->personality & STICKY_TIME    309         if (current->personality & STICKY_TIMEOUTS)
307                 goto sticky;                      310                 goto sticky;
308                                                   311 
309         /* No update for zero timeout */          312         /* No update for zero timeout */
310         if (!end_time->tv_sec && !end_time->tv    313         if (!end_time->tv_sec && !end_time->tv_nsec)
311                 return ret;                       314                 return ret;
312                                                   315 
313         ktime_get_ts64(&rts);                     316         ktime_get_ts64(&rts);
314         rts = timespec64_sub(*end_time, rts);     317         rts = timespec64_sub(*end_time, rts);
315         if (rts.tv_sec < 0)                       318         if (rts.tv_sec < 0)
316                 rts.tv_sec = rts.tv_nsec = 0;     319                 rts.tv_sec = rts.tv_nsec = 0;
317                                                   320 
318                                                   321 
319         switch (pt_type) {                        322         switch (pt_type) {
320         case PT_TIMEVAL:                          323         case PT_TIMEVAL:
321                 {                                 324                 {
322                         struct __kernel_old_ti    325                         struct __kernel_old_timeval rtv;
323                                                   326 
324                         if (sizeof(rtv) > size    327                         if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec))
325                                 memset(&rtv, 0    328                                 memset(&rtv, 0, sizeof(rtv));
326                         rtv.tv_sec = rts.tv_se    329                         rtv.tv_sec = rts.tv_sec;
327                         rtv.tv_usec = rts.tv_n    330                         rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC;
328                         if (!copy_to_user(p, &    331                         if (!copy_to_user(p, &rtv, sizeof(rtv)))
329                                 return ret;       332                                 return ret;
330                 }                                 333                 }
331                 break;                            334                 break;
332         case PT_OLD_TIMEVAL:                      335         case PT_OLD_TIMEVAL:
333                 {                                 336                 {
334                         struct old_timeval32 r    337                         struct old_timeval32 rtv;
335                                                   338 
336                         rtv.tv_sec = rts.tv_se    339                         rtv.tv_sec = rts.tv_sec;
337                         rtv.tv_usec = rts.tv_n    340                         rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC;
338                         if (!copy_to_user(p, &    341                         if (!copy_to_user(p, &rtv, sizeof(rtv)))
339                                 return ret;       342                                 return ret;
340                 }                                 343                 }
341                 break;                            344                 break;
342         case PT_TIMESPEC:                         345         case PT_TIMESPEC:
343                 if (!put_timespec64(&rts, p))     346                 if (!put_timespec64(&rts, p))
344                         return ret;               347                         return ret;
345                 break;                            348                 break;
346         case PT_OLD_TIMESPEC:                     349         case PT_OLD_TIMESPEC:
347                 if (!put_old_timespec32(&rts,     350                 if (!put_old_timespec32(&rts, p))
348                         return ret;               351                         return ret;
349                 break;                            352                 break;
350         default:                                  353         default:
351                 BUG();                            354                 BUG();
352         }                                         355         }
353         /*                                        356         /*
354          * If an application puts its timeval     357          * If an application puts its timeval in read-only memory, we
355          * don't want the Linux-specific updat    358          * don't want the Linux-specific update to the timeval to
356          * cause a fault after the select has     359          * cause a fault after the select has completed
357          * successfully. However, because we'r    360          * successfully. However, because we're not updating the
358          * timeval, we can't restart the syste    361          * timeval, we can't restart the system call.
359          */                                       362          */
360                                                   363 
361 sticky:                                           364 sticky:
362         if (ret == -ERESTARTNOHAND)               365         if (ret == -ERESTARTNOHAND)
363                 ret = -EINTR;                     366                 ret = -EINTR;
364         return ret;                               367         return ret;
365 }                                                 368 }
366                                                   369 
367 /*                                                370 /*
368  * Scalable version of the fd_set.                371  * Scalable version of the fd_set.
369  */                                               372  */
370                                                   373 
371 typedef struct {                                  374 typedef struct {
372         unsigned long *in, *out, *ex;             375         unsigned long *in, *out, *ex;
373         unsigned long *res_in, *res_out, *res_    376         unsigned long *res_in, *res_out, *res_ex;
374 } fd_set_bits;                                    377 } fd_set_bits;
375                                                   378 
376 /*                                                379 /*
377  * How many longwords for "nr" bits?              380  * How many longwords for "nr" bits?
378  */                                               381  */
379 #define FDS_BITPERLONG  (8*sizeof(long))          382 #define FDS_BITPERLONG  (8*sizeof(long))
380 #define FDS_LONGS(nr)   (((nr)+FDS_BITPERLONG-    383 #define FDS_LONGS(nr)   (((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG)
381 #define FDS_BYTES(nr)   (FDS_LONGS(nr)*sizeof(    384 #define FDS_BYTES(nr)   (FDS_LONGS(nr)*sizeof(long))
382                                                   385 
383 /*                                                386 /*
384  * Use "unsigned long" accesses to let user-mo    387  * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
385  */                                               388  */
386 static inline                                     389 static inline
387 int get_fd_set(unsigned long nr, void __user *    390 int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
388 {                                                 391 {
389         nr = FDS_BYTES(nr);                       392         nr = FDS_BYTES(nr);
390         if (ufdset)                               393         if (ufdset)
391                 return copy_from_user(fdset, u    394                 return copy_from_user(fdset, ufdset, nr) ? -EFAULT : 0;
392                                                   395 
393         memset(fdset, 0, nr);                     396         memset(fdset, 0, nr);
394         return 0;                                 397         return 0;
395 }                                                 398 }
396                                                   399 
397 static inline unsigned long __must_check          400 static inline unsigned long __must_check
398 set_fd_set(unsigned long nr, void __user *ufds    401 set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
399 {                                                 402 {
400         if (ufdset)                               403         if (ufdset)
401                 return __copy_to_user(ufdset,     404                 return __copy_to_user(ufdset, fdset, FDS_BYTES(nr));
402         return 0;                                 405         return 0;
403 }                                                 406 }
404                                                   407 
405 static inline                                     408 static inline
406 void zero_fd_set(unsigned long nr, unsigned lo    409 void zero_fd_set(unsigned long nr, unsigned long *fdset)
407 {                                                 410 {
408         memset(fdset, 0, FDS_BYTES(nr));          411         memset(fdset, 0, FDS_BYTES(nr));
409 }                                                 412 }
410                                                   413 
411 #define FDS_IN(fds, n)          (fds->in + n)     414 #define FDS_IN(fds, n)          (fds->in + n)
412 #define FDS_OUT(fds, n)         (fds->out + n)    415 #define FDS_OUT(fds, n)         (fds->out + n)
413 #define FDS_EX(fds, n)          (fds->ex + n)     416 #define FDS_EX(fds, n)          (fds->ex + n)
414                                                   417 
415 #define BITS(fds, n)    (*FDS_IN(fds, n)|*FDS_    418 #define BITS(fds, n)    (*FDS_IN(fds, n)|*FDS_OUT(fds, n)|*FDS_EX(fds, n))
416                                                   419 
417 static int max_select_fd(unsigned long n, fd_s    420 static int max_select_fd(unsigned long n, fd_set_bits *fds)
418 {                                                 421 {
419         unsigned long *open_fds;                  422         unsigned long *open_fds;
420         unsigned long set;                        423         unsigned long set;
421         int max;                                  424         int max;
422         struct fdtable *fdt;                      425         struct fdtable *fdt;
423                                                   426 
424         /* handle last in-complete long-word f    427         /* handle last in-complete long-word first */
425         set = ~(~0UL << (n & (BITS_PER_LONG-1)    428         set = ~(~0UL << (n & (BITS_PER_LONG-1)));
426         n /= BITS_PER_LONG;                       429         n /= BITS_PER_LONG;
427         fdt = files_fdtable(current->files);      430         fdt = files_fdtable(current->files);
428         open_fds = fdt->open_fds + n;             431         open_fds = fdt->open_fds + n;
429         max = 0;                                  432         max = 0;
430         if (set) {                                433         if (set) {
431                 set &= BITS(fds, n);              434                 set &= BITS(fds, n);
432                 if (set) {                        435                 if (set) {
433                         if (!(set & ~*open_fds    436                         if (!(set & ~*open_fds))
434                                 goto get_max;     437                                 goto get_max;
435                         return -EBADF;            438                         return -EBADF;
436                 }                                 439                 }
437         }                                         440         }
438         while (n) {                               441         while (n) {
439                 open_fds--;                       442                 open_fds--;
440                 n--;                              443                 n--;
441                 set = BITS(fds, n);               444                 set = BITS(fds, n);
442                 if (!set)                         445                 if (!set)
443                         continue;                 446                         continue;
444                 if (set & ~*open_fds)             447                 if (set & ~*open_fds)
445                         return -EBADF;            448                         return -EBADF;
446                 if (max)                          449                 if (max)
447                         continue;                 450                         continue;
448 get_max:                                          451 get_max:
449                 do {                              452                 do {
450                         max++;                    453                         max++;
451                         set >>= 1;                454                         set >>= 1;
452                 } while (set);                    455                 } while (set);
453                 max += n * BITS_PER_LONG;         456                 max += n * BITS_PER_LONG;
454         }                                         457         }
455                                                   458 
456         return max;                               459         return max;
457 }                                                 460 }
458                                                   461 
459 #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND     462 #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | EPOLLHUP | EPOLLERR |\
460                         EPOLLNVAL)                463                         EPOLLNVAL)
461 #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM    464 #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT | EPOLLERR |\
462                          EPOLLNVAL)               465                          EPOLLNVAL)
463 #define POLLEX_SET (EPOLLPRI | EPOLLNVAL)         466 #define POLLEX_SET (EPOLLPRI | EPOLLNVAL)
464                                                   467 
465 static inline void wait_key_set(poll_table *wa    468 static inline void wait_key_set(poll_table *wait, unsigned long in,
466                                 unsigned long     469                                 unsigned long out, unsigned long bit,
467                                 __poll_t ll_fl    470                                 __poll_t ll_flag)
468 {                                                 471 {
469         wait->_key = POLLEX_SET | ll_flag;        472         wait->_key = POLLEX_SET | ll_flag;
470         if (in & bit)                             473         if (in & bit)
471                 wait->_key |= POLLIN_SET;         474                 wait->_key |= POLLIN_SET;
472         if (out & bit)                            475         if (out & bit)
473                 wait->_key |= POLLOUT_SET;        476                 wait->_key |= POLLOUT_SET;
474 }                                                 477 }
475                                                   478 
476 static noinline_for_stack int do_select(int n,    479 static noinline_for_stack int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
477 {                                                 480 {
478         ktime_t expire, *to = NULL;               481         ktime_t expire, *to = NULL;
479         struct poll_wqueues table;                482         struct poll_wqueues table;
480         poll_table *wait;                         483         poll_table *wait;
481         int retval, i, timed_out = 0;             484         int retval, i, timed_out = 0;
482         u64 slack = 0;                            485         u64 slack = 0;
483         __poll_t busy_flag = net_busy_loop_on(    486         __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
484         unsigned long busy_start = 0;             487         unsigned long busy_start = 0;
485                                                   488 
486         rcu_read_lock();                          489         rcu_read_lock();
487         retval = max_select_fd(n, fds);           490         retval = max_select_fd(n, fds);
488         rcu_read_unlock();                        491         rcu_read_unlock();
489                                                   492 
490         if (retval < 0)                           493         if (retval < 0)
491                 return retval;                    494                 return retval;
492         n = retval;                               495         n = retval;
493                                                   496 
494         poll_initwait(&table);                    497         poll_initwait(&table);
495         wait = &table.pt;                         498         wait = &table.pt;
496         if (end_time && !end_time->tv_sec && !    499         if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
497                 wait->_qproc = NULL;              500                 wait->_qproc = NULL;
498                 timed_out = 1;                    501                 timed_out = 1;
499         }                                         502         }
500                                                   503 
501         if (end_time && !timed_out)               504         if (end_time && !timed_out)
502                 slack = select_estimate_accura    505                 slack = select_estimate_accuracy(end_time);
503                                                   506 
504         retval = 0;                               507         retval = 0;
505         for (;;) {                                508         for (;;) {
506                 unsigned long *rinp, *routp, *    509                 unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;
507                 bool can_busy_loop = false;       510                 bool can_busy_loop = false;
508                                                   511 
509                 inp = fds->in; outp = fds->out    512                 inp = fds->in; outp = fds->out; exp = fds->ex;
510                 rinp = fds->res_in; routp = fd    513                 rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;
511                                                   514 
512                 for (i = 0; i < n; ++rinp, ++r    515                 for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
513                         unsigned long in, out,    516                         unsigned long in, out, ex, all_bits, bit = 1, j;
514                         unsigned long res_in =    517                         unsigned long res_in = 0, res_out = 0, res_ex = 0;
515                         __poll_t mask;            518                         __poll_t mask;
516                                                   519 
517                         in = *inp++; out = *ou    520                         in = *inp++; out = *outp++; ex = *exp++;
518                         all_bits = in | out |     521                         all_bits = in | out | ex;
519                         if (all_bits == 0) {      522                         if (all_bits == 0) {
520                                 i += BITS_PER_    523                                 i += BITS_PER_LONG;
521                                 continue;         524                                 continue;
522                         }                         525                         }
523                                                   526 
524                         for (j = 0; j < BITS_P    527                         for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) {
525                                 struct fd f;      528                                 struct fd f;
526                                 if (i >= n)       529                                 if (i >= n)
527                                         break;    530                                         break;
528                                 if (!(bit & al    531                                 if (!(bit & all_bits))
529                                         contin    532                                         continue;
530                                 mask = EPOLLNV    533                                 mask = EPOLLNVAL;
531                                 f = fdget(i);     534                                 f = fdget(i);
532                                 if (fd_file(f) !! 535                                 if (f.file) {
533                                         wait_k    536                                         wait_key_set(wait, in, out, bit,
534                                                   537                                                      busy_flag);
535                                         mask = !! 538                                         mask = vfs_poll(f.file, wait);
536                                                   539 
537                                         fdput(    540                                         fdput(f);
538                                 }                 541                                 }
539                                 if ((mask & PO    542                                 if ((mask & POLLIN_SET) && (in & bit)) {
540                                         res_in    543                                         res_in |= bit;
541                                         retval    544                                         retval++;
542                                         wait->    545                                         wait->_qproc = NULL;
543                                 }                 546                                 }
544                                 if ((mask & PO    547                                 if ((mask & POLLOUT_SET) && (out & bit)) {
545                                         res_ou    548                                         res_out |= bit;
546                                         retval    549                                         retval++;
547                                         wait->    550                                         wait->_qproc = NULL;
548                                 }                 551                                 }
549                                 if ((mask & PO    552                                 if ((mask & POLLEX_SET) && (ex & bit)) {
550                                         res_ex    553                                         res_ex |= bit;
551                                         retval    554                                         retval++;
552                                         wait->    555                                         wait->_qproc = NULL;
553                                 }                 556                                 }
554                                 /* got somethi    557                                 /* got something, stop busy polling */
555                                 if (retval) {     558                                 if (retval) {
556                                         can_bu    559                                         can_busy_loop = false;
557                                         busy_f    560                                         busy_flag = 0;
558                                                   561 
559                                 /*                562                                 /*
560                                  * only rememb    563                                  * only remember a returned
561                                  * POLL_BUSY_L    564                                  * POLL_BUSY_LOOP if we asked for it
562                                  */               565                                  */
563                                 } else if (bus    566                                 } else if (busy_flag & mask)
564                                         can_bu    567                                         can_busy_loop = true;
565                                                   568 
566                         }                         569                         }
567                         if (res_in)               570                         if (res_in)
568                                 *rinp = res_in    571                                 *rinp = res_in;
569                         if (res_out)              572                         if (res_out)
570                                 *routp = res_o    573                                 *routp = res_out;
571                         if (res_ex)               574                         if (res_ex)
572                                 *rexp = res_ex    575                                 *rexp = res_ex;
573                         cond_resched();           576                         cond_resched();
574                 }                                 577                 }
575                 wait->_qproc = NULL;              578                 wait->_qproc = NULL;
576                 if (retval || timed_out || sig    579                 if (retval || timed_out || signal_pending(current))
577                         break;                    580                         break;
578                 if (table.error) {                581                 if (table.error) {
579                         retval = table.error;     582                         retval = table.error;
580                         break;                    583                         break;
581                 }                                 584                 }
582                                                   585 
583                 /* only if found POLL_BUSY_LOO    586                 /* only if found POLL_BUSY_LOOP sockets && not out of time */
584                 if (can_busy_loop && !need_res    587                 if (can_busy_loop && !need_resched()) {
585                         if (!busy_start) {        588                         if (!busy_start) {
586                                 busy_start = b    589                                 busy_start = busy_loop_current_time();
587                                 continue;         590                                 continue;
588                         }                         591                         }
589                         if (!busy_loop_timeout    592                         if (!busy_loop_timeout(busy_start))
590                                 continue;         593                                 continue;
591                 }                                 594                 }
592                 busy_flag = 0;                    595                 busy_flag = 0;
593                                                   596 
594                 /*                                597                 /*
595                  * If this is the first loop a    598                  * If this is the first loop and we have a timeout
596                  * given, then we convert to k    599                  * given, then we convert to ktime_t and set the to
597                  * pointer to the expiry value    600                  * pointer to the expiry value.
598                  */                               601                  */
599                 if (end_time && !to) {            602                 if (end_time && !to) {
600                         expire = timespec64_to    603                         expire = timespec64_to_ktime(*end_time);
601                         to = &expire;             604                         to = &expire;
602                 }                                 605                 }
603                                                   606 
604                 if (!poll_schedule_timeout(&ta    607                 if (!poll_schedule_timeout(&table, TASK_INTERRUPTIBLE,
605                                            to,    608                                            to, slack))
606                         timed_out = 1;            609                         timed_out = 1;
607         }                                         610         }
608                                                   611 
609         poll_freewait(&table);                    612         poll_freewait(&table);
610                                                   613 
611         return retval;                            614         return retval;
612 }                                                 615 }
613                                                   616 
614 /*                                                617 /*
615  * We can actually return ERESTARTSYS instead     618  * We can actually return ERESTARTSYS instead of EINTR, but I'd
616  * like to be certain this leads to no problem    619  * like to be certain this leads to no problems. So I return
617  * EINTR just for safety.                         620  * EINTR just for safety.
618  *                                                621  *
619  * Update: ERESTARTSYS breaks at least the xvi    622  * Update: ERESTARTSYS breaks at least the xview clock binary, so
620  * I'm trying ERESTARTNOHAND which restart onl    623  * I'm trying ERESTARTNOHAND which restart only when you want to.
621  */                                               624  */
622 int core_sys_select(int n, fd_set __user *inp,    625 int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
623                            fd_set __user *exp,    626                            fd_set __user *exp, struct timespec64 *end_time)
624 {                                                 627 {
625         fd_set_bits fds;                          628         fd_set_bits fds;
626         void *bits;                               629         void *bits;
627         int ret, max_fds;                         630         int ret, max_fds;
628         size_t size, alloc_size;                  631         size_t size, alloc_size;
629         struct fdtable *fdt;                      632         struct fdtable *fdt;
630         /* Allocate small arguments on the sta    633         /* Allocate small arguments on the stack to save memory and be faster */
631         long stack_fds[SELECT_STACK_ALLOC/size    634         long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
632                                                   635 
633         ret = -EINVAL;                            636         ret = -EINVAL;
634         if (n < 0)                                637         if (n < 0)
635                 goto out_nofds;                   638                 goto out_nofds;
636                                                   639 
637         /* max_fds can increase, so grab it on    640         /* max_fds can increase, so grab it once to avoid race */
638         rcu_read_lock();                          641         rcu_read_lock();
639         fdt = files_fdtable(current->files);      642         fdt = files_fdtable(current->files);
640         max_fds = fdt->max_fds;                   643         max_fds = fdt->max_fds;
641         rcu_read_unlock();                        644         rcu_read_unlock();
642         if (n > max_fds)                          645         if (n > max_fds)
643                 n = max_fds;                      646                 n = max_fds;
644                                                   647 
645         /*                                        648         /*
646          * We need 6 bitmaps (in/out/ex for bo    649          * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
647          * since we used fdset we need to allo    650          * since we used fdset we need to allocate memory in units of
648          * long-words.                            651          * long-words. 
649          */                                       652          */
650         size = FDS_BYTES(n);                      653         size = FDS_BYTES(n);
651         bits = stack_fds;                         654         bits = stack_fds;
652         if (size > sizeof(stack_fds) / 6) {       655         if (size > sizeof(stack_fds) / 6) {
653                 /* Not enough space in on-stac    656                 /* Not enough space in on-stack array; must use kmalloc */
654                 ret = -ENOMEM;                    657                 ret = -ENOMEM;
655                 if (size > (SIZE_MAX / 6))        658                 if (size > (SIZE_MAX / 6))
656                         goto out_nofds;           659                         goto out_nofds;
657                                                   660 
658                 alloc_size = 6 * size;            661                 alloc_size = 6 * size;
659                 bits = kvmalloc(alloc_size, GF    662                 bits = kvmalloc(alloc_size, GFP_KERNEL);
660                 if (!bits)                        663                 if (!bits)
661                         goto out_nofds;           664                         goto out_nofds;
662         }                                         665         }
663         fds.in      = bits;                       666         fds.in      = bits;
664         fds.out     = bits +   size;              667         fds.out     = bits +   size;
665         fds.ex      = bits + 2*size;              668         fds.ex      = bits + 2*size;
666         fds.res_in  = bits + 3*size;              669         fds.res_in  = bits + 3*size;
667         fds.res_out = bits + 4*size;              670         fds.res_out = bits + 4*size;
668         fds.res_ex  = bits + 5*size;              671         fds.res_ex  = bits + 5*size;
669                                                   672 
670         if ((ret = get_fd_set(n, inp, fds.in))    673         if ((ret = get_fd_set(n, inp, fds.in)) ||
671             (ret = get_fd_set(n, outp, fds.out    674             (ret = get_fd_set(n, outp, fds.out)) ||
672             (ret = get_fd_set(n, exp, fds.ex))    675             (ret = get_fd_set(n, exp, fds.ex)))
673                 goto out;                         676                 goto out;
674         zero_fd_set(n, fds.res_in);               677         zero_fd_set(n, fds.res_in);
675         zero_fd_set(n, fds.res_out);              678         zero_fd_set(n, fds.res_out);
676         zero_fd_set(n, fds.res_ex);               679         zero_fd_set(n, fds.res_ex);
677                                                   680 
678         ret = do_select(n, &fds, end_time);       681         ret = do_select(n, &fds, end_time);
679                                                   682 
680         if (ret < 0)                              683         if (ret < 0)
681                 goto out;                         684                 goto out;
682         if (!ret) {                               685         if (!ret) {
683                 ret = -ERESTARTNOHAND;            686                 ret = -ERESTARTNOHAND;
684                 if (signal_pending(current))      687                 if (signal_pending(current))
685                         goto out;                 688                         goto out;
686                 ret = 0;                          689                 ret = 0;
687         }                                         690         }
688                                                   691 
689         if (set_fd_set(n, inp, fds.res_in) ||     692         if (set_fd_set(n, inp, fds.res_in) ||
690             set_fd_set(n, outp, fds.res_out) |    693             set_fd_set(n, outp, fds.res_out) ||
691             set_fd_set(n, exp, fds.res_ex))       694             set_fd_set(n, exp, fds.res_ex))
692                 ret = -EFAULT;                    695                 ret = -EFAULT;
693                                                   696 
694 out:                                              697 out:
695         if (bits != stack_fds)                    698         if (bits != stack_fds)
696                 kvfree(bits);                     699                 kvfree(bits);
697 out_nofds:                                        700 out_nofds:
698         return ret;                               701         return ret;
699 }                                                 702 }
700                                                   703 
701 static int kern_select(int n, fd_set __user *i    704 static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
702                        fd_set __user *exp, str    705                        fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
703 {                                                 706 {
704         struct timespec64 end_time, *to = NULL    707         struct timespec64 end_time, *to = NULL;
705         struct __kernel_old_timeval tv;           708         struct __kernel_old_timeval tv;
706         int ret;                                  709         int ret;
707                                                   710 
708         if (tvp) {                                711         if (tvp) {
709                 if (copy_from_user(&tv, tvp, s    712                 if (copy_from_user(&tv, tvp, sizeof(tv)))
710                         return -EFAULT;           713                         return -EFAULT;
711                                                   714 
712                 to = &end_time;                   715                 to = &end_time;
713                 if (poll_select_set_timeout(to    716                 if (poll_select_set_timeout(to,
714                                 tv.tv_sec + (t    717                                 tv.tv_sec + (tv.tv_usec / USEC_PER_SEC),
715                                 (tv.tv_usec %     718                                 (tv.tv_usec % USEC_PER_SEC) * NSEC_PER_USEC))
716                         return -EINVAL;           719                         return -EINVAL;
717         }                                         720         }
718                                                   721 
719         ret = core_sys_select(n, inp, outp, ex    722         ret = core_sys_select(n, inp, outp, exp, to);
720         return poll_select_finish(&end_time, t    723         return poll_select_finish(&end_time, tvp, PT_TIMEVAL, ret);
721 }                                                 724 }
722                                                   725 
723 SYSCALL_DEFINE5(select, int, n, fd_set __user     726 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
724                 fd_set __user *, exp, struct _    727                 fd_set __user *, exp, struct __kernel_old_timeval __user *, tvp)
725 {                                                 728 {
726         return kern_select(n, inp, outp, exp,     729         return kern_select(n, inp, outp, exp, tvp);
727 }                                                 730 }
728                                                   731 
729 static long do_pselect(int n, fd_set __user *i    732 static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
730                        fd_set __user *exp, voi    733                        fd_set __user *exp, void __user *tsp,
731                        const sigset_t __user *    734                        const sigset_t __user *sigmask, size_t sigsetsize,
732                        enum poll_time_type typ    735                        enum poll_time_type type)
733 {                                                 736 {
734         struct timespec64 ts, end_time, *to =     737         struct timespec64 ts, end_time, *to = NULL;
735         int ret;                                  738         int ret;
736                                                   739 
737         if (tsp) {                                740         if (tsp) {
738                 switch (type) {                   741                 switch (type) {
739                 case PT_TIMESPEC:                 742                 case PT_TIMESPEC:
740                         if (get_timespec64(&ts    743                         if (get_timespec64(&ts, tsp))
741                                 return -EFAULT    744                                 return -EFAULT;
742                         break;                    745                         break;
743                 case PT_OLD_TIMESPEC:             746                 case PT_OLD_TIMESPEC:
744                         if (get_old_timespec32    747                         if (get_old_timespec32(&ts, tsp))
745                                 return -EFAULT    748                                 return -EFAULT;
746                         break;                    749                         break;
747                 default:                          750                 default:
748                         BUG();                    751                         BUG();
749                 }                                 752                 }
750                                                   753 
751                 to = &end_time;                   754                 to = &end_time;
752                 if (poll_select_set_timeout(to    755                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
753                         return -EINVAL;           756                         return -EINVAL;
754         }                                         757         }
755                                                   758 
756         ret = set_user_sigmask(sigmask, sigset    759         ret = set_user_sigmask(sigmask, sigsetsize);
757         if (ret)                                  760         if (ret)
758                 return ret;                       761                 return ret;
759                                                   762 
760         ret = core_sys_select(n, inp, outp, ex    763         ret = core_sys_select(n, inp, outp, exp, to);
761         return poll_select_finish(&end_time, t    764         return poll_select_finish(&end_time, tsp, type, ret);
762 }                                                 765 }
763                                                   766 
764 /*                                                767 /*
765  * Most architectures can't handle 7-argument     768  * Most architectures can't handle 7-argument syscalls. So we provide a
766  * 6-argument version where the sixth argument    769  * 6-argument version where the sixth argument is a pointer to a structure
767  * which has a pointer to the sigset_t itself     770  * which has a pointer to the sigset_t itself followed by a size_t containing
768  * the sigset size.                               771  * the sigset size.
769  */                                               772  */
770 struct sigset_argpack {                           773 struct sigset_argpack {
771         sigset_t __user *p;                       774         sigset_t __user *p;
772         size_t size;                              775         size_t size;
773 };                                                776 };
774                                                   777 
775 static inline int get_sigset_argpack(struct si    778 static inline int get_sigset_argpack(struct sigset_argpack *to,
776                                      struct si    779                                      struct sigset_argpack __user *from)
777 {                                                 780 {
778         // the path is hot enough for overhead    781         // the path is hot enough for overhead of copy_from_user() to matter
779         if (from) {                               782         if (from) {
780                 if (can_do_masked_user_access( !! 783                 if (!user_read_access_begin(from, sizeof(*from)))
781                         from = masked_user_acc << 
782                 else if (!user_read_access_beg << 
783                         return -EFAULT;           784                         return -EFAULT;
784                 unsafe_get_user(to->p, &from->    785                 unsafe_get_user(to->p, &from->p, Efault);
785                 unsafe_get_user(to->size, &fro    786                 unsafe_get_user(to->size, &from->size, Efault);
786                 user_read_access_end();           787                 user_read_access_end();
787         }                                         788         }
788         return 0;                                 789         return 0;
789 Efault:                                           790 Efault:
790         user_access_end();                        791         user_access_end();
791         return -EFAULT;                           792         return -EFAULT;
792 }                                                 793 }
793                                                   794 
794 SYSCALL_DEFINE6(pselect6, int, n, fd_set __use    795 SYSCALL_DEFINE6(pselect6, int, n, fd_set __user *, inp, fd_set __user *, outp,
795                 fd_set __user *, exp, struct _    796                 fd_set __user *, exp, struct __kernel_timespec __user *, tsp,
796                 void __user *, sig)               797                 void __user *, sig)
797 {                                                 798 {
798         struct sigset_argpack x = {NULL, 0};      799         struct sigset_argpack x = {NULL, 0};
799                                                   800 
800         if (get_sigset_argpack(&x, sig))          801         if (get_sigset_argpack(&x, sig))
801                 return -EFAULT;                   802                 return -EFAULT;
802                                                   803 
803         return do_pselect(n, inp, outp, exp, t    804         return do_pselect(n, inp, outp, exp, tsp, x.p, x.size, PT_TIMESPEC);
804 }                                                 805 }
805                                                   806 
806 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defi    807 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defined(CONFIG_64BIT)
807                                                   808 
808 SYSCALL_DEFINE6(pselect6_time32, int, n, fd_se    809 SYSCALL_DEFINE6(pselect6_time32, int, n, fd_set __user *, inp, fd_set __user *, outp,
809                 fd_set __user *, exp, struct o    810                 fd_set __user *, exp, struct old_timespec32 __user *, tsp,
810                 void __user *, sig)               811                 void __user *, sig)
811 {                                                 812 {
812         struct sigset_argpack x = {NULL, 0};      813         struct sigset_argpack x = {NULL, 0};
813                                                   814 
814         if (get_sigset_argpack(&x, sig))          815         if (get_sigset_argpack(&x, sig))
815                 return -EFAULT;                   816                 return -EFAULT;
816                                                   817 
817         return do_pselect(n, inp, outp, exp, t    818         return do_pselect(n, inp, outp, exp, tsp, x.p, x.size, PT_OLD_TIMESPEC);
818 }                                                 819 }
819                                                   820 
820 #endif                                            821 #endif
821                                                   822 
822 #ifdef __ARCH_WANT_SYS_OLD_SELECT                 823 #ifdef __ARCH_WANT_SYS_OLD_SELECT
823 struct sel_arg_struct {                           824 struct sel_arg_struct {
824         unsigned long n;                          825         unsigned long n;
825         fd_set __user *inp, *outp, *exp;          826         fd_set __user *inp, *outp, *exp;
826         struct __kernel_old_timeval __user *tv    827         struct __kernel_old_timeval __user *tvp;
827 };                                                828 };
828                                                   829 
829 SYSCALL_DEFINE1(old_select, struct sel_arg_str    830 SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
830 {                                                 831 {
831         struct sel_arg_struct a;                  832         struct sel_arg_struct a;
832                                                   833 
833         if (copy_from_user(&a, arg, sizeof(a))    834         if (copy_from_user(&a, arg, sizeof(a)))
834                 return -EFAULT;                   835                 return -EFAULT;
835         return kern_select(a.n, a.inp, a.outp,    836         return kern_select(a.n, a.inp, a.outp, a.exp, a.tvp);
836 }                                                 837 }
837 #endif                                            838 #endif
838                                                   839 
839 struct poll_list {                                840 struct poll_list {
840         struct poll_list *next;                   841         struct poll_list *next;
841         unsigned int len;                      !! 842         int len;
842         struct pollfd entries[] __counted_by(l !! 843         struct pollfd entries[];
843 };                                                844 };
844                                                   845 
845 #define POLLFD_PER_PAGE  ((PAGE_SIZE-sizeof(st    846 #define POLLFD_PER_PAGE  ((PAGE_SIZE-sizeof(struct poll_list)) / sizeof(struct pollfd))
846                                                   847 
847 /*                                                848 /*
848  * Fish for pollable events on the pollfd->fd     849  * Fish for pollable events on the pollfd->fd file descriptor. We're only
849  * interested in events matching the pollfd->e    850  * interested in events matching the pollfd->events mask, and the result
850  * matching that mask is both recorded in poll    851  * matching that mask is both recorded in pollfd->revents and returned. The
851  * pwait poll_table will be used by the fd-pro    852  * pwait poll_table will be used by the fd-provided poll handler for waiting,
852  * if pwait->_qproc is non-NULL.                  853  * if pwait->_qproc is non-NULL.
853  */                                               854  */
854 static inline __poll_t do_pollfd(struct pollfd    855 static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
855                                      bool *can    856                                      bool *can_busy_poll,
856                                      __poll_t     857                                      __poll_t busy_flag)
857 {                                                 858 {
858         int fd = pollfd->fd;                      859         int fd = pollfd->fd;
859         __poll_t mask = 0, filter;                860         __poll_t mask = 0, filter;
860         struct fd f;                              861         struct fd f;
861                                                   862 
862         if (fd < 0)                               863         if (fd < 0)
863                 goto out;                         864                 goto out;
864         mask = EPOLLNVAL;                         865         mask = EPOLLNVAL;
865         f = fdget(fd);                            866         f = fdget(fd);
866         if (!fd_file(f))                       !! 867         if (!f.file)
867                 goto out;                         868                 goto out;
868                                                   869 
869         /* userland u16 ->events contains POLL    870         /* userland u16 ->events contains POLL... bitmap */
870         filter = demangle_poll(pollfd->events)    871         filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
871         pwait->_key = filter | busy_flag;         872         pwait->_key = filter | busy_flag;
872         mask = vfs_poll(fd_file(f), pwait);    !! 873         mask = vfs_poll(f.file, pwait);
873         if (mask & busy_flag)                     874         if (mask & busy_flag)
874                 *can_busy_poll = true;            875                 *can_busy_poll = true;
875         mask &= filter;         /* Mask out un    876         mask &= filter;         /* Mask out unneeded events. */
876         fdput(f);                                 877         fdput(f);
877                                                   878 
878 out:                                              879 out:
879         /* ... and so does ->revents */           880         /* ... and so does ->revents */
880         pollfd->revents = mangle_poll(mask);      881         pollfd->revents = mangle_poll(mask);
881         return mask;                              882         return mask;
882 }                                                 883 }
883                                                   884 
884 static int do_poll(struct poll_list *list, str    885 static int do_poll(struct poll_list *list, struct poll_wqueues *wait,
885                    struct timespec64 *end_time    886                    struct timespec64 *end_time)
886 {                                                 887 {
887         poll_table* pt = &wait->pt;               888         poll_table* pt = &wait->pt;
888         ktime_t expire, *to = NULL;               889         ktime_t expire, *to = NULL;
889         int timed_out = 0, count = 0;             890         int timed_out = 0, count = 0;
890         u64 slack = 0;                            891         u64 slack = 0;
891         __poll_t busy_flag = net_busy_loop_on(    892         __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
892         unsigned long busy_start = 0;             893         unsigned long busy_start = 0;
893                                                   894 
894         /* Optimise the no-wait case */           895         /* Optimise the no-wait case */
895         if (end_time && !end_time->tv_sec && !    896         if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
896                 pt->_qproc = NULL;                897                 pt->_qproc = NULL;
897                 timed_out = 1;                    898                 timed_out = 1;
898         }                                         899         }
899                                                   900 
900         if (end_time && !timed_out)               901         if (end_time && !timed_out)
901                 slack = select_estimate_accura    902                 slack = select_estimate_accuracy(end_time);
902                                                   903 
903         for (;;) {                                904         for (;;) {
904                 struct poll_list *walk;           905                 struct poll_list *walk;
905                 bool can_busy_loop = false;       906                 bool can_busy_loop = false;
906                                                   907 
907                 for (walk = list; walk != NULL    908                 for (walk = list; walk != NULL; walk = walk->next) {
908                         struct pollfd * pfd, *    909                         struct pollfd * pfd, * pfd_end;
909                                                   910 
910                         pfd = walk->entries;      911                         pfd = walk->entries;
911                         pfd_end = pfd + walk->    912                         pfd_end = pfd + walk->len;
912                         for (; pfd != pfd_end;    913                         for (; pfd != pfd_end; pfd++) {
913                                 /*                914                                 /*
914                                  * Fish for ev    915                                  * Fish for events. If we found one, record it
915                                  * and kill po    916                                  * and kill poll_table->_qproc, so we don't
916                                  * needlessly     917                                  * needlessly register any other waiters after
917                                  * this. They'    918                                  * this. They'll get immediately deregistered
918                                  * when we bre    919                                  * when we break out and return.
919                                  */               920                                  */
920                                 if (do_pollfd(    921                                 if (do_pollfd(pfd, pt, &can_busy_loop,
921                                                   922                                               busy_flag)) {
922                                         count+    923                                         count++;
923                                         pt->_q    924                                         pt->_qproc = NULL;
924                                         /* fou    925                                         /* found something, stop busy polling */
925                                         busy_f    926                                         busy_flag = 0;
926                                         can_bu    927                                         can_busy_loop = false;
927                                 }                 928                                 }
928                         }                         929                         }
929                 }                                 930                 }
930                 /*                                931                 /*
931                  * All waiters have already be    932                  * All waiters have already been registered, so don't provide
932                  * a poll_table->_qproc to the    933                  * a poll_table->_qproc to them on the next loop iteration.
933                  */                               934                  */
934                 pt->_qproc = NULL;                935                 pt->_qproc = NULL;
935                 if (!count) {                     936                 if (!count) {
936                         count = wait->error;      937                         count = wait->error;
937                         if (signal_pending(cur    938                         if (signal_pending(current))
938                                 count = -EREST    939                                 count = -ERESTARTNOHAND;
939                 }                                 940                 }
940                 if (count || timed_out)           941                 if (count || timed_out)
941                         break;                    942                         break;
942                                                   943 
943                 /* only if found POLL_BUSY_LOO    944                 /* only if found POLL_BUSY_LOOP sockets && not out of time */
944                 if (can_busy_loop && !need_res    945                 if (can_busy_loop && !need_resched()) {
945                         if (!busy_start) {        946                         if (!busy_start) {
946                                 busy_start = b    947                                 busy_start = busy_loop_current_time();
947                                 continue;         948                                 continue;
948                         }                         949                         }
949                         if (!busy_loop_timeout    950                         if (!busy_loop_timeout(busy_start))
950                                 continue;         951                                 continue;
951                 }                                 952                 }
952                 busy_flag = 0;                    953                 busy_flag = 0;
953                                                   954 
954                 /*                                955                 /*
955                  * If this is the first loop a    956                  * If this is the first loop and we have a timeout
956                  * given, then we convert to k    957                  * given, then we convert to ktime_t and set the to
957                  * pointer to the expiry value    958                  * pointer to the expiry value.
958                  */                               959                  */
959                 if (end_time && !to) {            960                 if (end_time && !to) {
960                         expire = timespec64_to    961                         expire = timespec64_to_ktime(*end_time);
961                         to = &expire;             962                         to = &expire;
962                 }                                 963                 }
963                                                   964 
964                 if (!poll_schedule_timeout(wai    965                 if (!poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack))
965                         timed_out = 1;            966                         timed_out = 1;
966         }                                         967         }
967         return count;                             968         return count;
968 }                                                 969 }
969                                                   970 
970 #define N_STACK_PPS ((sizeof(stack_pps) - size    971 #define N_STACK_PPS ((sizeof(stack_pps) - sizeof(struct poll_list))  / \
971                         sizeof(struct pollfd))    972                         sizeof(struct pollfd))
972                                                   973 
973 static int do_sys_poll(struct pollfd __user *u    974 static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds,
974                 struct timespec64 *end_time)      975                 struct timespec64 *end_time)
975 {                                                 976 {
976         struct poll_wqueues table;                977         struct poll_wqueues table;
977         int err = -EFAULT, fdcount;            !! 978         int err = -EFAULT, fdcount, len;
978         /* Allocate small arguments on the sta    979         /* Allocate small arguments on the stack to save memory and be
979            faster - use long to make sure the     980            faster - use long to make sure the buffer is aligned properly
980            on 64 bit archs to avoid unaligned     981            on 64 bit archs to avoid unaligned access */
981         long stack_pps[POLL_STACK_ALLOC/sizeof    982         long stack_pps[POLL_STACK_ALLOC/sizeof(long)];
982         struct poll_list *const head = (struct    983         struct poll_list *const head = (struct poll_list *)stack_pps;
983         struct poll_list *walk = head;            984         struct poll_list *walk = head;
984         unsigned int todo = nfds;              !! 985         unsigned long todo = nfds;
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)        << 
1002                         break;                << 
1003                 todo -= walk->len;               1001                 todo -= walk->len;
                                                   >> 1002                 if (!todo)
                                                   >> 1003                         break;
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                 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