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