1 #ifndef _LINUX_POLL_H 2 #define _LINUX_POLL_H 3 4 #include <asm/poll.h> 5 6 #ifdef __KERNEL__ 7 8 #include <linux/compiler.h> 9 #include <linux/wait.h> 10 #include <linux/string.h> 11 #include <linux/mm.h> 12 #include <asm/uaccess.h> 13 14 /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating 15 additional memory. */ 16 #define MAX_STACK_ALLOC 832 17 #define FRONTEND_STACK_ALLOC 256 18 #define SELECT_STACK_ALLOC FRONTEND_STACK_ALLOC 19 #define POLL_STACK_ALLOC FRONTEND_STACK_ALLOC 20 #define WQUEUES_STACK_ALLOC (MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC) 21 #define N_INLINE_POLL_ENTRIES (WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry)) 22 23 struct poll_table_struct; 24 25 /* 26 * structures and helpers for f_op->poll implementations 27 */ 28 typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); 29 30 typedef struct poll_table_struct { 31 poll_queue_proc qproc; 32 } poll_table; 33 34 static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p) 35 { 36 if (p && wait_address) 37 p->qproc(filp, wait_address, p); 38 } 39 40 static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) 41 { 42 pt->qproc = qproc; 43 } 44 45 struct poll_table_entry { 46 struct file * filp; 47 wait_queue_t wait; 48 wait_queue_head_t * wait_address; 49 }; 50 51 /* 52 * Structures and helpers for sys_poll/sys_poll 53 */ 54 struct poll_wqueues { 55 poll_table pt; 56 struct poll_table_page * table; 57 int error; 58 int inline_index; 59 struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES]; 60 }; 61 62 extern void poll_initwait(struct poll_wqueues *pwq); 63 extern void poll_freewait(struct poll_wqueues *pwq); 64 65 /* 66 * Scaleable version of the fd_set. 67 */ 68 69 typedef struct { 70 unsigned long *in, *out, *ex; 71 unsigned long *res_in, *res_out, *res_ex; 72 } fd_set_bits; 73 74 /* 75 * How many longwords for "nr" bits? 76 */ 77 #define FDS_BITPERLONG (8*sizeof(long)) 78 #define FDS_LONGS(nr) (((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG) 79 #define FDS_BYTES(nr) (FDS_LONGS(nr)*sizeof(long)) 80 81 /* 82 * We do a VERIFY_WRITE here even though we are only reading this time: 83 * we'll write to it eventually.. 84 * 85 * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned. 86 */ 87 static inline 88 int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset) 89 { 90 nr = FDS_BYTES(nr); 91 if (ufdset) 92 return copy_from_user(fdset, ufdset, nr) ? -EFAULT : 0; 93 94 memset(fdset, 0, nr); 95 return 0; 96 } 97 98 static inline unsigned long __must_check 99 set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset) 100 { 101 if (ufdset) 102 return __copy_to_user(ufdset, fdset, FDS_BYTES(nr)); 103 return 0; 104 } 105 106 static inline 107 void zero_fd_set(unsigned long nr, unsigned long *fdset) 108 { 109 memset(fdset, 0, FDS_BYTES(nr)); 110 } 111 112 #define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1) 113 114 extern int do_select(int n, fd_set_bits *fds, s64 *timeout); 115 extern int do_sys_poll(struct pollfd __user * ufds, unsigned int nfds, 116 s64 *timeout); 117 118 #endif /* KERNEL */ 119 120 #endif /* _LINUX_POLL_H */ 121