~ [ 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 ccs-tools-1.8.12)


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

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

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

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

sflogo.php