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