~ [ 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.3.18)


  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[0];
 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 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 #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT | EPOLLERR)
461 #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM !! 463 #define POLLEX_SET (EPOLLPRI)
462                          EPOLLNVAL)            << 
463 #define POLLEX_SET (EPOLLPRI | EPOLLNVAL)      << 
464                                                   464 
465 static inline void wait_key_set(poll_table *wa    465 static inline void wait_key_set(poll_table *wait, unsigned long in,
466                                 unsigned long     466                                 unsigned long out, unsigned long bit,
467                                 __poll_t ll_fl    467                                 __poll_t ll_flag)
468 {                                                 468 {
469         wait->_key = POLLEX_SET | ll_flag;        469         wait->_key = POLLEX_SET | ll_flag;
470         if (in & bit)                             470         if (in & bit)
471                 wait->_key |= POLLIN_SET;         471                 wait->_key |= POLLIN_SET;
472         if (out & bit)                            472         if (out & bit)
473                 wait->_key |= POLLOUT_SET;        473                 wait->_key |= POLLOUT_SET;
474 }                                                 474 }
475                                                   475 
476 static noinline_for_stack int do_select(int n, !! 476 static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
477 {                                                 477 {
478         ktime_t expire, *to = NULL;               478         ktime_t expire, *to = NULL;
479         struct poll_wqueues table;                479         struct poll_wqueues table;
480         poll_table *wait;                         480         poll_table *wait;
481         int retval, i, timed_out = 0;             481         int retval, i, timed_out = 0;
482         u64 slack = 0;                            482         u64 slack = 0;
483         __poll_t busy_flag = net_busy_loop_on(    483         __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
484         unsigned long busy_start = 0;             484         unsigned long busy_start = 0;
485                                                   485 
486         rcu_read_lock();                          486         rcu_read_lock();
487         retval = max_select_fd(n, fds);           487         retval = max_select_fd(n, fds);
488         rcu_read_unlock();                        488         rcu_read_unlock();
489                                                   489 
490         if (retval < 0)                           490         if (retval < 0)
491                 return retval;                    491                 return retval;
492         n = retval;                               492         n = retval;
493                                                   493 
494         poll_initwait(&table);                    494         poll_initwait(&table);
495         wait = &table.pt;                         495         wait = &table.pt;
496         if (end_time && !end_time->tv_sec && !    496         if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
497                 wait->_qproc = NULL;              497                 wait->_qproc = NULL;
498                 timed_out = 1;                    498                 timed_out = 1;
499         }                                         499         }
500                                                   500 
501         if (end_time && !timed_out)               501         if (end_time && !timed_out)
502                 slack = select_estimate_accura    502                 slack = select_estimate_accuracy(end_time);
503                                                   503 
504         retval = 0;                               504         retval = 0;
505         for (;;) {                                505         for (;;) {
506                 unsigned long *rinp, *routp, *    506                 unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;
507                 bool can_busy_loop = false;       507                 bool can_busy_loop = false;
508                                                   508 
509                 inp = fds->in; outp = fds->out    509                 inp = fds->in; outp = fds->out; exp = fds->ex;
510                 rinp = fds->res_in; routp = fd    510                 rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;
511                                                   511 
512                 for (i = 0; i < n; ++rinp, ++r    512                 for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
513                         unsigned long in, out,    513                         unsigned long in, out, ex, all_bits, bit = 1, j;
514                         unsigned long res_in =    514                         unsigned long res_in = 0, res_out = 0, res_ex = 0;
515                         __poll_t mask;            515                         __poll_t mask;
516                                                   516 
517                         in = *inp++; out = *ou    517                         in = *inp++; out = *outp++; ex = *exp++;
518                         all_bits = in | out |     518                         all_bits = in | out | ex;
519                         if (all_bits == 0) {      519                         if (all_bits == 0) {
520                                 i += BITS_PER_    520                                 i += BITS_PER_LONG;
521                                 continue;         521                                 continue;
522                         }                         522                         }
523                                                   523 
524                         for (j = 0; j < BITS_P    524                         for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) {
525                                 struct fd f;      525                                 struct fd f;
526                                 if (i >= n)       526                                 if (i >= n)
527                                         break;    527                                         break;
528                                 if (!(bit & al    528                                 if (!(bit & all_bits))
529                                         contin    529                                         continue;
530                                 mask = EPOLLNV << 
531                                 f = fdget(i);     530                                 f = fdget(i);
532                                 if (fd_file(f) !! 531                                 if (f.file) {
533                                         wait_k    532                                         wait_key_set(wait, in, out, bit,
534                                                   533                                                      busy_flag);
535                                         mask = !! 534                                         mask = vfs_poll(f.file, wait);
536                                                   535 
537                                         fdput(    536                                         fdput(f);
538                                 }              !! 537                                         if ((mask & POLLIN_SET) && (in & bit)) {
539                                 if ((mask & PO !! 538                                                 res_in |= bit;
540                                         res_in !! 539                                                 retval++;
541                                         retval !! 540                                                 wait->_qproc = NULL;
542                                         wait-> !! 541                                         }
543                                 }              !! 542                                         if ((mask & POLLOUT_SET) && (out & bit)) {
544                                 if ((mask & PO !! 543                                                 res_out |= bit;
545                                         res_ou !! 544                                                 retval++;
546                                         retval !! 545                                                 wait->_qproc = NULL;
547                                         wait-> !! 546                                         }
548                                 }              !! 547                                         if ((mask & POLLEX_SET) && (ex & bit)) {
549                                 if ((mask & PO !! 548                                                 res_ex |= bit;
550                                         res_ex !! 549                                                 retval++;
551                                         retval !! 550                                                 wait->_qproc = NULL;
552                                         wait-> !! 551                                         }
553                                 }              !! 552                                         /* got something, stop busy polling */
554                                 /* got somethi !! 553                                         if (retval) {
555                                 if (retval) {  !! 554                                                 can_busy_loop = false;
556                                         can_bu !! 555                                                 busy_flag = 0;
557                                         busy_f !! 556 
558                                                !! 557                                         /*
559                                 /*             !! 558                                          * only remember a returned
560                                  * only rememb !! 559                                          * POLL_BUSY_LOOP if we asked for it
561                                  * POLL_BUSY_L !! 560                                          */
562                                  */            !! 561                                         } else if (busy_flag & mask)
563                                 } else if (bus !! 562                                                 can_busy_loop = true;
564                                         can_bu << 
565                                                   563 
                                                   >> 564                                 }
566                         }                         565                         }
567                         if (res_in)               566                         if (res_in)
568                                 *rinp = res_in    567                                 *rinp = res_in;
569                         if (res_out)              568                         if (res_out)
570                                 *routp = res_o    569                                 *routp = res_out;
571                         if (res_ex)               570                         if (res_ex)
572                                 *rexp = res_ex    571                                 *rexp = res_ex;
573                         cond_resched();           572                         cond_resched();
574                 }                                 573                 }
575                 wait->_qproc = NULL;              574                 wait->_qproc = NULL;
576                 if (retval || timed_out || sig    575                 if (retval || timed_out || signal_pending(current))
577                         break;                    576                         break;
578                 if (table.error) {                577                 if (table.error) {
579                         retval = table.error;     578                         retval = table.error;
580                         break;                    579                         break;
581                 }                                 580                 }
582                                                   581 
583                 /* only if found POLL_BUSY_LOO    582                 /* only if found POLL_BUSY_LOOP sockets && not out of time */
584                 if (can_busy_loop && !need_res    583                 if (can_busy_loop && !need_resched()) {
585                         if (!busy_start) {        584                         if (!busy_start) {
586                                 busy_start = b    585                                 busy_start = busy_loop_current_time();
587                                 continue;         586                                 continue;
588                         }                         587                         }
589                         if (!busy_loop_timeout    588                         if (!busy_loop_timeout(busy_start))
590                                 continue;         589                                 continue;
591                 }                                 590                 }
592                 busy_flag = 0;                    591                 busy_flag = 0;
593                                                   592 
594                 /*                                593                 /*
595                  * If this is the first loop a    594                  * If this is the first loop and we have a timeout
596                  * given, then we convert to k    595                  * given, then we convert to ktime_t and set the to
597                  * pointer to the expiry value    596                  * pointer to the expiry value.
598                  */                               597                  */
599                 if (end_time && !to) {            598                 if (end_time && !to) {
600                         expire = timespec64_to    599                         expire = timespec64_to_ktime(*end_time);
601                         to = &expire;             600                         to = &expire;
602                 }                                 601                 }
603                                                   602 
604                 if (!poll_schedule_timeout(&ta    603                 if (!poll_schedule_timeout(&table, TASK_INTERRUPTIBLE,
605                                            to,    604                                            to, slack))
606                         timed_out = 1;            605                         timed_out = 1;
607         }                                         606         }
608                                                   607 
609         poll_freewait(&table);                    608         poll_freewait(&table);
610                                                   609 
611         return retval;                            610         return retval;
612 }                                                 611 }
613                                                   612 
614 /*                                                613 /*
615  * We can actually return ERESTARTSYS instead     614  * We can actually return ERESTARTSYS instead of EINTR, but I'd
616  * like to be certain this leads to no problem    615  * like to be certain this leads to no problems. So I return
617  * EINTR just for safety.                         616  * EINTR just for safety.
618  *                                                617  *
619  * Update: ERESTARTSYS breaks at least the xvi    618  * Update: ERESTARTSYS breaks at least the xview clock binary, so
620  * I'm trying ERESTARTNOHAND which restart onl    619  * I'm trying ERESTARTNOHAND which restart only when you want to.
621  */                                               620  */
622 int core_sys_select(int n, fd_set __user *inp,    621 int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
623                            fd_set __user *exp,    622                            fd_set __user *exp, struct timespec64 *end_time)
624 {                                                 623 {
625         fd_set_bits fds;                          624         fd_set_bits fds;
626         void *bits;                               625         void *bits;
627         int ret, max_fds;                         626         int ret, max_fds;
628         size_t size, alloc_size;                  627         size_t size, alloc_size;
629         struct fdtable *fdt;                      628         struct fdtable *fdt;
630         /* Allocate small arguments on the sta    629         /* Allocate small arguments on the stack to save memory and be faster */
631         long stack_fds[SELECT_STACK_ALLOC/size    630         long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
632                                                   631 
633         ret = -EINVAL;                            632         ret = -EINVAL;
634         if (n < 0)                                633         if (n < 0)
635                 goto out_nofds;                   634                 goto out_nofds;
636                                                   635 
637         /* max_fds can increase, so grab it on    636         /* max_fds can increase, so grab it once to avoid race */
638         rcu_read_lock();                          637         rcu_read_lock();
639         fdt = files_fdtable(current->files);      638         fdt = files_fdtable(current->files);
640         max_fds = fdt->max_fds;                   639         max_fds = fdt->max_fds;
641         rcu_read_unlock();                        640         rcu_read_unlock();
642         if (n > max_fds)                          641         if (n > max_fds)
643                 n = max_fds;                      642                 n = max_fds;
644                                                   643 
645         /*                                        644         /*
646          * We need 6 bitmaps (in/out/ex for bo    645          * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
647          * since we used fdset we need to allo    646          * since we used fdset we need to allocate memory in units of
648          * long-words.                            647          * long-words. 
649          */                                       648          */
650         size = FDS_BYTES(n);                      649         size = FDS_BYTES(n);
651         bits = stack_fds;                         650         bits = stack_fds;
652         if (size > sizeof(stack_fds) / 6) {       651         if (size > sizeof(stack_fds) / 6) {
653                 /* Not enough space in on-stac    652                 /* Not enough space in on-stack array; must use kmalloc */
654                 ret = -ENOMEM;                    653                 ret = -ENOMEM;
655                 if (size > (SIZE_MAX / 6))        654                 if (size > (SIZE_MAX / 6))
656                         goto out_nofds;           655                         goto out_nofds;
657                                                   656 
658                 alloc_size = 6 * size;            657                 alloc_size = 6 * size;
659                 bits = kvmalloc(alloc_size, GF    658                 bits = kvmalloc(alloc_size, GFP_KERNEL);
660                 if (!bits)                        659                 if (!bits)
661                         goto out_nofds;           660                         goto out_nofds;
662         }                                         661         }
663         fds.in      = bits;                       662         fds.in      = bits;
664         fds.out     = bits +   size;              663         fds.out     = bits +   size;
665         fds.ex      = bits + 2*size;              664         fds.ex      = bits + 2*size;
666         fds.res_in  = bits + 3*size;              665         fds.res_in  = bits + 3*size;
667         fds.res_out = bits + 4*size;              666         fds.res_out = bits + 4*size;
668         fds.res_ex  = bits + 5*size;              667         fds.res_ex  = bits + 5*size;
669                                                   668 
670         if ((ret = get_fd_set(n, inp, fds.in))    669         if ((ret = get_fd_set(n, inp, fds.in)) ||
671             (ret = get_fd_set(n, outp, fds.out    670             (ret = get_fd_set(n, outp, fds.out)) ||
672             (ret = get_fd_set(n, exp, fds.ex))    671             (ret = get_fd_set(n, exp, fds.ex)))
673                 goto out;                         672                 goto out;
674         zero_fd_set(n, fds.res_in);               673         zero_fd_set(n, fds.res_in);
675         zero_fd_set(n, fds.res_out);              674         zero_fd_set(n, fds.res_out);
676         zero_fd_set(n, fds.res_ex);               675         zero_fd_set(n, fds.res_ex);
677                                                   676 
678         ret = do_select(n, &fds, end_time);       677         ret = do_select(n, &fds, end_time);
679                                                   678 
680         if (ret < 0)                              679         if (ret < 0)
681                 goto out;                         680                 goto out;
682         if (!ret) {                               681         if (!ret) {
683                 ret = -ERESTARTNOHAND;            682                 ret = -ERESTARTNOHAND;
684                 if (signal_pending(current))      683                 if (signal_pending(current))
685                         goto out;                 684                         goto out;
686                 ret = 0;                          685                 ret = 0;
687         }                                         686         }
688                                                   687 
689         if (set_fd_set(n, inp, fds.res_in) ||     688         if (set_fd_set(n, inp, fds.res_in) ||
690             set_fd_set(n, outp, fds.res_out) |    689             set_fd_set(n, outp, fds.res_out) ||
691             set_fd_set(n, exp, fds.res_ex))       690             set_fd_set(n, exp, fds.res_ex))
692                 ret = -EFAULT;                    691                 ret = -EFAULT;
693                                                   692 
694 out:                                              693 out:
695         if (bits != stack_fds)                    694         if (bits != stack_fds)
696                 kvfree(bits);                     695                 kvfree(bits);
697 out_nofds:                                        696 out_nofds:
698         return ret;                               697         return ret;
699 }                                                 698 }
700                                                   699 
701 static int kern_select(int n, fd_set __user *i    700 static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
702                        fd_set __user *exp, str !! 701                        fd_set __user *exp, struct timeval __user *tvp)
703 {                                                 702 {
704         struct timespec64 end_time, *to = NULL    703         struct timespec64 end_time, *to = NULL;
705         struct __kernel_old_timeval tv;        !! 704         struct timeval tv;
706         int ret;                                  705         int ret;
707                                                   706 
708         if (tvp) {                                707         if (tvp) {
709                 if (copy_from_user(&tv, tvp, s    708                 if (copy_from_user(&tv, tvp, sizeof(tv)))
710                         return -EFAULT;           709                         return -EFAULT;
711                                                   710 
712                 to = &end_time;                   711                 to = &end_time;
713                 if (poll_select_set_timeout(to    712                 if (poll_select_set_timeout(to,
714                                 tv.tv_sec + (t    713                                 tv.tv_sec + (tv.tv_usec / USEC_PER_SEC),
715                                 (tv.tv_usec %     714                                 (tv.tv_usec % USEC_PER_SEC) * NSEC_PER_USEC))
716                         return -EINVAL;           715                         return -EINVAL;
717         }                                         716         }
718                                                   717 
719         ret = core_sys_select(n, inp, outp, ex    718         ret = core_sys_select(n, inp, outp, exp, to);
720         return poll_select_finish(&end_time, t    719         return poll_select_finish(&end_time, tvp, PT_TIMEVAL, ret);
721 }                                                 720 }
722                                                   721 
723 SYSCALL_DEFINE5(select, int, n, fd_set __user     722 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
724                 fd_set __user *, exp, struct _ !! 723                 fd_set __user *, exp, struct timeval __user *, tvp)
725 {                                                 724 {
726         return kern_select(n, inp, outp, exp,     725         return kern_select(n, inp, outp, exp, tvp);
727 }                                                 726 }
728                                                   727 
729 static long do_pselect(int n, fd_set __user *i    728 static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
730                        fd_set __user *exp, voi    729                        fd_set __user *exp, void __user *tsp,
731                        const sigset_t __user *    730                        const sigset_t __user *sigmask, size_t sigsetsize,
732                        enum poll_time_type typ    731                        enum poll_time_type type)
733 {                                                 732 {
734         struct timespec64 ts, end_time, *to =     733         struct timespec64 ts, end_time, *to = NULL;
735         int ret;                                  734         int ret;
736                                                   735 
737         if (tsp) {                                736         if (tsp) {
738                 switch (type) {                   737                 switch (type) {
739                 case PT_TIMESPEC:                 738                 case PT_TIMESPEC:
740                         if (get_timespec64(&ts    739                         if (get_timespec64(&ts, tsp))
741                                 return -EFAULT    740                                 return -EFAULT;
742                         break;                    741                         break;
743                 case PT_OLD_TIMESPEC:             742                 case PT_OLD_TIMESPEC:
744                         if (get_old_timespec32    743                         if (get_old_timespec32(&ts, tsp))
745                                 return -EFAULT    744                                 return -EFAULT;
746                         break;                    745                         break;
747                 default:                          746                 default:
748                         BUG();                    747                         BUG();
749                 }                                 748                 }
750                                                   749 
751                 to = &end_time;                   750                 to = &end_time;
752                 if (poll_select_set_timeout(to    751                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
753                         return -EINVAL;           752                         return -EINVAL;
754         }                                         753         }
755                                                   754 
756         ret = set_user_sigmask(sigmask, sigset    755         ret = set_user_sigmask(sigmask, sigsetsize);
757         if (ret)                                  756         if (ret)
758                 return ret;                       757                 return ret;
759                                                   758 
760         ret = core_sys_select(n, inp, outp, ex    759         ret = core_sys_select(n, inp, outp, exp, to);
761         return poll_select_finish(&end_time, t    760         return poll_select_finish(&end_time, tsp, type, ret);
762 }                                                 761 }
763                                                   762 
764 /*                                                763 /*
765  * Most architectures can't handle 7-argument     764  * Most architectures can't handle 7-argument syscalls. So we provide a
766  * 6-argument version where the sixth argument    765  * 6-argument version where the sixth argument is a pointer to a structure
767  * which has a pointer to the sigset_t itself     766  * which has a pointer to the sigset_t itself followed by a size_t containing
768  * the sigset size.                               767  * the sigset size.
769  */                                               768  */
770 struct sigset_argpack {                        << 
771         sigset_t __user *p;                    << 
772         size_t size;                           << 
773 };                                             << 
774                                                << 
775 static inline int get_sigset_argpack(struct si << 
776                                      struct si << 
777 {                                              << 
778         // the path is hot enough for overhead << 
779         if (from) {                            << 
780                 if (can_do_masked_user_access( << 
781                         from = masked_user_acc << 
782                 else if (!user_read_access_beg << 
783                         return -EFAULT;        << 
784                 unsafe_get_user(to->p, &from-> << 
785                 unsafe_get_user(to->size, &fro << 
786                 user_read_access_end();        << 
787         }                                      << 
788         return 0;                              << 
789 Efault:                                        << 
790         user_access_end();                     << 
791         return -EFAULT;                        << 
792 }                                              << 
793                                                << 
794 SYSCALL_DEFINE6(pselect6, int, n, fd_set __use    769 SYSCALL_DEFINE6(pselect6, int, n, fd_set __user *, inp, fd_set __user *, outp,
795                 fd_set __user *, exp, struct _    770                 fd_set __user *, exp, struct __kernel_timespec __user *, tsp,
796                 void __user *, sig)               771                 void __user *, sig)
797 {                                                 772 {
798         struct sigset_argpack x = {NULL, 0};   !! 773         size_t sigsetsize = 0;
                                                   >> 774         sigset_t __user *up = NULL;
799                                                   775 
800         if (get_sigset_argpack(&x, sig))       !! 776         if (sig) {
801                 return -EFAULT;                !! 777                 if (!access_ok(sig, sizeof(void *)+sizeof(size_t))
                                                   >> 778                     || __get_user(up, (sigset_t __user * __user *)sig)
                                                   >> 779                     || __get_user(sigsetsize,
                                                   >> 780                                 (size_t __user *)(sig+sizeof(void *))))
                                                   >> 781                         return -EFAULT;
                                                   >> 782         }
802                                                   783 
803         return do_pselect(n, inp, outp, exp, t !! 784         return do_pselect(n, inp, outp, exp, tsp, up, sigsetsize, PT_TIMESPEC);
804 }                                                 785 }
805                                                   786 
806 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defi    787 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defined(CONFIG_64BIT)
807                                                   788 
808 SYSCALL_DEFINE6(pselect6_time32, int, n, fd_se    789 SYSCALL_DEFINE6(pselect6_time32, int, n, fd_set __user *, inp, fd_set __user *, outp,
809                 fd_set __user *, exp, struct o    790                 fd_set __user *, exp, struct old_timespec32 __user *, tsp,
810                 void __user *, sig)               791                 void __user *, sig)
811 {                                                 792 {
812         struct sigset_argpack x = {NULL, 0};   !! 793         size_t sigsetsize = 0;
                                                   >> 794         sigset_t __user *up = NULL;
813                                                   795 
814         if (get_sigset_argpack(&x, sig))       !! 796         if (sig) {
815                 return -EFAULT;                !! 797                 if (!access_ok(sig, sizeof(void *)+sizeof(size_t))
                                                   >> 798                     || __get_user(up, (sigset_t __user * __user *)sig)
                                                   >> 799                     || __get_user(sigsetsize,
                                                   >> 800                                 (size_t __user *)(sig+sizeof(void *))))
                                                   >> 801                         return -EFAULT;
                                                   >> 802         }
816                                                   803 
817         return do_pselect(n, inp, outp, exp, t !! 804         return do_pselect(n, inp, outp, exp, tsp, up, sigsetsize, PT_OLD_TIMESPEC);
818 }                                                 805 }
819                                                   806 
820 #endif                                            807 #endif
821                                                   808 
822 #ifdef __ARCH_WANT_SYS_OLD_SELECT                 809 #ifdef __ARCH_WANT_SYS_OLD_SELECT
823 struct sel_arg_struct {                           810 struct sel_arg_struct {
824         unsigned long n;                          811         unsigned long n;
825         fd_set __user *inp, *outp, *exp;          812         fd_set __user *inp, *outp, *exp;
826         struct __kernel_old_timeval __user *tv !! 813         struct timeval __user *tvp;
827 };                                                814 };
828                                                   815 
829 SYSCALL_DEFINE1(old_select, struct sel_arg_str    816 SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
830 {                                                 817 {
831         struct sel_arg_struct a;                  818         struct sel_arg_struct a;
832                                                   819 
833         if (copy_from_user(&a, arg, sizeof(a))    820         if (copy_from_user(&a, arg, sizeof(a)))
834                 return -EFAULT;                   821                 return -EFAULT;
835         return kern_select(a.n, a.inp, a.outp,    822         return kern_select(a.n, a.inp, a.outp, a.exp, a.tvp);
836 }                                                 823 }
837 #endif                                            824 #endif
838                                                   825 
839 struct poll_list {                                826 struct poll_list {
840         struct poll_list *next;                   827         struct poll_list *next;
841         unsigned int len;                      !! 828         int len;
842         struct pollfd entries[] __counted_by(l !! 829         struct pollfd entries[0];
843 };                                                830 };
844                                                   831 
845 #define POLLFD_PER_PAGE  ((PAGE_SIZE-sizeof(st    832 #define POLLFD_PER_PAGE  ((PAGE_SIZE-sizeof(struct poll_list)) / sizeof(struct pollfd))
846                                                   833 
847 /*                                                834 /*
848  * Fish for pollable events on the pollfd->fd     835  * Fish for pollable events on the pollfd->fd file descriptor. We're only
849  * interested in events matching the pollfd->e    836  * interested in events matching the pollfd->events mask, and the result
850  * matching that mask is both recorded in poll    837  * matching that mask is both recorded in pollfd->revents and returned. The
851  * pwait poll_table will be used by the fd-pro    838  * pwait poll_table will be used by the fd-provided poll handler for waiting,
852  * if pwait->_qproc is non-NULL.                  839  * if pwait->_qproc is non-NULL.
853  */                                               840  */
854 static inline __poll_t do_pollfd(struct pollfd    841 static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
855                                      bool *can    842                                      bool *can_busy_poll,
856                                      __poll_t     843                                      __poll_t busy_flag)
857 {                                                 844 {
858         int fd = pollfd->fd;                      845         int fd = pollfd->fd;
859         __poll_t mask = 0, filter;                846         __poll_t mask = 0, filter;
860         struct fd f;                              847         struct fd f;
861                                                   848 
862         if (fd < 0)                               849         if (fd < 0)
863                 goto out;                         850                 goto out;
864         mask = EPOLLNVAL;                         851         mask = EPOLLNVAL;
865         f = fdget(fd);                            852         f = fdget(fd);
866         if (!fd_file(f))                       !! 853         if (!f.file)
867                 goto out;                         854                 goto out;
868                                                   855 
869         /* userland u16 ->events contains POLL    856         /* userland u16 ->events contains POLL... bitmap */
870         filter = demangle_poll(pollfd->events)    857         filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
871         pwait->_key = filter | busy_flag;         858         pwait->_key = filter | busy_flag;
872         mask = vfs_poll(fd_file(f), pwait);    !! 859         mask = vfs_poll(f.file, pwait);
873         if (mask & busy_flag)                     860         if (mask & busy_flag)
874                 *can_busy_poll = true;            861                 *can_busy_poll = true;
875         mask &= filter;         /* Mask out un    862         mask &= filter;         /* Mask out unneeded events. */
876         fdput(f);                                 863         fdput(f);
877                                                   864 
878 out:                                              865 out:
879         /* ... and so does ->revents */           866         /* ... and so does ->revents */
880         pollfd->revents = mangle_poll(mask);      867         pollfd->revents = mangle_poll(mask);
881         return mask;                              868         return mask;
882 }                                                 869 }
883                                                   870 
884 static int do_poll(struct poll_list *list, str    871 static int do_poll(struct poll_list *list, struct poll_wqueues *wait,
885                    struct timespec64 *end_time    872                    struct timespec64 *end_time)
886 {                                                 873 {
887         poll_table* pt = &wait->pt;               874         poll_table* pt = &wait->pt;
888         ktime_t expire, *to = NULL;               875         ktime_t expire, *to = NULL;
889         int timed_out = 0, count = 0;             876         int timed_out = 0, count = 0;
890         u64 slack = 0;                            877         u64 slack = 0;
891         __poll_t busy_flag = net_busy_loop_on(    878         __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
892         unsigned long busy_start = 0;             879         unsigned long busy_start = 0;
893                                                   880 
894         /* Optimise the no-wait case */           881         /* Optimise the no-wait case */
895         if (end_time && !end_time->tv_sec && !    882         if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
896                 pt->_qproc = NULL;                883                 pt->_qproc = NULL;
897                 timed_out = 1;                    884                 timed_out = 1;
898         }                                         885         }
899                                                   886 
900         if (end_time && !timed_out)               887         if (end_time && !timed_out)
901                 slack = select_estimate_accura    888                 slack = select_estimate_accuracy(end_time);
902                                                   889 
903         for (;;) {                                890         for (;;) {
904                 struct poll_list *walk;           891                 struct poll_list *walk;
905                 bool can_busy_loop = false;       892                 bool can_busy_loop = false;
906                                                   893 
907                 for (walk = list; walk != NULL    894                 for (walk = list; walk != NULL; walk = walk->next) {
908                         struct pollfd * pfd, *    895                         struct pollfd * pfd, * pfd_end;
909                                                   896 
910                         pfd = walk->entries;      897                         pfd = walk->entries;
911                         pfd_end = pfd + walk->    898                         pfd_end = pfd + walk->len;
912                         for (; pfd != pfd_end;    899                         for (; pfd != pfd_end; pfd++) {
913                                 /*                900                                 /*
914                                  * Fish for ev    901                                  * Fish for events. If we found one, record it
915                                  * and kill po    902                                  * and kill poll_table->_qproc, so we don't
916                                  * needlessly     903                                  * needlessly register any other waiters after
917                                  * this. They'    904                                  * this. They'll get immediately deregistered
918                                  * when we bre    905                                  * when we break out and return.
919                                  */               906                                  */
920                                 if (do_pollfd(    907                                 if (do_pollfd(pfd, pt, &can_busy_loop,
921                                                   908                                               busy_flag)) {
922                                         count+    909                                         count++;
923                                         pt->_q    910                                         pt->_qproc = NULL;
924                                         /* fou    911                                         /* found something, stop busy polling */
925                                         busy_f    912                                         busy_flag = 0;
926                                         can_bu    913                                         can_busy_loop = false;
927                                 }                 914                                 }
928                         }                         915                         }
929                 }                                 916                 }
930                 /*                                917                 /*
931                  * All waiters have already be    918                  * All waiters have already been registered, so don't provide
932                  * a poll_table->_qproc to the    919                  * a poll_table->_qproc to them on the next loop iteration.
933                  */                               920                  */
934                 pt->_qproc = NULL;                921                 pt->_qproc = NULL;
935                 if (!count) {                     922                 if (!count) {
936                         count = wait->error;      923                         count = wait->error;
937                         if (signal_pending(cur    924                         if (signal_pending(current))
938                                 count = -EREST    925                                 count = -ERESTARTNOHAND;
939                 }                                 926                 }
940                 if (count || timed_out)           927                 if (count || timed_out)
941                         break;                    928                         break;
942                                                   929 
943                 /* only if found POLL_BUSY_LOO    930                 /* only if found POLL_BUSY_LOOP sockets && not out of time */
944                 if (can_busy_loop && !need_res    931                 if (can_busy_loop && !need_resched()) {
945                         if (!busy_start) {        932                         if (!busy_start) {
946                                 busy_start = b    933                                 busy_start = busy_loop_current_time();
947                                 continue;         934                                 continue;
948                         }                         935                         }
949                         if (!busy_loop_timeout    936                         if (!busy_loop_timeout(busy_start))
950                                 continue;         937                                 continue;
951                 }                                 938                 }
952                 busy_flag = 0;                    939                 busy_flag = 0;
953                                                   940 
954                 /*                                941                 /*
955                  * If this is the first loop a    942                  * If this is the first loop and we have a timeout
956                  * given, then we convert to k    943                  * given, then we convert to ktime_t and set the to
957                  * pointer to the expiry value    944                  * pointer to the expiry value.
958                  */                               945                  */
959                 if (end_time && !to) {            946                 if (end_time && !to) {
960                         expire = timespec64_to    947                         expire = timespec64_to_ktime(*end_time);
961                         to = &expire;             948                         to = &expire;
962                 }                                 949                 }
963                                                   950 
964                 if (!poll_schedule_timeout(wai    951                 if (!poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack))
965                         timed_out = 1;            952                         timed_out = 1;
966         }                                         953         }
967         return count;                             954         return count;
968 }                                                 955 }
969                                                   956 
970 #define N_STACK_PPS ((sizeof(stack_pps) - size    957 #define N_STACK_PPS ((sizeof(stack_pps) - sizeof(struct poll_list))  / \
971                         sizeof(struct pollfd))    958                         sizeof(struct pollfd))
972                                                   959 
973 static int do_sys_poll(struct pollfd __user *u    960 static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds,
974                 struct timespec64 *end_time)      961                 struct timespec64 *end_time)
975 {                                                 962 {
976         struct poll_wqueues table;                963         struct poll_wqueues table;
977         int err = -EFAULT, fdcount;            !! 964         int err = -EFAULT, fdcount, len;
978         /* Allocate small arguments on the sta    965         /* Allocate small arguments on the stack to save memory and be
979            faster - use long to make sure the     966            faster - use long to make sure the buffer is aligned properly
980            on 64 bit archs to avoid unaligned     967            on 64 bit archs to avoid unaligned access */
981         long stack_pps[POLL_STACK_ALLOC/sizeof    968         long stack_pps[POLL_STACK_ALLOC/sizeof(long)];
982         struct poll_list *const head = (struct    969         struct poll_list *const head = (struct poll_list *)stack_pps;
983         struct poll_list *walk = head;            970         struct poll_list *walk = head;
984         unsigned int todo = nfds;              !! 971         unsigned long todo = nfds;
985         unsigned int len;                      << 
986                                                   972 
987         if (nfds > rlimit(RLIMIT_NOFILE))         973         if (nfds > rlimit(RLIMIT_NOFILE))
988                 return -EINVAL;                   974                 return -EINVAL;
989                                                   975 
990         len = min_t(unsigned int, nfds, N_STAC    976         len = min_t(unsigned int, nfds, N_STACK_PPS);
991         for (;;) {                                977         for (;;) {
992                 walk->next = NULL;                978                 walk->next = NULL;
993                 walk->len = len;                  979                 walk->len = len;
994                 if (!len)                         980                 if (!len)
995                         break;                    981                         break;
996                                                   982 
997                 if (copy_from_user(walk->entri    983                 if (copy_from_user(walk->entries, ufds + nfds-todo,
998                                         sizeof    984                                         sizeof(struct pollfd) * walk->len))
999                         goto out_fds;             985                         goto out_fds;
1000                                                  986 
1001                 if (walk->len >= todo)        << 
1002                         break;                << 
1003                 todo -= walk->len;               987                 todo -= walk->len;
                                                   >> 988                 if (!todo)
                                                   >> 989                         break;
1004                                                  990 
1005                 len = min(todo, POLLFD_PER_PA    991                 len = min(todo, POLLFD_PER_PAGE);
1006                 walk = walk->next = kmalloc(s    992                 walk = walk->next = kmalloc(struct_size(walk, entries, len),
1007                                             G    993                                             GFP_KERNEL);
1008                 if (!walk) {                     994                 if (!walk) {
1009                         err = -ENOMEM;           995                         err = -ENOMEM;
1010                         goto out_fds;            996                         goto out_fds;
1011                 }                                997                 }
1012         }                                        998         }
1013                                                  999 
1014         poll_initwait(&table);                   1000         poll_initwait(&table);
1015         fdcount = do_poll(head, &table, end_t    1001         fdcount = do_poll(head, &table, end_time);
1016         poll_freewait(&table);                   1002         poll_freewait(&table);
1017                                                  1003 
1018         if (!user_write_access_begin(ufds, nf << 
1019                 goto out_fds;                 << 
1020                                               << 
1021         for (walk = head; walk; walk = walk->    1004         for (walk = head; walk; walk = walk->next) {
1022                 struct pollfd *fds = walk->en    1005                 struct pollfd *fds = walk->entries;
1023                 unsigned int j;               !! 1006                 int j;
1024                                                  1007 
1025                 for (j = walk->len; j; fds++, !! 1008                 for (j = 0; j < walk->len; j++, ufds++)
1026                         unsafe_put_user(fds-> !! 1009                         if (__put_user(fds[j].revents, &ufds->revents))
                                                   >> 1010                                 goto out_fds;
1027         }                                        1011         }
1028         user_write_access_end();              << 
1029                                                  1012 
1030         err = fdcount;                           1013         err = fdcount;
1031 out_fds:                                         1014 out_fds:
1032         walk = head->next;                       1015         walk = head->next;
1033         while (walk) {                           1016         while (walk) {
1034                 struct poll_list *pos = walk;    1017                 struct poll_list *pos = walk;
1035                 walk = walk->next;               1018                 walk = walk->next;
1036                 kfree(pos);                      1019                 kfree(pos);
1037         }                                        1020         }
1038                                                  1021 
1039         return err;                              1022         return err;
1040                                               << 
1041 Efault:                                       << 
1042         user_write_access_end();              << 
1043         err = -EFAULT;                        << 
1044         goto out_fds;                         << 
1045 }                                                1023 }
1046                                                  1024 
1047 static long do_restart_poll(struct restart_bl    1025 static long do_restart_poll(struct restart_block *restart_block)
1048 {                                                1026 {
1049         struct pollfd __user *ufds = restart_    1027         struct pollfd __user *ufds = restart_block->poll.ufds;
1050         int nfds = restart_block->poll.nfds;     1028         int nfds = restart_block->poll.nfds;
1051         struct timespec64 *to = NULL, end_tim    1029         struct timespec64 *to = NULL, end_time;
1052         int ret;                                 1030         int ret;
1053                                                  1031 
1054         if (restart_block->poll.has_timeout)     1032         if (restart_block->poll.has_timeout) {
1055                 end_time.tv_sec = restart_blo    1033                 end_time.tv_sec = restart_block->poll.tv_sec;
1056                 end_time.tv_nsec = restart_bl    1034                 end_time.tv_nsec = restart_block->poll.tv_nsec;
1057                 to = &end_time;                  1035                 to = &end_time;
1058         }                                        1036         }
1059                                                  1037 
1060         ret = do_sys_poll(ufds, nfds, to);       1038         ret = do_sys_poll(ufds, nfds, to);
1061                                                  1039 
1062         if (ret == -ERESTARTNOHAND)           !! 1040         if (ret == -ERESTARTNOHAND) {
1063                 ret = set_restart_fn(restart_ !! 1041                 restart_block->fn = do_restart_poll;
1064                                               !! 1042                 ret = -ERESTART_RESTARTBLOCK;
                                                   >> 1043         }
1065         return ret;                              1044         return ret;
1066 }                                                1045 }
1067                                                  1046 
1068 SYSCALL_DEFINE3(poll, struct pollfd __user *,    1047 SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,
1069                 int, timeout_msecs)              1048                 int, timeout_msecs)
1070 {                                                1049 {
1071         struct timespec64 end_time, *to = NUL    1050         struct timespec64 end_time, *to = NULL;
1072         int ret;                                 1051         int ret;
1073                                                  1052 
1074         if (timeout_msecs >= 0) {                1053         if (timeout_msecs >= 0) {
1075                 to = &end_time;                  1054                 to = &end_time;
1076                 poll_select_set_timeout(to, t    1055                 poll_select_set_timeout(to, timeout_msecs / MSEC_PER_SEC,
1077                         NSEC_PER_MSEC * (time    1056                         NSEC_PER_MSEC * (timeout_msecs % MSEC_PER_SEC));
1078         }                                        1057         }
1079                                                  1058 
1080         ret = do_sys_poll(ufds, nfds, to);       1059         ret = do_sys_poll(ufds, nfds, to);
1081                                                  1060 
1082         if (ret == -ERESTARTNOHAND) {            1061         if (ret == -ERESTARTNOHAND) {
1083                 struct restart_block *restart    1062                 struct restart_block *restart_block;
1084                                                  1063 
1085                 restart_block = &current->res    1064                 restart_block = &current->restart_block;
                                                   >> 1065                 restart_block->fn = do_restart_poll;
1086                 restart_block->poll.ufds = uf    1066                 restart_block->poll.ufds = ufds;
1087                 restart_block->poll.nfds = nf    1067                 restart_block->poll.nfds = nfds;
1088                                                  1068 
1089                 if (timeout_msecs >= 0) {        1069                 if (timeout_msecs >= 0) {
1090                         restart_block->poll.t    1070                         restart_block->poll.tv_sec = end_time.tv_sec;
1091                         restart_block->poll.t    1071                         restart_block->poll.tv_nsec = end_time.tv_nsec;
1092                         restart_block->poll.h    1072                         restart_block->poll.has_timeout = 1;
1093                 } else                           1073                 } else
1094                         restart_block->poll.h    1074                         restart_block->poll.has_timeout = 0;
1095                                                  1075 
1096                 ret = set_restart_fn(restart_ !! 1076                 ret = -ERESTART_RESTARTBLOCK;
1097         }                                        1077         }
1098         return ret;                              1078         return ret;
1099 }                                                1079 }
1100                                                  1080 
1101 SYSCALL_DEFINE5(ppoll, struct pollfd __user *    1081 SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
1102                 struct __kernel_timespec __us    1082                 struct __kernel_timespec __user *, tsp, const sigset_t __user *, sigmask,
1103                 size_t, sigsetsize)              1083                 size_t, sigsetsize)
1104 {                                                1084 {
1105         struct timespec64 ts, end_time, *to =    1085         struct timespec64 ts, end_time, *to = NULL;
1106         int ret;                                 1086         int ret;
1107                                                  1087 
1108         if (tsp) {                               1088         if (tsp) {
1109                 if (get_timespec64(&ts, tsp))    1089                 if (get_timespec64(&ts, tsp))
1110                         return -EFAULT;          1090                         return -EFAULT;
1111                                                  1091 
1112                 to = &end_time;                  1092                 to = &end_time;
1113                 if (poll_select_set_timeout(t    1093                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1114                         return -EINVAL;          1094                         return -EINVAL;
1115         }                                        1095         }
1116                                                  1096 
1117         ret = set_user_sigmask(sigmask, sigse    1097         ret = set_user_sigmask(sigmask, sigsetsize);
1118         if (ret)                                 1098         if (ret)
1119                 return ret;                      1099                 return ret;
1120                                                  1100 
1121         ret = do_sys_poll(ufds, nfds, to);       1101         ret = do_sys_poll(ufds, nfds, to);
1122         return poll_select_finish(&end_time,     1102         return poll_select_finish(&end_time, tsp, PT_TIMESPEC, ret);
1123 }                                                1103 }
1124                                                  1104 
1125 #if defined(CONFIG_COMPAT_32BIT_TIME) && !def    1105 #if defined(CONFIG_COMPAT_32BIT_TIME) && !defined(CONFIG_64BIT)
1126                                                  1106 
1127 SYSCALL_DEFINE5(ppoll_time32, struct pollfd _    1107 SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, unsigned int, nfds,
1128                 struct old_timespec32 __user     1108                 struct old_timespec32 __user *, tsp, const sigset_t __user *, sigmask,
1129                 size_t, sigsetsize)              1109                 size_t, sigsetsize)
1130 {                                                1110 {
1131         struct timespec64 ts, end_time, *to =    1111         struct timespec64 ts, end_time, *to = NULL;
1132         int ret;                                 1112         int ret;
1133                                                  1113 
1134         if (tsp) {                               1114         if (tsp) {
1135                 if (get_old_timespec32(&ts, t    1115                 if (get_old_timespec32(&ts, tsp))
1136                         return -EFAULT;          1116                         return -EFAULT;
1137                                                  1117 
1138                 to = &end_time;                  1118                 to = &end_time;
1139                 if (poll_select_set_timeout(t    1119                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1140                         return -EINVAL;          1120                         return -EINVAL;
1141         }                                        1121         }
1142                                                  1122 
1143         ret = set_user_sigmask(sigmask, sigse    1123         ret = set_user_sigmask(sigmask, sigsetsize);
1144         if (ret)                                 1124         if (ret)
1145                 return ret;                      1125                 return ret;
1146                                                  1126 
1147         ret = do_sys_poll(ufds, nfds, to);       1127         ret = do_sys_poll(ufds, nfds, to);
1148         return poll_select_finish(&end_time,     1128         return poll_select_finish(&end_time, tsp, PT_OLD_TIMESPEC, ret);
1149 }                                                1129 }
1150 #endif                                           1130 #endif
1151                                                  1131 
1152 #ifdef CONFIG_COMPAT                             1132 #ifdef CONFIG_COMPAT
1153 #define __COMPAT_NFDBITS       (8 * sizeof(co    1133 #define __COMPAT_NFDBITS       (8 * sizeof(compat_ulong_t))
1154                                                  1134 
1155 /*                                               1135 /*
1156  * Ooo, nasty.  We need here to frob 32-bit u    1136  * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
1157  * 64-bit unsigned longs.                        1137  * 64-bit unsigned longs.
1158  */                                              1138  */
1159 static                                           1139 static
1160 int compat_get_fd_set(unsigned long nr, compa    1140 int compat_get_fd_set(unsigned long nr, compat_ulong_t __user *ufdset,
1161                         unsigned long *fdset)    1141                         unsigned long *fdset)
1162 {                                                1142 {
1163         if (ufdset) {                            1143         if (ufdset) {
1164                 return compat_get_bitmap(fdse    1144                 return compat_get_bitmap(fdset, ufdset, nr);
1165         } else {                                 1145         } else {
1166                 zero_fd_set(nr, fdset);          1146                 zero_fd_set(nr, fdset);
1167                 return 0;                        1147                 return 0;
1168         }                                        1148         }
1169 }                                                1149 }
1170                                                  1150 
1171 static                                           1151 static
1172 int compat_set_fd_set(unsigned long nr, compa    1152 int compat_set_fd_set(unsigned long nr, compat_ulong_t __user *ufdset,
1173                       unsigned long *fdset)      1153                       unsigned long *fdset)
1174 {                                                1154 {
1175         if (!ufdset)                             1155         if (!ufdset)
1176                 return 0;                        1156                 return 0;
1177         return compat_put_bitmap(ufdset, fdse    1157         return compat_put_bitmap(ufdset, fdset, nr);
1178 }                                                1158 }
1179                                                  1159 
1180                                                  1160 
1181 /*                                               1161 /*
1182  * This is a virtual copy of sys_select from     1162  * This is a virtual copy of sys_select from fs/select.c and probably
1183  * should be compared to it from time to time    1163  * should be compared to it from time to time
1184  */                                              1164  */
1185                                                  1165 
1186 /*                                               1166 /*
1187  * We can actually return ERESTARTSYS instead    1167  * We can actually return ERESTARTSYS instead of EINTR, but I'd
1188  * like to be certain this leads to no proble    1168  * like to be certain this leads to no problems. So I return
1189  * EINTR just for safety.                        1169  * EINTR just for safety.
1190  *                                               1170  *
1191  * Update: ERESTARTSYS breaks at least the xv    1171  * Update: ERESTARTSYS breaks at least the xview clock binary, so
1192  * I'm trying ERESTARTNOHAND which restart on    1172  * I'm trying ERESTARTNOHAND which restart only when you want to.
1193  */                                              1173  */
1194 static int compat_core_sys_select(int n, comp    1174 static int compat_core_sys_select(int n, compat_ulong_t __user *inp,
1195         compat_ulong_t __user *outp, compat_u    1175         compat_ulong_t __user *outp, compat_ulong_t __user *exp,
1196         struct timespec64 *end_time)             1176         struct timespec64 *end_time)
1197 {                                                1177 {
1198         fd_set_bits fds;                         1178         fd_set_bits fds;
1199         void *bits;                              1179         void *bits;
1200         int size, max_fds, ret = -EINVAL;        1180         int size, max_fds, ret = -EINVAL;
1201         struct fdtable *fdt;                     1181         struct fdtable *fdt;
1202         long stack_fds[SELECT_STACK_ALLOC/siz    1182         long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
1203                                                  1183 
1204         if (n < 0)                               1184         if (n < 0)
1205                 goto out_nofds;                  1185                 goto out_nofds;
1206                                                  1186 
1207         /* max_fds can increase, so grab it o    1187         /* max_fds can increase, so grab it once to avoid race */
1208         rcu_read_lock();                         1188         rcu_read_lock();
1209         fdt = files_fdtable(current->files);     1189         fdt = files_fdtable(current->files);
1210         max_fds = fdt->max_fds;                  1190         max_fds = fdt->max_fds;
1211         rcu_read_unlock();                       1191         rcu_read_unlock();
1212         if (n > max_fds)                         1192         if (n > max_fds)
1213                 n = max_fds;                     1193                 n = max_fds;
1214                                                  1194 
1215         /*                                       1195         /*
1216          * We need 6 bitmaps (in/out/ex for b    1196          * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
1217          * since we used fdset we need to all    1197          * since we used fdset we need to allocate memory in units of
1218          * long-words.                           1198          * long-words.
1219          */                                      1199          */
1220         size = FDS_BYTES(n);                     1200         size = FDS_BYTES(n);
1221         bits = stack_fds;                        1201         bits = stack_fds;
1222         if (size > sizeof(stack_fds) / 6) {      1202         if (size > sizeof(stack_fds) / 6) {
1223                 bits = kmalloc_array(6, size,    1203                 bits = kmalloc_array(6, size, GFP_KERNEL);
1224                 ret = -ENOMEM;                   1204                 ret = -ENOMEM;
1225                 if (!bits)                       1205                 if (!bits)
1226                         goto out_nofds;          1206                         goto out_nofds;
1227         }                                        1207         }
1228         fds.in      = (unsigned long *)  bits    1208         fds.in      = (unsigned long *)  bits;
1229         fds.out     = (unsigned long *) (bits    1209         fds.out     = (unsigned long *) (bits +   size);
1230         fds.ex      = (unsigned long *) (bits    1210         fds.ex      = (unsigned long *) (bits + 2*size);
1231         fds.res_in  = (unsigned long *) (bits    1211         fds.res_in  = (unsigned long *) (bits + 3*size);
1232         fds.res_out = (unsigned long *) (bits    1212         fds.res_out = (unsigned long *) (bits + 4*size);
1233         fds.res_ex  = (unsigned long *) (bits    1213         fds.res_ex  = (unsigned long *) (bits + 5*size);
1234                                                  1214 
1235         if ((ret = compat_get_fd_set(n, inp,     1215         if ((ret = compat_get_fd_set(n, inp, fds.in)) ||
1236             (ret = compat_get_fd_set(n, outp,    1216             (ret = compat_get_fd_set(n, outp, fds.out)) ||
1237             (ret = compat_get_fd_set(n, exp,     1217             (ret = compat_get_fd_set(n, exp, fds.ex)))
1238                 goto out;                        1218                 goto out;
1239         zero_fd_set(n, fds.res_in);              1219         zero_fd_set(n, fds.res_in);
1240         zero_fd_set(n, fds.res_out);             1220         zero_fd_set(n, fds.res_out);
1241         zero_fd_set(n, fds.res_ex);              1221         zero_fd_set(n, fds.res_ex);
1242                                                  1222 
1243         ret = do_select(n, &fds, end_time);      1223         ret = do_select(n, &fds, end_time);
1244                                                  1224 
1245         if (ret < 0)                             1225         if (ret < 0)
1246                 goto out;                        1226                 goto out;
1247         if (!ret) {                              1227         if (!ret) {
1248                 ret = -ERESTARTNOHAND;           1228                 ret = -ERESTARTNOHAND;
1249                 if (signal_pending(current))     1229                 if (signal_pending(current))
1250                         goto out;                1230                         goto out;
1251                 ret = 0;                         1231                 ret = 0;
1252         }                                        1232         }
1253                                                  1233 
1254         if (compat_set_fd_set(n, inp, fds.res    1234         if (compat_set_fd_set(n, inp, fds.res_in) ||
1255             compat_set_fd_set(n, outp, fds.re    1235             compat_set_fd_set(n, outp, fds.res_out) ||
1256             compat_set_fd_set(n, exp, fds.res    1236             compat_set_fd_set(n, exp, fds.res_ex))
1257                 ret = -EFAULT;                   1237                 ret = -EFAULT;
1258 out:                                             1238 out:
1259         if (bits != stack_fds)                   1239         if (bits != stack_fds)
1260                 kfree(bits);                     1240                 kfree(bits);
1261 out_nofds:                                       1241 out_nofds:
1262         return ret;                              1242         return ret;
1263 }                                                1243 }
1264                                                  1244 
1265 static int do_compat_select(int n, compat_ulo    1245 static int do_compat_select(int n, compat_ulong_t __user *inp,
1266         compat_ulong_t __user *outp, compat_u    1246         compat_ulong_t __user *outp, compat_ulong_t __user *exp,
1267         struct old_timeval32 __user *tvp)        1247         struct old_timeval32 __user *tvp)
1268 {                                                1248 {
1269         struct timespec64 end_time, *to = NUL    1249         struct timespec64 end_time, *to = NULL;
1270         struct old_timeval32 tv;                 1250         struct old_timeval32 tv;
1271         int ret;                                 1251         int ret;
1272                                                  1252 
1273         if (tvp) {                               1253         if (tvp) {
1274                 if (copy_from_user(&tv, tvp,     1254                 if (copy_from_user(&tv, tvp, sizeof(tv)))
1275                         return -EFAULT;          1255                         return -EFAULT;
1276                                                  1256 
1277                 to = &end_time;                  1257                 to = &end_time;
1278                 if (poll_select_set_timeout(t    1258                 if (poll_select_set_timeout(to,
1279                                 tv.tv_sec + (    1259                                 tv.tv_sec + (tv.tv_usec / USEC_PER_SEC),
1280                                 (tv.tv_usec %    1260                                 (tv.tv_usec % USEC_PER_SEC) * NSEC_PER_USEC))
1281                         return -EINVAL;          1261                         return -EINVAL;
1282         }                                        1262         }
1283                                                  1263 
1284         ret = compat_core_sys_select(n, inp,     1264         ret = compat_core_sys_select(n, inp, outp, exp, to);
1285         return poll_select_finish(&end_time,     1265         return poll_select_finish(&end_time, tvp, PT_OLD_TIMEVAL, ret);
1286 }                                                1266 }
1287                                                  1267 
1288 COMPAT_SYSCALL_DEFINE5(select, int, n, compat    1268 COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
1289         compat_ulong_t __user *, outp, compat    1269         compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
1290         struct old_timeval32 __user *, tvp)      1270         struct old_timeval32 __user *, tvp)
1291 {                                                1271 {
1292         return do_compat_select(n, inp, outp,    1272         return do_compat_select(n, inp, outp, exp, tvp);
1293 }                                                1273 }
1294                                                  1274 
1295 struct compat_sel_arg_struct {                   1275 struct compat_sel_arg_struct {
1296         compat_ulong_t n;                        1276         compat_ulong_t n;
1297         compat_uptr_t inp;                       1277         compat_uptr_t inp;
1298         compat_uptr_t outp;                      1278         compat_uptr_t outp;
1299         compat_uptr_t exp;                       1279         compat_uptr_t exp;
1300         compat_uptr_t tvp;                       1280         compat_uptr_t tvp;
1301 };                                               1281 };
1302                                                  1282 
1303 COMPAT_SYSCALL_DEFINE1(old_select, struct com    1283 COMPAT_SYSCALL_DEFINE1(old_select, struct compat_sel_arg_struct __user *, arg)
1304 {                                                1284 {
1305         struct compat_sel_arg_struct a;          1285         struct compat_sel_arg_struct a;
1306                                                  1286 
1307         if (copy_from_user(&a, arg, sizeof(a)    1287         if (copy_from_user(&a, arg, sizeof(a)))
1308                 return -EFAULT;                  1288                 return -EFAULT;
1309         return do_compat_select(a.n, compat_p    1289         return do_compat_select(a.n, compat_ptr(a.inp), compat_ptr(a.outp),
1310                                 compat_ptr(a.    1290                                 compat_ptr(a.exp), compat_ptr(a.tvp));
1311 }                                                1291 }
1312                                                  1292 
1313 static long do_compat_pselect(int n, compat_u    1293 static long do_compat_pselect(int n, compat_ulong_t __user *inp,
1314         compat_ulong_t __user *outp, compat_u    1294         compat_ulong_t __user *outp, compat_ulong_t __user *exp,
1315         void __user *tsp, compat_sigset_t __u    1295         void __user *tsp, compat_sigset_t __user *sigmask,
1316         compat_size_t sigsetsize, enum poll_t    1296         compat_size_t sigsetsize, enum poll_time_type type)
1317 {                                                1297 {
1318         struct timespec64 ts, end_time, *to =    1298         struct timespec64 ts, end_time, *to = NULL;
1319         int ret;                                 1299         int ret;
1320                                                  1300 
1321         if (tsp) {                               1301         if (tsp) {
1322                 switch (type) {                  1302                 switch (type) {
1323                 case PT_OLD_TIMESPEC:            1303                 case PT_OLD_TIMESPEC:
1324                         if (get_old_timespec3    1304                         if (get_old_timespec32(&ts, tsp))
1325                                 return -EFAUL    1305                                 return -EFAULT;
1326                         break;                   1306                         break;
1327                 case PT_TIMESPEC:                1307                 case PT_TIMESPEC:
1328                         if (get_timespec64(&t    1308                         if (get_timespec64(&ts, tsp))
1329                                 return -EFAUL    1309                                 return -EFAULT;
1330                         break;                   1310                         break;
1331                 default:                         1311                 default:
1332                         BUG();                   1312                         BUG();
1333                 }                                1313                 }
1334                                                  1314 
1335                 to = &end_time;                  1315                 to = &end_time;
1336                 if (poll_select_set_timeout(t    1316                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1337                         return -EINVAL;          1317                         return -EINVAL;
1338         }                                        1318         }
1339                                                  1319 
1340         ret = set_compat_user_sigmask(sigmask    1320         ret = set_compat_user_sigmask(sigmask, sigsetsize);
1341         if (ret)                                 1321         if (ret)
1342                 return ret;                      1322                 return ret;
1343                                                  1323 
1344         ret = compat_core_sys_select(n, inp,     1324         ret = compat_core_sys_select(n, inp, outp, exp, to);
1345         return poll_select_finish(&end_time,     1325         return poll_select_finish(&end_time, tsp, type, ret);
1346 }                                                1326 }
1347                                                  1327 
1348 struct compat_sigset_argpack {                << 
1349         compat_uptr_t p;                      << 
1350         compat_size_t size;                   << 
1351 };                                            << 
1352 static inline int get_compat_sigset_argpack(s << 
1353                                             s << 
1354 {                                             << 
1355         if (from) {                           << 
1356                 if (!user_read_access_begin(f << 
1357                         return -EFAULT;       << 
1358                 unsafe_get_user(to->p, &from- << 
1359                 unsafe_get_user(to->size, &fr << 
1360                 user_read_access_end();       << 
1361         }                                     << 
1362         return 0;                             << 
1363 Efault:                                       << 
1364         user_access_end();                    << 
1365         return -EFAULT;                       << 
1366 }                                             << 
1367                                               << 
1368 COMPAT_SYSCALL_DEFINE6(pselect6_time64, int,     1328 COMPAT_SYSCALL_DEFINE6(pselect6_time64, int, n, compat_ulong_t __user *, inp,
1369         compat_ulong_t __user *, outp, compat    1329         compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
1370         struct __kernel_timespec __user *, ts    1330         struct __kernel_timespec __user *, tsp, void __user *, sig)
1371 {                                                1331 {
1372         struct compat_sigset_argpack x = {0,  !! 1332         compat_size_t sigsetsize = 0;
                                                   >> 1333         compat_uptr_t up = 0;
1373                                                  1334 
1374         if (get_compat_sigset_argpack(&x, sig !! 1335         if (sig) {
1375                 return -EFAULT;               !! 1336                 if (!access_ok(sig,
                                                   >> 1337                                 sizeof(compat_uptr_t)+sizeof(compat_size_t)) ||
                                                   >> 1338                                 __get_user(up, (compat_uptr_t __user *)sig) ||
                                                   >> 1339                                 __get_user(sigsetsize,
                                                   >> 1340                                 (compat_size_t __user *)(sig+sizeof(up))))
                                                   >> 1341                         return -EFAULT;
                                                   >> 1342         }
1376                                                  1343 
1377         return do_compat_pselect(n, inp, outp !! 1344         return do_compat_pselect(n, inp, outp, exp, tsp, compat_ptr(up),
1378                                  x.size, PT_T !! 1345                                  sigsetsize, PT_TIMESPEC);
1379 }                                                1346 }
1380                                                  1347 
1381 #if defined(CONFIG_COMPAT_32BIT_TIME)            1348 #if defined(CONFIG_COMPAT_32BIT_TIME)
1382                                                  1349 
1383 COMPAT_SYSCALL_DEFINE6(pselect6_time32, int,     1350 COMPAT_SYSCALL_DEFINE6(pselect6_time32, int, n, compat_ulong_t __user *, inp,
1384         compat_ulong_t __user *, outp, compat    1351         compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
1385         struct old_timespec32 __user *, tsp,     1352         struct old_timespec32 __user *, tsp, void __user *, sig)
1386 {                                                1353 {
1387         struct compat_sigset_argpack x = {0,  !! 1354         compat_size_t sigsetsize = 0;
                                                   >> 1355         compat_uptr_t up = 0;
1388                                                  1356 
1389         if (get_compat_sigset_argpack(&x, sig !! 1357         if (sig) {
1390                 return -EFAULT;               !! 1358                 if (!access_ok(sig,
                                                   >> 1359                                 sizeof(compat_uptr_t)+sizeof(compat_size_t)) ||
                                                   >> 1360                         __get_user(up, (compat_uptr_t __user *)sig) ||
                                                   >> 1361                         __get_user(sigsetsize,
                                                   >> 1362                                 (compat_size_t __user *)(sig+sizeof(up))))
                                                   >> 1363                         return -EFAULT;
                                                   >> 1364         }
1391                                                  1365 
1392         return do_compat_pselect(n, inp, outp !! 1366         return do_compat_pselect(n, inp, outp, exp, tsp, compat_ptr(up),
1393                                  x.size, PT_O !! 1367                                  sigsetsize, PT_OLD_TIMESPEC);
1394 }                                                1368 }
1395                                                  1369 
1396 #endif                                           1370 #endif
1397                                                  1371 
1398 #if defined(CONFIG_COMPAT_32BIT_TIME)            1372 #if defined(CONFIG_COMPAT_32BIT_TIME)
1399 COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct p    1373 COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds,
1400         unsigned int,  nfds, struct old_times    1374         unsigned int,  nfds, struct old_timespec32 __user *, tsp,
1401         const compat_sigset_t __user *, sigma    1375         const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
1402 {                                                1376 {
1403         struct timespec64 ts, end_time, *to =    1377         struct timespec64 ts, end_time, *to = NULL;
1404         int ret;                                 1378         int ret;
1405                                                  1379 
1406         if (tsp) {                               1380         if (tsp) {
1407                 if (get_old_timespec32(&ts, t    1381                 if (get_old_timespec32(&ts, tsp))
1408                         return -EFAULT;          1382                         return -EFAULT;
1409                                                  1383 
1410                 to = &end_time;                  1384                 to = &end_time;
1411                 if (poll_select_set_timeout(t    1385                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1412                         return -EINVAL;          1386                         return -EINVAL;
1413         }                                        1387         }
1414                                                  1388 
1415         ret = set_compat_user_sigmask(sigmask    1389         ret = set_compat_user_sigmask(sigmask, sigsetsize);
1416         if (ret)                                 1390         if (ret)
1417                 return ret;                      1391                 return ret;
1418                                                  1392 
1419         ret = do_sys_poll(ufds, nfds, to);       1393         ret = do_sys_poll(ufds, nfds, to);
1420         return poll_select_finish(&end_time,     1394         return poll_select_finish(&end_time, tsp, PT_OLD_TIMESPEC, ret);
1421 }                                                1395 }
1422 #endif                                           1396 #endif
1423                                                  1397 
1424 /* New compat syscall for 64 bit time_t*/        1398 /* New compat syscall for 64 bit time_t*/
1425 COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct p    1399 COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct pollfd __user *, ufds,
1426         unsigned int,  nfds, struct __kernel_    1400         unsigned int,  nfds, struct __kernel_timespec __user *, tsp,
1427         const compat_sigset_t __user *, sigma    1401         const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
1428 {                                                1402 {
1429         struct timespec64 ts, end_time, *to =    1403         struct timespec64 ts, end_time, *to = NULL;
1430         int ret;                                 1404         int ret;
1431                                                  1405 
1432         if (tsp) {                               1406         if (tsp) {
1433                 if (get_timespec64(&ts, tsp))    1407                 if (get_timespec64(&ts, tsp))
1434                         return -EFAULT;          1408                         return -EFAULT;
1435                                                  1409 
1436                 to = &end_time;                  1410                 to = &end_time;
1437                 if (poll_select_set_timeout(t    1411                 if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
1438                         return -EINVAL;          1412                         return -EINVAL;
1439         }                                        1413         }
1440                                                  1414 
1441         ret = set_compat_user_sigmask(sigmask    1415         ret = set_compat_user_sigmask(sigmask, sigsetsize);
1442         if (ret)                                 1416         if (ret)
1443                 return ret;                      1417                 return ret;
1444                                                  1418 
1445         ret = do_sys_poll(ufds, nfds, to);       1419         ret = do_sys_poll(ufds, nfds, to);
1446         return poll_select_finish(&end_time,     1420         return poll_select_finish(&end_time, tsp, PT_TIMESPEC, ret);
1447 }                                                1421 }
1448                                                  1422 
1449 #endif                                           1423 #endif
1450                                                  1424 

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