poll.h 4.49 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5
#ifndef _LINUX_POLL_H
#define _LINUX_POLL_H


#include <linux/compiler.h>
6
#include <linux/ktime.h>
Linus Torvalds's avatar
Linus Torvalds committed
7 8
#include <linux/wait.h>
#include <linux/string.h>
9
#include <linux/fs.h>
Dave Young's avatar
Dave Young committed
10
#include <linux/sysctl.h>
Linus Torvalds's avatar
Linus Torvalds committed
11
#include <asm/uaccess.h>
12
#include <uapi/linux/poll.h>
Linus Torvalds's avatar
Linus Torvalds committed
13

Dave Young's avatar
Dave Young committed
14
extern struct ctl_table epoll_table[]; /* for sysctl */
15 16 17 18 19 20 21 22 23
/* ~832 bytes of stack space used max in sys_select/sys_poll before allocating
   additional memory. */
#define MAX_STACK_ALLOC 832
#define FRONTEND_STACK_ALLOC	256
#define SELECT_STACK_ALLOC	FRONTEND_STACK_ALLOC
#define POLL_STACK_ALLOC	FRONTEND_STACK_ALLOC
#define WQUEUES_STACK_ALLOC	(MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC)
#define N_INLINE_POLL_ENTRIES	(WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry))

24 25
#define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)

Linus Torvalds's avatar
Linus Torvalds committed
26 27 28 29 30 31 32
struct poll_table_struct;

/* 
 * structures and helpers for f_op->poll implementations
 */
typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);

33 34 35 36
/*
 * Do not touch the structure directly, use the access functions
 * poll_does_not_wait() and poll_requested_events() instead.
 */
Linus Torvalds's avatar
Linus Torvalds committed
37
typedef struct poll_table_struct {
38 39
	poll_queue_proc _qproc;
	unsigned long _key;
Linus Torvalds's avatar
Linus Torvalds committed
40 41 42 43
} poll_table;

static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
{
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
	if (p && p->_qproc && wait_address)
		p->_qproc(filp, wait_address, p);
}

/*
 * Return true if it is guaranteed that poll will not wait. This is the case
 * if the poll() of another file descriptor in the set got an event, so there
 * is no need for waiting.
 */
static inline bool poll_does_not_wait(const poll_table *p)
{
	return p == NULL || p->_qproc == NULL;
}

/*
 * Return the set of events that the application wants to poll for.
 * This is useful for drivers that need to know whether a DMA transfer has
 * to be started implicitly on poll(). You typically only want to do that
 * if the application is actually polling for POLLIN and/or POLLOUT.
 */
static inline unsigned long poll_requested_events(const poll_table *p)
{
	return p ? p->_key : ~0UL;
Linus Torvalds's avatar
Linus Torvalds committed
67 68 69 70
}

static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc)
{
71 72
	pt->_qproc = qproc;
	pt->_key   = ~0UL; /* all events enabled */
Linus Torvalds's avatar
Linus Torvalds committed
73 74
}

75
struct poll_table_entry {
76
	struct file *filp;
77
	unsigned long key;
78
	wait_queue_t wait;
79
	wait_queue_head_t *wait_address;
80 81
};

Linus Torvalds's avatar
Linus Torvalds committed
82
/*
83
 * Structures and helpers for select/poll syscall
Linus Torvalds's avatar
Linus Torvalds committed
84 85 86
 */
struct poll_wqueues {
	poll_table pt;
87 88 89
	struct poll_table_page *table;
	struct task_struct *polling_task;
	int triggered;
Linus Torvalds's avatar
Linus Torvalds committed
90
	int error;
91 92
	int inline_index;
	struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES];
Linus Torvalds's avatar
Linus Torvalds committed
93 94 95 96
};

extern void poll_initwait(struct poll_wqueues *pwq);
extern void poll_freewait(struct poll_wqueues *pwq);
97 98
extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
				 ktime_t *expires, unsigned long slack);
99
extern u64 select_estimate_accuracy(struct timespec64 *tv);
100

101 102 103 104 105

static inline int poll_schedule(struct poll_wqueues *pwq, int state)
{
	return poll_schedule_timeout(pwq, state, NULL, 0);
}
Linus Torvalds's avatar
Linus Torvalds committed
106 107

/*
108
 * Scalable version of the fd_set.
Linus Torvalds's avatar
Linus Torvalds committed
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
 */

typedef struct {
	unsigned long *in, *out, *ex;
	unsigned long *res_in, *res_out, *res_ex;
} fd_set_bits;

/*
 * How many longwords for "nr" bits?
 */
#define FDS_BITPERLONG	(8*sizeof(long))
#define FDS_LONGS(nr)	(((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG)
#define FDS_BYTES(nr)	(FDS_LONGS(nr)*sizeof(long))

/*
 * We do a VERIFY_WRITE here even though we are only reading this time:
 * we'll write to it eventually..
 *
 * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
 */
static inline
int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
{
	nr = FDS_BYTES(nr);
	if (ufdset)
		return copy_from_user(fdset, ufdset, nr) ? -EFAULT : 0;

	memset(fdset, 0, nr);
	return 0;
}

static inline unsigned long __must_check
set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
{
	if (ufdset)
		return __copy_to_user(ufdset, fdset, FDS_BYTES(nr));
	return 0;
}

static inline
void zero_fd_set(unsigned long nr, unsigned long *fdset)
{
	memset(fdset, 0, FDS_BYTES(nr));
}

154 155
#define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1)

156
extern int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time);
157
extern int do_sys_poll(struct pollfd __user * ufds, unsigned int nfds,
158
		       struct timespec64 *end_time);
159
extern int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
160
			   fd_set __user *exp, struct timespec64 *end_time);
Linus Torvalds's avatar
Linus Torvalds committed
161

162 163
extern int poll_select_set_timeout(struct timespec64 *to, time64_t sec,
				   long nsec);
164

Linus Torvalds's avatar
Linus Torvalds committed
165
#endif /* _LINUX_POLL_H */