Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142/* SPDX-License-Identifier: GPL-2.0 */#ifndef _LINUX_POLL_H#define _LINUX_POLL_H
#include <linux/compiler.h>#include <linux/ktime.h>#include <linux/wait.h>#include <linux/string.h>#include <linux/fs.h>#include <linux/uaccess.h>#include <uapi/linux/poll.h>#include <uapi/linux/eventpoll.h>
/* ~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))
#define DEFAULT_POLLMASK (EPOLLIN | EPOLLOUT | EPOLLRDNORM | EPOLLWRNORM)
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 *);
/* * Do not touch the structure directly, use the access function * poll_requested_events() instead. */typedef struct poll_table_struct { poll_queue_proc _qproc; __poll_t _key;} poll_table;
static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p){ if (p && p->_qproc) { p->_qproc(filp, wait_address, p); /* * This memory barrier is paired in the wq_has_sleeper(). * See the comment above prepare_to_wait(), we need to * ensure that subsequent tests in this thread can't be * reordered with __add_wait_queue() in _qproc() paths. */ smp_mb(); }}
/* * 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 __poll_t poll_requested_events(const poll_table *p){ return p ? p->_key : ~(__poll_t)0;}
static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc){ pt->_qproc = qproc; pt->_key = ~(__poll_t)0; /* all events enabled */}
static inline bool file_can_poll(struct file *file){ return file->f_op->poll;}
static inline __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt){ if (unlikely(!file->f_op->poll)) return DEFAULT_POLLMASK; return file->f_op->poll(file, pt);}
struct poll_table_entry { struct file *filp; __poll_t key; wait_queue_entry_t wait; wait_queue_head_t *wait_address;};
/* * Structures and helpers for select/poll syscall */struct poll_wqueues { poll_table pt; struct poll_table_page *table; struct task_struct *polling_task; int triggered; int error; int inline_index; struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES];};
extern void poll_initwait(struct poll_wqueues *pwq);extern void poll_freewait(struct poll_wqueues *pwq);extern u64 select_estimate_accuracy(struct timespec64 *tv);
#define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1)
extern int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timespec64 *end_time);
extern int poll_select_set_timeout(struct timespec64 *to, time64_t sec, long nsec);
#define __MAP(v, from, to) \ (from < to ? (v & from) * (to/from) : (v & from) / (from/to))
static inline __u16 mangle_poll(__poll_t val){ __u16 v = (__force __u16)val;#define M(X) __MAP(v, (__force __u16)EPOLL##X, POLL##X) return M(IN) | M(OUT) | M(PRI) | M(ERR) | M(NVAL) | M(RDNORM) | M(RDBAND) | M(WRNORM) | M(WRBAND) | M(HUP) | M(RDHUP) | M(MSG);#undef M}
static inline __poll_t demangle_poll(u16 val){#define M(X) (__force __poll_t)__MAP(val, POLL##X, (__force __u16)EPOLL##X) return M(IN) | M(OUT) | M(PRI) | M(ERR) | M(NVAL) | M(RDNORM) | M(RDBAND) | M(WRNORM) | M(WRBAND) | M(HUP) | M(RDHUP) | M(MSG);#undef M}#undef __MAP
#endif /* _LINUX_POLL_H */