Home | History | Annotate | Download | only in linux
      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