~ [ 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-5.15.171)


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

~ [ 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