mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
Merge branch 'work.aio-1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull aio updates from Al Viro: "Majority of AIO stuff this cycle. aio-fsync and aio-poll, mostly. The only thing I'm holding back for a day or so is Adam's aio ioprio - his last-minute fixup is trivial (missing stub in !CONFIG_BLOCK case), but let it sit in -next for decency sake..." * 'work.aio-1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (46 commits) aio: sanitize the limit checking in io_submit(2) aio: fold do_io_submit() into callers aio: shift copyin of iocb into io_submit_one() aio_read_events_ring(): make a bit more readable aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way aio: take list removal to (some) callers of aio_complete() aio: add missing break for the IOCB_CMD_FDSYNC case random: convert to ->poll_mask timerfd: convert to ->poll_mask eventfd: switch to ->poll_mask pipe: convert to ->poll_mask crypto: af_alg: convert to ->poll_mask net/rxrpc: convert to ->poll_mask net/iucv: convert to ->poll_mask net/phonet: convert to ->poll_mask net/nfc: convert to ->poll_mask net/caif: convert to ->poll_mask net/bluetooth: convert to ->poll_mask net/sctp: convert to ->poll_mask net/tipc: convert to ->poll_mask ...
This commit is contained in:
commit
408afb8d78
@ -440,7 +440,9 @@ prototypes:
|
||||
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
|
||||
int (*iterate) (struct file *, struct dir_context *);
|
||||
int (*iterate_shared) (struct file *, struct dir_context *);
|
||||
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
||||
__poll_t (*poll) (struct file *, struct poll_table_struct *);
|
||||
struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t);
|
||||
__poll_t (*poll_mask) (struct file *, __poll_t);
|
||||
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
int (*mmap) (struct file *, struct vm_area_struct *);
|
||||
@ -471,7 +473,7 @@ prototypes:
|
||||
};
|
||||
|
||||
locking rules:
|
||||
All may block.
|
||||
All except for ->poll_mask may block.
|
||||
|
||||
->llseek() locking has moved from llseek to the individual llseek
|
||||
implementations. If your fs is not using generic_file_llseek, you
|
||||
@ -503,6 +505,9 @@ in sys_read() and friends.
|
||||
the lease within the individual filesystem to record the result of the
|
||||
operation
|
||||
|
||||
->poll_mask can be called with or without the waitqueue lock for the waitqueue
|
||||
returned from ->get_poll_head.
|
||||
|
||||
--------------------------- dquot_operations -------------------------------
|
||||
prototypes:
|
||||
int (*write_dquot) (struct dquot *);
|
||||
|
@ -856,7 +856,9 @@ struct file_operations {
|
||||
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
|
||||
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
|
||||
int (*iterate) (struct file *, struct dir_context *);
|
||||
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
||||
__poll_t (*poll) (struct file *, struct poll_table_struct *);
|
||||
struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t);
|
||||
__poll_t (*poll_mask) (struct file *, __poll_t);
|
||||
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
int (*mmap) (struct file *, struct vm_area_struct *);
|
||||
@ -901,6 +903,17 @@ otherwise noted.
|
||||
activity on this file and (optionally) go to sleep until there
|
||||
is activity. Called by the select(2) and poll(2) system calls
|
||||
|
||||
get_poll_head: Returns the struct wait_queue_head that callers can
|
||||
wait on. Callers need to check the returned events using ->poll_mask
|
||||
once woken. Can return NULL to indicate polling is not supported,
|
||||
or any error code using the ERR_PTR convention to indicate that a
|
||||
grave error occured and ->poll_mask shall not be called.
|
||||
|
||||
poll_mask: return the mask of EPOLL* values describing the file descriptor
|
||||
state. Called either before going to sleep on the waitqueue returned by
|
||||
get_poll_head, or after it has been woken. If ->get_poll_head and
|
||||
->poll_mask are implemented ->poll does not need to be implement.
|
||||
|
||||
unlocked_ioctl: called by the ioctl(2) system call.
|
||||
|
||||
compat_ioctl: called by the ioctl(2) system call when 32 bit system calls
|
||||
|
@ -396,3 +396,4 @@
|
||||
382 i386 pkey_free sys_pkey_free __ia32_sys_pkey_free
|
||||
383 i386 statx sys_statx __ia32_sys_statx
|
||||
384 i386 arch_prctl sys_arch_prctl __ia32_compat_sys_arch_prctl
|
||||
385 i386 io_pgetevents sys_io_pgetevents __ia32_compat_sys_io_pgetevents
|
||||
|
@ -341,6 +341,7 @@
|
||||
330 common pkey_alloc __x64_sys_pkey_alloc
|
||||
331 common pkey_free __x64_sys_pkey_free
|
||||
332 common statx __x64_sys_statx
|
||||
333 common io_pgetevents __x64_sys_io_pgetevents
|
||||
|
||||
#
|
||||
# x32-specific system call numbers start at 512 to avoid cache impact
|
||||
|
@ -347,7 +347,6 @@ static const struct proto_ops alg_proto_ops = {
|
||||
.sendpage = sock_no_sendpage,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.recvmsg = sock_no_recvmsg,
|
||||
.poll = sock_no_poll,
|
||||
|
||||
.bind = alg_bind,
|
||||
.release = af_alg_release,
|
||||
@ -1061,19 +1060,12 @@ void af_alg_async_cb(struct crypto_async_request *_req, int err)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_async_cb);
|
||||
|
||||
/**
|
||||
* af_alg_poll - poll system call handler
|
||||
*/
|
||||
__poll_t af_alg_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
__poll_t af_alg_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct af_alg_ctx *ctx = ask->private;
|
||||
__poll_t mask;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
__poll_t mask = 0;
|
||||
|
||||
if (!ctx->more || ctx->used)
|
||||
mask |= EPOLLIN | EPOLLRDNORM;
|
||||
@ -1083,7 +1075,7 @@ __poll_t af_alg_poll(struct file *file, struct socket *sock,
|
||||
|
||||
return mask;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_poll);
|
||||
EXPORT_SYMBOL_GPL(af_alg_poll_mask);
|
||||
|
||||
/**
|
||||
* af_alg_alloc_areq - allocate struct af_alg_async_req
|
||||
|
@ -375,7 +375,7 @@ static struct proto_ops algif_aead_ops = {
|
||||
.sendmsg = aead_sendmsg,
|
||||
.sendpage = af_alg_sendpage,
|
||||
.recvmsg = aead_recvmsg,
|
||||
.poll = af_alg_poll,
|
||||
.poll_mask = af_alg_poll_mask,
|
||||
};
|
||||
|
||||
static int aead_check_key(struct socket *sock)
|
||||
@ -471,7 +471,7 @@ static struct proto_ops algif_aead_ops_nokey = {
|
||||
.sendmsg = aead_sendmsg_nokey,
|
||||
.sendpage = aead_sendpage_nokey,
|
||||
.recvmsg = aead_recvmsg_nokey,
|
||||
.poll = af_alg_poll,
|
||||
.poll_mask = af_alg_poll_mask,
|
||||
};
|
||||
|
||||
static void *aead_bind(const char *name, u32 type, u32 mask)
|
||||
|
@ -288,7 +288,6 @@ static struct proto_ops algif_hash_ops = {
|
||||
.mmap = sock_no_mmap,
|
||||
.bind = sock_no_bind,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
.poll = sock_no_poll,
|
||||
|
||||
.release = af_alg_release,
|
||||
.sendmsg = hash_sendmsg,
|
||||
@ -396,7 +395,6 @@ static struct proto_ops algif_hash_ops_nokey = {
|
||||
.mmap = sock_no_mmap,
|
||||
.bind = sock_no_bind,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
.poll = sock_no_poll,
|
||||
|
||||
.release = af_alg_release,
|
||||
.sendmsg = hash_sendmsg_nokey,
|
||||
|
@ -106,7 +106,6 @@ static struct proto_ops algif_rng_ops = {
|
||||
.bind = sock_no_bind,
|
||||
.accept = sock_no_accept,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
.poll = sock_no_poll,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.sendpage = sock_no_sendpage,
|
||||
|
||||
|
@ -205,7 +205,7 @@ static struct proto_ops algif_skcipher_ops = {
|
||||
.sendmsg = skcipher_sendmsg,
|
||||
.sendpage = af_alg_sendpage,
|
||||
.recvmsg = skcipher_recvmsg,
|
||||
.poll = af_alg_poll,
|
||||
.poll_mask = af_alg_poll_mask,
|
||||
};
|
||||
|
||||
static int skcipher_check_key(struct socket *sock)
|
||||
@ -301,7 +301,7 @@ static struct proto_ops algif_skcipher_ops_nokey = {
|
||||
.sendmsg = skcipher_sendmsg_nokey,
|
||||
.sendpage = skcipher_sendpage_nokey,
|
||||
.recvmsg = skcipher_recvmsg_nokey,
|
||||
.poll = af_alg_poll,
|
||||
.poll_mask = af_alg_poll_mask,
|
||||
};
|
||||
|
||||
static void *skcipher_bind(const char *name, u32 type, u32 mask)
|
||||
|
@ -402,8 +402,7 @@ static struct poolinfo {
|
||||
/*
|
||||
* Static global variables
|
||||
*/
|
||||
static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);
|
||||
static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
|
||||
static DECLARE_WAIT_QUEUE_HEAD(random_wait);
|
||||
static struct fasync_struct *fasync;
|
||||
|
||||
static DEFINE_SPINLOCK(random_ready_list_lock);
|
||||
@ -722,8 +721,8 @@ retry:
|
||||
|
||||
/* should we wake readers? */
|
||||
if (entropy_bits >= random_read_wakeup_bits &&
|
||||
wq_has_sleeper(&random_read_wait)) {
|
||||
wake_up_interruptible(&random_read_wait);
|
||||
wq_has_sleeper(&random_wait)) {
|
||||
wake_up_interruptible_poll(&random_wait, POLLIN);
|
||||
kill_fasync(&fasync, SIGIO, POLL_IN);
|
||||
}
|
||||
/* If the input pool is getting full, send some
|
||||
@ -1397,7 +1396,7 @@ retry:
|
||||
trace_debit_entropy(r->name, 8 * ibytes);
|
||||
if (ibytes &&
|
||||
(r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) {
|
||||
wake_up_interruptible(&random_write_wait);
|
||||
wake_up_interruptible_poll(&random_wait, POLLOUT);
|
||||
kill_fasync(&fasync, SIGIO, POLL_OUT);
|
||||
}
|
||||
|
||||
@ -1839,7 +1838,7 @@ _random_read(int nonblock, char __user *buf, size_t nbytes)
|
||||
if (nonblock)
|
||||
return -EAGAIN;
|
||||
|
||||
wait_event_interruptible(random_read_wait,
|
||||
wait_event_interruptible(random_wait,
|
||||
ENTROPY_BITS(&input_pool) >=
|
||||
random_read_wakeup_bits);
|
||||
if (signal_pending(current))
|
||||
@ -1876,14 +1875,17 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static __poll_t
|
||||
random_poll(struct file *file, poll_table * wait)
|
||||
static struct wait_queue_head *
|
||||
random_get_poll_head(struct file *file, __poll_t events)
|
||||
{
|
||||
__poll_t mask;
|
||||
return &random_wait;
|
||||
}
|
||||
|
||||
static __poll_t
|
||||
random_poll_mask(struct file *file, __poll_t events)
|
||||
{
|
||||
__poll_t mask = 0;
|
||||
|
||||
poll_wait(file, &random_read_wait, wait);
|
||||
poll_wait(file, &random_write_wait, wait);
|
||||
mask = 0;
|
||||
if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits)
|
||||
mask |= EPOLLIN | EPOLLRDNORM;
|
||||
if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits)
|
||||
@ -1990,7 +1992,8 @@ static int random_fasync(int fd, struct file *filp, int on)
|
||||
const struct file_operations random_fops = {
|
||||
.read = random_read,
|
||||
.write = random_write,
|
||||
.poll = random_poll,
|
||||
.get_poll_head = random_get_poll_head,
|
||||
.poll_mask = random_poll_mask,
|
||||
.unlocked_ioctl = random_ioctl,
|
||||
.fasync = random_fasync,
|
||||
.llseek = noop_llseek,
|
||||
@ -2323,7 +2326,7 @@ void add_hwgenerator_randomness(const char *buffer, size_t count,
|
||||
* We'll be woken up again once below random_write_wakeup_thresh,
|
||||
* or when the calling thread is about to terminate.
|
||||
*/
|
||||
wait_event_interruptible(random_write_wait, kthread_should_stop() ||
|
||||
wait_event_interruptible(random_wait, kthread_should_stop() ||
|
||||
ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits);
|
||||
mix_pool_bytes(poolp, buffer, count);
|
||||
credit_entropy_bits(poolp, entropy);
|
||||
|
@ -588,7 +588,7 @@ static const struct proto_ops data_sock_ops = {
|
||||
.getname = data_sock_getname,
|
||||
.sendmsg = mISDN_sock_sendmsg,
|
||||
.recvmsg = mISDN_sock_recvmsg,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = data_sock_setsockopt,
|
||||
@ -745,7 +745,6 @@ static const struct proto_ops base_sock_ops = {
|
||||
.getname = sock_no_getname,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.recvmsg = sock_no_recvmsg,
|
||||
.poll = sock_no_poll,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
|
@ -1107,7 +1107,7 @@ static const struct proto_ops pppoe_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = pppoe_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
|
@ -624,7 +624,6 @@ static const struct proto_ops pptp_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = pptp_getname,
|
||||
.poll = sock_no_poll,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
|
@ -113,7 +113,7 @@ static void serial2002_tty_read_poll_wait(struct file *f, int timeout)
|
||||
long elapsed;
|
||||
__poll_t mask;
|
||||
|
||||
mask = f->f_op->poll(f, &table.pt);
|
||||
mask = vfs_poll(f, &table.pt);
|
||||
if (mask & (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN |
|
||||
EPOLLHUP | EPOLLERR)) {
|
||||
break;
|
||||
@ -136,7 +136,7 @@ static int serial2002_tty_read(struct file *f, int timeout)
|
||||
|
||||
result = -1;
|
||||
if (!IS_ERR(f)) {
|
||||
if (f->f_op->poll) {
|
||||
if (file_can_poll(f)) {
|
||||
serial2002_tty_read_poll_wait(f, timeout);
|
||||
|
||||
if (kernel_read(f, &ch, 1, &pos) == 1)
|
||||
|
@ -1965,7 +1965,7 @@ static const struct proto_ops ipx_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = ipx_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = ipx_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = ipx_compat_ioctl,
|
||||
|
@ -166,7 +166,7 @@ int vfio_virqfd_enable(void *opaque,
|
||||
init_waitqueue_func_entry(&virqfd->wait, virqfd_wakeup);
|
||||
init_poll_funcptr(&virqfd->pt, virqfd_ptable_queue_proc);
|
||||
|
||||
events = irqfd.file->f_op->poll(irqfd.file, &virqfd->pt);
|
||||
events = vfs_poll(irqfd.file, &virqfd->pt);
|
||||
|
||||
/*
|
||||
* Check if there was an event already pending on the eventfd
|
||||
|
@ -208,7 +208,7 @@ int vhost_poll_start(struct vhost_poll *poll, struct file *file)
|
||||
if (poll->wqh)
|
||||
return 0;
|
||||
|
||||
mask = file->f_op->poll(file, &poll->table);
|
||||
mask = vfs_poll(file, &poll->table);
|
||||
if (mask)
|
||||
vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask));
|
||||
if (mask & EPOLLERR) {
|
||||
|
15
fs/eventfd.c
15
fs/eventfd.c
@ -101,14 +101,20 @@ static int eventfd_release(struct inode *inode, struct file *file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __poll_t eventfd_poll(struct file *file, poll_table *wait)
|
||||
static struct wait_queue_head *
|
||||
eventfd_get_poll_head(struct file *file, __poll_t events)
|
||||
{
|
||||
struct eventfd_ctx *ctx = file->private_data;
|
||||
|
||||
return &ctx->wqh;
|
||||
}
|
||||
|
||||
static __poll_t eventfd_poll_mask(struct file *file, __poll_t eventmask)
|
||||
{
|
||||
struct eventfd_ctx *ctx = file->private_data;
|
||||
__poll_t events = 0;
|
||||
u64 count;
|
||||
|
||||
poll_wait(file, &ctx->wqh, wait);
|
||||
|
||||
/*
|
||||
* All writes to ctx->count occur within ctx->wqh.lock. This read
|
||||
* can be done outside ctx->wqh.lock because we know that poll_wait
|
||||
@ -305,7 +311,8 @@ static const struct file_operations eventfd_fops = {
|
||||
.show_fdinfo = eventfd_show_fdinfo,
|
||||
#endif
|
||||
.release = eventfd_release,
|
||||
.poll = eventfd_poll,
|
||||
.get_poll_head = eventfd_get_poll_head,
|
||||
.poll_mask = eventfd_poll_mask,
|
||||
.read = eventfd_read,
|
||||
.write = eventfd_write,
|
||||
.llseek = noop_llseek,
|
||||
|
@ -884,8 +884,7 @@ static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt,
|
||||
|
||||
pt->_key = epi->event.events;
|
||||
if (!is_file_epoll(epi->ffd.file))
|
||||
return epi->ffd.file->f_op->poll(epi->ffd.file, pt) &
|
||||
epi->event.events;
|
||||
return vfs_poll(epi->ffd.file, pt) & epi->event.events;
|
||||
|
||||
ep = epi->ffd.file->private_data;
|
||||
poll_wait(epi->ffd.file, &ep->poll_wait, pt);
|
||||
@ -2025,7 +2024,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
|
||||
|
||||
/* The target file descriptor must support poll */
|
||||
error = -EPERM;
|
||||
if (!tf.file->f_op->poll)
|
||||
if (!file_can_poll(tf.file))
|
||||
goto error_tgt_fput;
|
||||
|
||||
/* Check if EPOLLWAKEUP is allowed */
|
||||
|
22
fs/pipe.c
22
fs/pipe.c
@ -509,19 +509,22 @@ static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
}
|
||||
|
||||
/* No kernel lock held - fine */
|
||||
static __poll_t
|
||||
pipe_poll(struct file *filp, poll_table *wait)
|
||||
static struct wait_queue_head *
|
||||
pipe_get_poll_head(struct file *filp, __poll_t events)
|
||||
{
|
||||
__poll_t mask;
|
||||
struct pipe_inode_info *pipe = filp->private_data;
|
||||
int nrbufs;
|
||||
|
||||
poll_wait(filp, &pipe->wait, wait);
|
||||
return &pipe->wait;
|
||||
}
|
||||
|
||||
/* No kernel lock held - fine */
|
||||
static __poll_t pipe_poll_mask(struct file *filp, __poll_t events)
|
||||
{
|
||||
struct pipe_inode_info *pipe = filp->private_data;
|
||||
int nrbufs = pipe->nrbufs;
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* Reading only -- no need for acquiring the semaphore. */
|
||||
nrbufs = pipe->nrbufs;
|
||||
mask = 0;
|
||||
if (filp->f_mode & FMODE_READ) {
|
||||
mask = (nrbufs > 0) ? EPOLLIN | EPOLLRDNORM : 0;
|
||||
if (!pipe->writers && filp->f_version != pipe->w_counter)
|
||||
@ -1020,7 +1023,8 @@ const struct file_operations pipefifo_fops = {
|
||||
.llseek = no_llseek,
|
||||
.read_iter = pipe_read,
|
||||
.write_iter = pipe_write,
|
||||
.poll = pipe_poll,
|
||||
.get_poll_head = pipe_get_poll_head,
|
||||
.poll_mask = pipe_poll_mask,
|
||||
.unlocked_ioctl = pipe_ioctl,
|
||||
.release = pipe_release,
|
||||
.fasync = pipe_fasync,
|
||||
|
83
fs/select.c
83
fs/select.c
@ -34,6 +34,29 @@
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
__poll_t vfs_poll(struct file *file, struct poll_table_struct *pt)
|
||||
{
|
||||
if (file->f_op->poll) {
|
||||
return file->f_op->poll(file, pt);
|
||||
} else if (file_has_poll_mask(file)) {
|
||||
unsigned int events = poll_requested_events(pt);
|
||||
struct wait_queue_head *head;
|
||||
|
||||
if (pt && pt->_qproc) {
|
||||
head = file->f_op->get_poll_head(file, events);
|
||||
if (!head)
|
||||
return DEFAULT_POLLMASK;
|
||||
if (IS_ERR(head))
|
||||
return EPOLLERR;
|
||||
pt->_qproc(file, head, pt);
|
||||
}
|
||||
|
||||
return file->f_op->poll_mask(file, events);
|
||||
} else {
|
||||
return DEFAULT_POLLMASK;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vfs_poll);
|
||||
|
||||
/*
|
||||
* Estimate expected accuracy in ns from a timeval.
|
||||
@ -233,7 +256,7 @@ static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,
|
||||
add_wait_queue(wait_address, &entry->wait);
|
||||
}
|
||||
|
||||
int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
|
||||
static int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
|
||||
ktime_t *expires, unsigned long slack)
|
||||
{
|
||||
int rc = -EINTR;
|
||||
@ -258,7 +281,6 @@ int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(poll_schedule_timeout);
|
||||
|
||||
/**
|
||||
* poll_select_set_timeout - helper function to setup the timeout value
|
||||
@ -503,14 +525,10 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
|
||||
continue;
|
||||
f = fdget(i);
|
||||
if (f.file) {
|
||||
const struct file_operations *f_op;
|
||||
f_op = f.file->f_op;
|
||||
mask = DEFAULT_POLLMASK;
|
||||
if (f_op->poll) {
|
||||
wait_key_set(wait, in, out,
|
||||
bit, busy_flag);
|
||||
mask = (*f_op->poll)(f.file, wait);
|
||||
}
|
||||
wait_key_set(wait, in, out, bit,
|
||||
busy_flag);
|
||||
mask = vfs_poll(f.file, wait);
|
||||
|
||||
fdput(f);
|
||||
if ((mask & POLLIN_SET) && (in & bit)) {
|
||||
res_in |= bit;
|
||||
@ -813,34 +831,29 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
|
||||
bool *can_busy_poll,
|
||||
__poll_t busy_flag)
|
||||
{
|
||||
__poll_t mask;
|
||||
int fd;
|
||||
int fd = pollfd->fd;
|
||||
__poll_t mask = 0, filter;
|
||||
struct fd f;
|
||||
|
||||
mask = 0;
|
||||
fd = pollfd->fd;
|
||||
if (fd >= 0) {
|
||||
struct fd f = fdget(fd);
|
||||
mask = EPOLLNVAL;
|
||||
if (f.file) {
|
||||
/* userland u16 ->events contains POLL... bitmap */
|
||||
__poll_t filter = demangle_poll(pollfd->events) |
|
||||
EPOLLERR | EPOLLHUP;
|
||||
mask = DEFAULT_POLLMASK;
|
||||
if (f.file->f_op->poll) {
|
||||
pwait->_key = filter;
|
||||
pwait->_key |= busy_flag;
|
||||
mask = f.file->f_op->poll(f.file, pwait);
|
||||
if (mask & busy_flag)
|
||||
*can_busy_poll = true;
|
||||
}
|
||||
/* Mask out unneeded events. */
|
||||
mask &= filter;
|
||||
fdput(f);
|
||||
}
|
||||
}
|
||||
if (fd < 0)
|
||||
goto out;
|
||||
mask = EPOLLNVAL;
|
||||
f = fdget(fd);
|
||||
if (!f.file)
|
||||
goto out;
|
||||
|
||||
/* userland u16 ->events contains POLL... bitmap */
|
||||
filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
|
||||
pwait->_key = filter | busy_flag;
|
||||
mask = vfs_poll(f.file, pwait);
|
||||
if (mask & busy_flag)
|
||||
*can_busy_poll = true;
|
||||
mask &= filter; /* Mask out unneeded events. */
|
||||
fdput(f);
|
||||
|
||||
out:
|
||||
/* ... and so does ->revents */
|
||||
pollfd->revents = mangle_poll(mask);
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
|
22
fs/timerfd.c
22
fs/timerfd.c
@ -226,21 +226,20 @@ static int timerfd_release(struct inode *inode, struct file *file)
|
||||
kfree_rcu(ctx, rcu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __poll_t timerfd_poll(struct file *file, poll_table *wait)
|
||||
|
||||
static struct wait_queue_head *timerfd_get_poll_head(struct file *file,
|
||||
__poll_t eventmask)
|
||||
{
|
||||
struct timerfd_ctx *ctx = file->private_data;
|
||||
__poll_t events = 0;
|
||||
unsigned long flags;
|
||||
|
||||
poll_wait(file, &ctx->wqh, wait);
|
||||
return &ctx->wqh;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ctx->wqh.lock, flags);
|
||||
if (ctx->ticks)
|
||||
events |= EPOLLIN;
|
||||
spin_unlock_irqrestore(&ctx->wqh.lock, flags);
|
||||
static __poll_t timerfd_poll_mask(struct file *file, __poll_t eventmask)
|
||||
{
|
||||
struct timerfd_ctx *ctx = file->private_data;
|
||||
|
||||
return events;
|
||||
return ctx->ticks ? EPOLLIN : 0;
|
||||
}
|
||||
|
||||
static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count,
|
||||
@ -364,7 +363,8 @@ static long timerfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
|
||||
static const struct file_operations timerfd_fops = {
|
||||
.release = timerfd_release,
|
||||
.poll = timerfd_poll,
|
||||
.get_poll_head = timerfd_get_poll_head,
|
||||
.poll_mask = timerfd_poll_mask,
|
||||
.read = timerfd_read,
|
||||
.llseek = noop_llseek,
|
||||
.show_fdinfo = timerfd_show,
|
||||
|
@ -245,8 +245,7 @@ ssize_t af_alg_sendpage(struct socket *sock, struct page *page,
|
||||
int offset, size_t size, int flags);
|
||||
void af_alg_free_resources(struct af_alg_async_req *areq);
|
||||
void af_alg_async_cb(struct crypto_async_request *_req, int err);
|
||||
__poll_t af_alg_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait);
|
||||
__poll_t af_alg_poll_mask(struct socket *sock, __poll_t events);
|
||||
struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
|
||||
unsigned int areqlen);
|
||||
int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
|
||||
|
@ -8,8 +8,6 @@ struct kioctx;
|
||||
struct kiocb;
|
||||
struct mm_struct;
|
||||
|
||||
#define KIOCB_KEY 0
|
||||
|
||||
typedef int (kiocb_cancel_fn)(struct kiocb *);
|
||||
|
||||
/* prototypes */
|
||||
|
@ -330,6 +330,7 @@ extern int put_compat_rusage(const struct rusage *,
|
||||
struct compat_rusage __user *);
|
||||
|
||||
struct compat_siginfo;
|
||||
struct __compat_aio_sigset;
|
||||
|
||||
struct compat_dirent {
|
||||
u32 d_ino;
|
||||
@ -553,6 +554,12 @@ asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id,
|
||||
compat_long_t nr,
|
||||
struct io_event __user *events,
|
||||
struct compat_timespec __user *timeout);
|
||||
asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
|
||||
compat_long_t min_nr,
|
||||
compat_long_t nr,
|
||||
struct io_event __user *events,
|
||||
struct compat_timespec __user *timeout,
|
||||
const struct __compat_aio_sigset __user *usig);
|
||||
|
||||
/* fs/cookies.c */
|
||||
asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
|
||||
|
@ -1711,6 +1711,8 @@ struct file_operations {
|
||||
int (*iterate) (struct file *, struct dir_context *);
|
||||
int (*iterate_shared) (struct file *, struct dir_context *);
|
||||
__poll_t (*poll) (struct file *, struct poll_table_struct *);
|
||||
struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t);
|
||||
__poll_t (*poll_mask) (struct file *, __poll_t);
|
||||
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
int (*mmap) (struct file *, struct vm_area_struct *);
|
||||
|
@ -147,6 +147,7 @@ struct proto_ops {
|
||||
int (*getname) (struct socket *sock,
|
||||
struct sockaddr *addr,
|
||||
int peer);
|
||||
__poll_t (*poll_mask) (struct socket *sock, __poll_t events);
|
||||
__poll_t (*poll) (struct file *file, struct socket *sock,
|
||||
struct poll_table_struct *wait);
|
||||
int (*ioctl) (struct socket *sock, unsigned int cmd,
|
||||
|
@ -74,6 +74,18 @@ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc)
|
||||
pt->_key = ~(__poll_t)0; /* all events enabled */
|
||||
}
|
||||
|
||||
static inline bool file_has_poll_mask(struct file *file)
|
||||
{
|
||||
return file->f_op->get_poll_head && file->f_op->poll_mask;
|
||||
}
|
||||
|
||||
static inline bool file_can_poll(struct file *file)
|
||||
{
|
||||
return file->f_op->poll || file_has_poll_mask(file);
|
||||
}
|
||||
|
||||
__poll_t vfs_poll(struct file *file, struct poll_table_struct *pt);
|
||||
|
||||
struct poll_table_entry {
|
||||
struct file *filp;
|
||||
__poll_t key;
|
||||
@ -96,8 +108,6 @@ struct poll_wqueues {
|
||||
|
||||
extern void poll_initwait(struct poll_wqueues *pwq);
|
||||
extern void poll_freewait(struct poll_wqueues *pwq);
|
||||
extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
|
||||
ktime_t *expires, unsigned long slack);
|
||||
extern u64 select_estimate_accuracy(struct timespec64 *tv);
|
||||
|
||||
#define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1)
|
||||
|
@ -3250,8 +3250,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
|
||||
int *peeked, int *off, int *err);
|
||||
struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock,
|
||||
int *err);
|
||||
__poll_t datagram_poll(struct file *file, struct socket *sock,
|
||||
struct poll_table_struct *wait);
|
||||
__poll_t datagram_poll_mask(struct socket *sock, __poll_t events);
|
||||
int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
|
||||
struct iov_iter *to, int size);
|
||||
static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
|
||||
|
@ -290,6 +290,12 @@ asmlinkage long sys_io_getevents(aio_context_t ctx_id,
|
||||
long nr,
|
||||
struct io_event __user *events,
|
||||
struct timespec __user *timeout);
|
||||
asmlinkage long sys_io_pgetevents(aio_context_t ctx_id,
|
||||
long min_nr,
|
||||
long nr,
|
||||
struct io_event __user *events,
|
||||
struct timespec __user *timeout,
|
||||
const struct __aio_sigset *sig);
|
||||
|
||||
/* fs/xattr.c */
|
||||
asmlinkage long sys_setxattr(const char __user *path, const char __user *name,
|
||||
|
@ -271,7 +271,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
int flags);
|
||||
int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
size_t len, int flags);
|
||||
__poll_t bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
|
||||
__poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events);
|
||||
int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
||||
int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
|
||||
int bt_sock_wait_ready(struct sock *sk, unsigned long flags);
|
||||
|
@ -121,6 +121,21 @@ static inline void sk_busy_loop(struct sock *sk, int nonblock)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void sock_poll_busy_loop(struct socket *sock, __poll_t events)
|
||||
{
|
||||
if (sk_can_busy_loop(sock->sk) &&
|
||||
events && (events & POLL_BUSY_LOOP)) {
|
||||
/* once, only if requested by syscall */
|
||||
sk_busy_loop(sock->sk, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* if this socket can poll_ll, tell the system call */
|
||||
static inline __poll_t sock_poll_busy_flag(struct socket *sock)
|
||||
{
|
||||
return sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0;
|
||||
}
|
||||
|
||||
/* used in the NIC receive handler to mark the skb */
|
||||
static inline void skb_mark_napi_id(struct sk_buff *skb,
|
||||
struct napi_struct *napi)
|
||||
|
@ -153,8 +153,6 @@ struct iucv_sock_list {
|
||||
atomic_t autobind_name;
|
||||
};
|
||||
|
||||
__poll_t iucv_sock_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait);
|
||||
void iucv_sock_link(struct iucv_sock_list *l, struct sock *s);
|
||||
void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s);
|
||||
void iucv_accept_enqueue(struct sock *parent, struct sock *sk);
|
||||
|
@ -109,8 +109,7 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb);
|
||||
int sctp_inet_listen(struct socket *sock, int backlog);
|
||||
void sctp_write_space(struct sock *sk);
|
||||
void sctp_data_ready(struct sock *sk);
|
||||
__poll_t sctp_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait);
|
||||
__poll_t sctp_poll_mask(struct socket *sock, __poll_t events);
|
||||
void sctp_sock_rfree(struct sk_buff *skb);
|
||||
void sctp_copy_sock(struct sock *newsk, struct sock *sk,
|
||||
struct sctp_association *asoc);
|
||||
|
@ -1591,8 +1591,6 @@ int sock_no_connect(struct socket *, struct sockaddr *, int, int);
|
||||
int sock_no_socketpair(struct socket *, struct socket *);
|
||||
int sock_no_accept(struct socket *, struct socket *, int, bool);
|
||||
int sock_no_getname(struct socket *, struct sockaddr *, int);
|
||||
__poll_t sock_no_poll(struct file *, struct socket *,
|
||||
struct poll_table_struct *);
|
||||
int sock_no_ioctl(struct socket *, unsigned int, unsigned long);
|
||||
int sock_no_listen(struct socket *, int);
|
||||
int sock_no_shutdown(struct socket *, int);
|
||||
|
@ -388,8 +388,7 @@ bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst);
|
||||
void tcp_close(struct sock *sk, long timeout);
|
||||
void tcp_init_sock(struct sock *sk);
|
||||
void tcp_init_transfer(struct sock *sk, int bpf_op);
|
||||
__poll_t tcp_poll(struct file *file, struct socket *sock,
|
||||
struct poll_table_struct *wait);
|
||||
__poll_t tcp_poll_mask(struct socket *sock, __poll_t events);
|
||||
int tcp_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
int tcp_setsockopt(struct sock *sk, int level, int optname,
|
||||
|
@ -276,7 +276,7 @@ int udp_init_sock(struct sock *sk);
|
||||
int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
|
||||
int __udp_disconnect(struct sock *sk, int flags);
|
||||
int udp_disconnect(struct sock *sk, int flags);
|
||||
__poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait);
|
||||
__poll_t udp_poll_mask(struct socket *sock, __poll_t events);
|
||||
struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
|
||||
netdev_features_t features,
|
||||
bool is_ipv6);
|
||||
|
@ -732,9 +732,11 @@ __SYSCALL(__NR_pkey_alloc, sys_pkey_alloc)
|
||||
__SYSCALL(__NR_pkey_free, sys_pkey_free)
|
||||
#define __NR_statx 291
|
||||
__SYSCALL(__NR_statx, sys_statx)
|
||||
#define __NR_io_pgetevents 292
|
||||
__SC_COMP(__NR_io_pgetevents, sys_io_pgetevents, compat_sys_io_pgetevents)
|
||||
|
||||
#undef __NR_syscalls
|
||||
#define __NR_syscalls 292
|
||||
#define __NR_syscalls 293
|
||||
|
||||
/*
|
||||
* 32 bit systems traditionally used different
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/signal.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
typedef __kernel_ulong_t aio_context_t;
|
||||
@ -38,10 +39,8 @@ enum {
|
||||
IOCB_CMD_PWRITE = 1,
|
||||
IOCB_CMD_FSYNC = 2,
|
||||
IOCB_CMD_FDSYNC = 3,
|
||||
/* These two are experimental.
|
||||
* IOCB_CMD_PREADX = 4,
|
||||
* IOCB_CMD_POLL = 5,
|
||||
*/
|
||||
/* 4 was the experimental IOCB_CMD_PREADX */
|
||||
IOCB_CMD_POLL = 5,
|
||||
IOCB_CMD_NOOP = 6,
|
||||
IOCB_CMD_PREADV = 7,
|
||||
IOCB_CMD_PWRITEV = 8,
|
||||
@ -108,5 +107,10 @@ struct iocb {
|
||||
#undef IFBIG
|
||||
#undef IFLITTLE
|
||||
|
||||
struct __aio_sigset {
|
||||
sigset_t __user *sigmask;
|
||||
size_t sigsetsize;
|
||||
};
|
||||
|
||||
#endif /* __LINUX__AIO_ABI_H */
|
||||
|
||||
|
@ -49,11 +49,7 @@ typedef __u32 __bitwise __wsum;
|
||||
#define __aligned_be64 __be64 __attribute__((aligned(8)))
|
||||
#define __aligned_le64 __le64 __attribute__((aligned(8)))
|
||||
|
||||
#ifdef __CHECK_POLL
|
||||
typedef unsigned __bitwise __poll_t;
|
||||
#else
|
||||
typedef unsigned __poll_t;
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _UAPI_LINUX_TYPES_H */
|
||||
|
@ -43,7 +43,9 @@ COND_SYSCALL(io_submit);
|
||||
COND_SYSCALL_COMPAT(io_submit);
|
||||
COND_SYSCALL(io_cancel);
|
||||
COND_SYSCALL(io_getevents);
|
||||
COND_SYSCALL(io_pgetevents);
|
||||
COND_SYSCALL_COMPAT(io_getevents);
|
||||
COND_SYSCALL_COMPAT(io_pgetevents);
|
||||
|
||||
/* fs/xattr.c */
|
||||
|
||||
|
@ -3849,7 +3849,7 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
|
||||
if (ret)
|
||||
goto out_put_css;
|
||||
|
||||
efile.file->f_op->poll(efile.file, &event->pt);
|
||||
vfs_poll(efile.file, &event->pt);
|
||||
|
||||
spin_lock(&memcg->event_list_lock);
|
||||
list_add(&event->list, &memcg->event_list);
|
||||
|
@ -231,7 +231,7 @@ static void p9_conn_cancel(struct p9_conn *m, int err)
|
||||
static __poll_t
|
||||
p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt, int *err)
|
||||
{
|
||||
__poll_t ret, n;
|
||||
__poll_t ret;
|
||||
struct p9_trans_fd *ts = NULL;
|
||||
|
||||
if (client && client->status == Connected)
|
||||
@ -243,19 +243,9 @@ p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt, int *err)
|
||||
return EPOLLERR;
|
||||
}
|
||||
|
||||
if (!ts->rd->f_op->poll)
|
||||
ret = DEFAULT_POLLMASK;
|
||||
else
|
||||
ret = ts->rd->f_op->poll(ts->rd, pt);
|
||||
|
||||
if (ts->rd != ts->wr) {
|
||||
if (!ts->wr->f_op->poll)
|
||||
n = DEFAULT_POLLMASK;
|
||||
else
|
||||
n = ts->wr->f_op->poll(ts->wr, pt);
|
||||
ret = (ret & ~EPOLLOUT) | (n & ~EPOLLIN);
|
||||
}
|
||||
|
||||
ret = vfs_poll(ts->rd, pt);
|
||||
if (ts->rd != ts->wr)
|
||||
ret = (ret & ~EPOLLOUT) | (vfs_poll(ts->wr, pt) & ~EPOLLIN);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1869,7 +1869,7 @@ static const struct proto_ops atalk_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = atalk_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = atalk_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = atalk_compat_ioctl,
|
||||
|
@ -648,16 +648,11 @@ out:
|
||||
return error;
|
||||
}
|
||||
|
||||
__poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
__poll_t vcc_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct atm_vcc *vcc;
|
||||
__poll_t mask;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
|
||||
vcc = ATM_SD(sock);
|
||||
struct atm_vcc *vcc = ATM_SD(sock);
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* exceptional events */
|
||||
if (sk->sk_err)
|
||||
|
@ -17,7 +17,7 @@ int vcc_connect(struct socket *sock, int itf, short vpi, int vci);
|
||||
int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||
int flags);
|
||||
int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len);
|
||||
__poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait);
|
||||
__poll_t vcc_poll_mask(struct socket *sock, __poll_t events);
|
||||
int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
||||
int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
||||
int vcc_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
@ -113,7 +113,7 @@ static const struct proto_ops pvc_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = pvc_getname,
|
||||
.poll = vcc_poll,
|
||||
.poll_mask = vcc_poll_mask,
|
||||
.ioctl = vcc_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vcc_compat_ioctl,
|
||||
|
@ -636,7 +636,7 @@ static const struct proto_ops svc_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = svc_accept,
|
||||
.getname = svc_getname,
|
||||
.poll = vcc_poll,
|
||||
.poll_mask = vcc_poll_mask,
|
||||
.ioctl = svc_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = svc_compat_ioctl,
|
||||
|
@ -1941,7 +1941,7 @@ static const struct proto_ops ax25_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = ax25_accept,
|
||||
.getname = ax25_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = ax25_ioctl,
|
||||
.listen = ax25_listen,
|
||||
.shutdown = ax25_shutdown,
|
||||
|
@ -437,16 +437,13 @@ static inline __poll_t bt_accept_poll(struct sock *parent)
|
||||
return 0;
|
||||
}
|
||||
|
||||
__poll_t bt_sock_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
__poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
__poll_t mask = 0;
|
||||
|
||||
BT_DBG("sock %p, sk %p", sock, sk);
|
||||
|
||||
poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
if (sk->sk_state == BT_LISTEN)
|
||||
return bt_accept_poll(sk);
|
||||
|
||||
@ -478,7 +475,7 @@ __poll_t bt_sock_poll(struct file *file, struct socket *sock,
|
||||
|
||||
return mask;
|
||||
}
|
||||
EXPORT_SYMBOL(bt_sock_poll);
|
||||
EXPORT_SYMBOL(bt_sock_poll_mask);
|
||||
|
||||
int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -175,7 +175,6 @@ static const struct proto_ops bnep_sock_ops = {
|
||||
.getname = sock_no_getname,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.recvmsg = sock_no_recvmsg,
|
||||
.poll = sock_no_poll,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
|
@ -178,7 +178,6 @@ static const struct proto_ops cmtp_sock_ops = {
|
||||
.getname = sock_no_getname,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.recvmsg = sock_no_recvmsg,
|
||||
.poll = sock_no_poll,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
|
@ -1975,7 +1975,7 @@ static const struct proto_ops hci_sock_ops = {
|
||||
.sendmsg = hci_sock_sendmsg,
|
||||
.recvmsg = hci_sock_recvmsg,
|
||||
.ioctl = hci_sock_ioctl,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = hci_sock_setsockopt,
|
||||
|
@ -208,7 +208,6 @@ static const struct proto_ops hidp_sock_ops = {
|
||||
.getname = sock_no_getname,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.recvmsg = sock_no_recvmsg,
|
||||
.poll = sock_no_poll,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
|
@ -1653,7 +1653,7 @@ static const struct proto_ops l2cap_sock_ops = {
|
||||
.getname = l2cap_sock_getname,
|
||||
.sendmsg = l2cap_sock_sendmsg,
|
||||
.recvmsg = l2cap_sock_recvmsg,
|
||||
.poll = bt_sock_poll,
|
||||
.poll_mask = bt_sock_poll_mask,
|
||||
.ioctl = bt_sock_ioctl,
|
||||
.mmap = sock_no_mmap,
|
||||
.socketpair = sock_no_socketpair,
|
||||
|
@ -1049,7 +1049,7 @@ static const struct proto_ops rfcomm_sock_ops = {
|
||||
.setsockopt = rfcomm_sock_setsockopt,
|
||||
.getsockopt = rfcomm_sock_getsockopt,
|
||||
.ioctl = rfcomm_sock_ioctl,
|
||||
.poll = bt_sock_poll,
|
||||
.poll_mask = bt_sock_poll_mask,
|
||||
.socketpair = sock_no_socketpair,
|
||||
.mmap = sock_no_mmap
|
||||
};
|
||||
|
@ -1197,7 +1197,7 @@ static const struct proto_ops sco_sock_ops = {
|
||||
.getname = sco_sock_getname,
|
||||
.sendmsg = sco_sock_sendmsg,
|
||||
.recvmsg = sco_sock_recvmsg,
|
||||
.poll = bt_sock_poll,
|
||||
.poll_mask = bt_sock_poll_mask,
|
||||
.ioctl = bt_sock_ioctl,
|
||||
.mmap = sock_no_mmap,
|
||||
.socketpair = sock_no_socketpair,
|
||||
|
@ -934,15 +934,11 @@ static int caif_release(struct socket *sock)
|
||||
}
|
||||
|
||||
/* Copied from af_unix.c:unix_poll(), added CAIF tx_flow handling */
|
||||
static __poll_t caif_poll(struct file *file,
|
||||
struct socket *sock, poll_table *wait)
|
||||
static __poll_t caif_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
__poll_t mask;
|
||||
struct caifsock *cf_sk = container_of(sk, struct caifsock, sk);
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* exceptional events? */
|
||||
if (sk->sk_err)
|
||||
@ -976,7 +972,7 @@ static const struct proto_ops caif_seqpacket_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = caif_poll,
|
||||
.poll_mask = caif_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -997,7 +993,7 @@ static const struct proto_ops caif_stream_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = caif_poll,
|
||||
.poll_mask = caif_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -1657,7 +1657,7 @@ static const struct proto_ops bcm_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = can_ioctl, /* use can_ioctl() from af_can.c */
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -843,7 +843,7 @@ static const struct proto_ops raw_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = raw_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = can_ioctl, /* use can_ioctl() from af_can.c */
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -819,9 +819,8 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg);
|
||||
|
||||
/**
|
||||
* datagram_poll - generic datagram poll
|
||||
* @file: file struct
|
||||
* @sock: socket
|
||||
* @wait: poll table
|
||||
* @events to wait for
|
||||
*
|
||||
* Datagram poll: Again totally generic. This also handles
|
||||
* sequenced packet sockets providing the socket receive queue
|
||||
@ -831,14 +830,10 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg);
|
||||
* and you use a different write policy from sock_writeable()
|
||||
* then please supply your own write_space callback.
|
||||
*/
|
||||
__poll_t datagram_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
__poll_t datagram_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
__poll_t mask;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* exceptional events? */
|
||||
if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
|
||||
@ -871,4 +866,4 @@ __poll_t datagram_poll(struct file *file, struct socket *sock,
|
||||
|
||||
return mask;
|
||||
}
|
||||
EXPORT_SYMBOL(datagram_poll);
|
||||
EXPORT_SYMBOL(datagram_poll_mask);
|
||||
|
@ -2567,12 +2567,6 @@ int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
|
||||
}
|
||||
EXPORT_SYMBOL(sock_no_getname);
|
||||
|
||||
__poll_t sock_no_poll(struct file *file, struct socket *sock, poll_table *pt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sock_no_poll);
|
||||
|
||||
int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -316,8 +316,7 @@ int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
||||
int flags, int *addr_len);
|
||||
void dccp_shutdown(struct sock *sk, int how);
|
||||
int inet_dccp_listen(struct socket *sock, int backlog);
|
||||
__poll_t dccp_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait);
|
||||
__poll_t dccp_poll_mask(struct socket *sock, __poll_t events);
|
||||
int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
|
||||
void dccp_req_err(struct sock *sk, u64 seq);
|
||||
|
||||
|
@ -984,7 +984,7 @@ static const struct proto_ops inet_dccp_ops = {
|
||||
.accept = inet_accept,
|
||||
.getname = inet_getname,
|
||||
/* FIXME: work on tcp_poll to rename it to inet_csk_poll */
|
||||
.poll = dccp_poll,
|
||||
.poll_mask = dccp_poll_mask,
|
||||
.ioctl = inet_ioctl,
|
||||
/* FIXME: work on inet_listen to rename it to sock_common_listen */
|
||||
.listen = inet_dccp_listen,
|
||||
|
@ -1070,7 +1070,7 @@ static const struct proto_ops inet6_dccp_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = inet_accept,
|
||||
.getname = inet6_getname,
|
||||
.poll = dccp_poll,
|
||||
.poll_mask = dccp_poll_mask,
|
||||
.ioctl = inet6_ioctl,
|
||||
.listen = inet_dccp_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
|
@ -312,20 +312,11 @@ int dccp_disconnect(struct sock *sk, int flags)
|
||||
|
||||
EXPORT_SYMBOL_GPL(dccp_disconnect);
|
||||
|
||||
/*
|
||||
* Wait for a DCCP event.
|
||||
*
|
||||
* Note that we don't need to lock the socket, as the upper poll layers
|
||||
* take care of normal races (between the test and the event) and we don't
|
||||
* go look at any of the socket buffers directly.
|
||||
*/
|
||||
__poll_t dccp_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
__poll_t dccp_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
__poll_t mask;
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
if (sk->sk_state == DCCP_LISTEN)
|
||||
return inet_csk_listen_poll(sk);
|
||||
|
||||
@ -367,7 +358,7 @@ __poll_t dccp_poll(struct file *file, struct socket *sock,
|
||||
return mask;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(dccp_poll);
|
||||
EXPORT_SYMBOL_GPL(dccp_poll_mask);
|
||||
|
||||
int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -1207,11 +1207,11 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int peer)
|
||||
}
|
||||
|
||||
|
||||
static __poll_t dn_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
static __poll_t dn_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct dn_scp *scp = DN_SK(sk);
|
||||
__poll_t mask = datagram_poll(file, sock, wait);
|
||||
__poll_t mask = datagram_poll_mask(sock, events);
|
||||
|
||||
if (!skb_queue_empty(&scp->other_receive_queue))
|
||||
mask |= EPOLLRDBAND;
|
||||
@ -2331,7 +2331,7 @@ static const struct proto_ops dn_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = dn_accept,
|
||||
.getname = dn_getname,
|
||||
.poll = dn_poll,
|
||||
.poll_mask = dn_poll_mask,
|
||||
.ioctl = dn_ioctl,
|
||||
.listen = dn_listen,
|
||||
.shutdown = dn_shutdown,
|
||||
|
@ -423,7 +423,7 @@ static const struct proto_ops ieee802154_raw_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = ieee802154_sock_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -969,7 +969,7 @@ static const struct proto_ops ieee802154_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = ieee802154_sock_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -986,7 +986,7 @@ const struct proto_ops inet_stream_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = inet_accept,
|
||||
.getname = inet_getname,
|
||||
.poll = tcp_poll,
|
||||
.poll_mask = tcp_poll_mask,
|
||||
.ioctl = inet_ioctl,
|
||||
.listen = inet_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
@ -1018,7 +1018,7 @@ const struct proto_ops inet_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = inet_getname,
|
||||
.poll = udp_poll,
|
||||
.poll_mask = udp_poll_mask,
|
||||
.ioctl = inet_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
@ -1039,7 +1039,7 @@ EXPORT_SYMBOL(inet_dgram_ops);
|
||||
|
||||
/*
|
||||
* For SOCK_RAW sockets; should be the same as inet_dgram_ops but without
|
||||
* udp_poll
|
||||
* udp_poll_mask
|
||||
*/
|
||||
static const struct proto_ops inet_sockraw_ops = {
|
||||
.family = PF_INET,
|
||||
@ -1050,7 +1050,7 @@ static const struct proto_ops inet_sockraw_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = inet_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = inet_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
|
@ -494,32 +494,21 @@ static inline bool tcp_stream_is_readable(const struct tcp_sock *tp,
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait for a TCP event.
|
||||
*
|
||||
* Note that we don't need to lock the socket, as the upper poll layers
|
||||
* take care of normal races (between the test and the event) and we don't
|
||||
* go look at any of the socket buffers directly.
|
||||
* Socket is not locked. We are protected from async events by poll logic and
|
||||
* correct handling of state changes made by other threads is impossible in
|
||||
* any case.
|
||||
*/
|
||||
__poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
__poll_t tcp_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
__poll_t mask;
|
||||
struct sock *sk = sock->sk;
|
||||
const struct tcp_sock *tp = tcp_sk(sk);
|
||||
__poll_t mask = 0;
|
||||
int state;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
state = inet_sk_state_load(sk);
|
||||
if (state == TCP_LISTEN)
|
||||
return inet_csk_listen_poll(sk);
|
||||
|
||||
/* Socket is not locked. We are protected from async events
|
||||
* by poll logic and correct handling of state changes
|
||||
* made by other threads is impossible in any case.
|
||||
*/
|
||||
|
||||
mask = 0;
|
||||
|
||||
/*
|
||||
* EPOLLHUP is certainly not done right. But poll() doesn't
|
||||
* have a notion of HUP in just one direction, and for a
|
||||
@ -600,7 +589,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
|
||||
return mask;
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_poll);
|
||||
EXPORT_SYMBOL(tcp_poll_mask);
|
||||
|
||||
int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -2501,7 +2501,7 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname,
|
||||
* udp_poll - wait for a UDP event.
|
||||
* @file - file struct
|
||||
* @sock - socket
|
||||
* @wait - poll table
|
||||
* @events - events to wait for
|
||||
*
|
||||
* This is same as datagram poll, except for the special case of
|
||||
* blocking sockets. If application is using a blocking fd
|
||||
@ -2510,23 +2510,23 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname,
|
||||
* but then block when reading it. Add special case code
|
||||
* to work around these arguably broken applications.
|
||||
*/
|
||||
__poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
__poll_t udp_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
__poll_t mask = datagram_poll(file, sock, wait);
|
||||
__poll_t mask = datagram_poll_mask(sock, events);
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (!skb_queue_empty(&udp_sk(sk)->reader_queue))
|
||||
mask |= EPOLLIN | EPOLLRDNORM;
|
||||
|
||||
/* Check for false positives due to checksum errors */
|
||||
if ((mask & EPOLLRDNORM) && !(file->f_flags & O_NONBLOCK) &&
|
||||
if ((mask & EPOLLRDNORM) && !(sock->file->f_flags & O_NONBLOCK) &&
|
||||
!(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1)
|
||||
mask &= ~(EPOLLIN | EPOLLRDNORM);
|
||||
|
||||
return mask;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(udp_poll);
|
||||
EXPORT_SYMBOL(udp_poll_mask);
|
||||
|
||||
int udp_abort(struct sock *sk, int err)
|
||||
{
|
||||
|
@ -571,7 +571,7 @@ const struct proto_ops inet6_stream_ops = {
|
||||
.socketpair = sock_no_socketpair, /* a do nothing */
|
||||
.accept = inet_accept, /* ok */
|
||||
.getname = inet6_getname,
|
||||
.poll = tcp_poll, /* ok */
|
||||
.poll_mask = tcp_poll_mask, /* ok */
|
||||
.ioctl = inet6_ioctl, /* must change */
|
||||
.listen = inet_listen, /* ok */
|
||||
.shutdown = inet_shutdown, /* ok */
|
||||
@ -601,7 +601,7 @@ const struct proto_ops inet6_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair, /* a do nothing */
|
||||
.accept = sock_no_accept, /* a do nothing */
|
||||
.getname = inet6_getname,
|
||||
.poll = udp_poll, /* ok */
|
||||
.poll_mask = udp_poll_mask, /* ok */
|
||||
.ioctl = inet6_ioctl, /* must change */
|
||||
.listen = sock_no_listen, /* ok */
|
||||
.shutdown = inet_shutdown, /* ok */
|
||||
|
@ -1334,7 +1334,7 @@ void raw6_proc_exit(void)
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
/* Same as inet6_dgram_ops, sans udp_poll. */
|
||||
/* Same as inet6_dgram_ops, sans udp_poll_mask. */
|
||||
const struct proto_ops inet6_sockraw_ops = {
|
||||
.family = PF_INET6,
|
||||
.owner = THIS_MODULE,
|
||||
@ -1344,7 +1344,7 @@ const struct proto_ops inet6_sockraw_ops = {
|
||||
.socketpair = sock_no_socketpair, /* a do nothing */
|
||||
.accept = sock_no_accept, /* a do nothing */
|
||||
.getname = inet6_getname,
|
||||
.poll = datagram_poll, /* ok */
|
||||
.poll_mask = datagram_poll_mask, /* ok */
|
||||
.ioctl = inet6_ioctl, /* must change */
|
||||
.listen = sock_no_listen, /* ok */
|
||||
.shutdown = inet_shutdown, /* ok */
|
||||
|
@ -1488,14 +1488,11 @@ static inline __poll_t iucv_accept_poll(struct sock *parent)
|
||||
return 0;
|
||||
}
|
||||
|
||||
__poll_t iucv_sock_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t iucv_sock_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
__poll_t mask = 0;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
if (sk->sk_state == IUCV_LISTEN)
|
||||
return iucv_accept_poll(sk);
|
||||
|
||||
@ -2388,7 +2385,7 @@ static const struct proto_ops iucv_sock_ops = {
|
||||
.getname = iucv_sock_getname,
|
||||
.sendmsg = iucv_sock_sendmsg,
|
||||
.recvmsg = iucv_sock_recvmsg,
|
||||
.poll = iucv_sock_poll,
|
||||
.poll_mask = iucv_sock_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.mmap = sock_no_mmap,
|
||||
.socketpair = sock_no_socketpair,
|
||||
|
@ -1336,9 +1336,9 @@ static void init_kcm_sock(struct kcm_sock *kcm, struct kcm_mux *mux)
|
||||
struct list_head *head;
|
||||
int index = 0;
|
||||
|
||||
/* For SOCK_SEQPACKET sock type, datagram_poll checks the sk_state, so
|
||||
* we set sk_state, otherwise epoll_wait always returns right away with
|
||||
* EPOLLHUP
|
||||
/* For SOCK_SEQPACKET sock type, datagram_poll_mask checks the sk_state,
|
||||
* so we set sk_state, otherwise epoll_wait always returns right away
|
||||
* with EPOLLHUP
|
||||
*/
|
||||
kcm->sk.sk_state = TCP_ESTABLISHED;
|
||||
|
||||
@ -1903,7 +1903,7 @@ static const struct proto_ops kcm_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = kcm_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -1924,7 +1924,7 @@ static const struct proto_ops kcm_seqpacket_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = kcm_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -3751,7 +3751,7 @@ static const struct proto_ops pfkey_ops = {
|
||||
|
||||
/* Now the operations that really occur. */
|
||||
.release = pfkey_release,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.sendmsg = pfkey_sendmsg,
|
||||
.recvmsg = pfkey_recvmsg,
|
||||
};
|
||||
|
@ -613,7 +613,7 @@ static const struct proto_ops l2tp_ip_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = l2tp_ip_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = inet_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
|
@ -754,7 +754,7 @@ static const struct proto_ops l2tp_ip6_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = l2tp_ip6_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = inet6_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
|
@ -1788,7 +1788,7 @@ static const struct proto_ops pppol2tp_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = pppol2tp_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = pppol2tp_setsockopt,
|
||||
|
@ -1192,7 +1192,7 @@ static const struct proto_ops llc_ui_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = llc_ui_accept,
|
||||
.getname = llc_ui_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = llc_ui_ioctl,
|
||||
.listen = llc_ui_listen,
|
||||
.shutdown = llc_ui_shutdown,
|
||||
|
@ -2658,7 +2658,7 @@ static const struct proto_ops netlink_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = netlink_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = netlink_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -1355,7 +1355,7 @@ static const struct proto_ops nr_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = nr_accept,
|
||||
.getname = nr_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = nr_ioctl,
|
||||
.listen = nr_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -548,16 +548,13 @@ static inline __poll_t llcp_accept_poll(struct sock *parent)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __poll_t llcp_sock_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t llcp_sock_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
__poll_t mask = 0;
|
||||
|
||||
pr_debug("%p\n", sk);
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
if (sk->sk_state == LLCP_LISTEN)
|
||||
return llcp_accept_poll(sk);
|
||||
|
||||
@ -899,7 +896,7 @@ static const struct proto_ops llcp_sock_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = llcp_sock_accept,
|
||||
.getname = llcp_sock_getname,
|
||||
.poll = llcp_sock_poll,
|
||||
.poll_mask = llcp_sock_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = llcp_sock_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -919,7 +916,7 @@ static const struct proto_ops llcp_rawsock_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = llcp_sock_getname,
|
||||
.poll = llcp_sock_poll,
|
||||
.poll_mask = llcp_sock_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -284,7 +284,7 @@ static const struct proto_ops rawsock_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -304,7 +304,7 @@ static const struct proto_ops rawsock_raw_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -4110,12 +4110,11 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __poll_t packet_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t packet_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct packet_sock *po = pkt_sk(sk);
|
||||
__poll_t mask = datagram_poll(file, sock, wait);
|
||||
__poll_t mask = datagram_poll_mask(sock, events);
|
||||
|
||||
spin_lock_bh(&sk->sk_receive_queue.lock);
|
||||
if (po->rx_ring.pg_vec) {
|
||||
@ -4457,7 +4456,7 @@ static const struct proto_ops packet_ops_spkt = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = packet_getname_spkt,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = packet_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -4478,7 +4477,7 @@ static const struct proto_ops packet_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = packet_getname,
|
||||
.poll = packet_poll,
|
||||
.poll_mask = packet_poll_mask,
|
||||
.ioctl = packet_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -340,15 +340,12 @@ static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
|
||||
return sizeof(struct sockaddr_pn);
|
||||
}
|
||||
|
||||
static __poll_t pn_socket_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t pn_socket_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct pep_sock *pn = pep_sk(sk);
|
||||
__poll_t mask = 0;
|
||||
|
||||
poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
if (sk->sk_state == TCP_CLOSE)
|
||||
return EPOLLERR;
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
@ -448,7 +445,7 @@ const struct proto_ops phonet_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = pn_socket_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = pn_socket_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
@ -473,7 +470,7 @@ const struct proto_ops phonet_stream_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = pn_socket_accept,
|
||||
.getname = pn_socket_getname,
|
||||
.poll = pn_socket_poll,
|
||||
.poll_mask = pn_socket_poll_mask,
|
||||
.ioctl = pn_socket_ioctl,
|
||||
.listen = pn_socket_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -1023,7 +1023,7 @@ static const struct proto_ops qrtr_proto_ops = {
|
||||
.recvmsg = qrtr_recvmsg,
|
||||
.getname = qrtr_getname,
|
||||
.ioctl = qrtr_ioctl,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
.getsockopt = sock_no_getsockopt,
|
||||
|
@ -1470,7 +1470,7 @@ static const struct proto_ops rose_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = rose_accept,
|
||||
.getname = rose_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = rose_ioctl,
|
||||
.listen = rose_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
|
@ -734,15 +734,11 @@ static int rxrpc_getsockopt(struct socket *sock, int level, int optname,
|
||||
/*
|
||||
* permit an RxRPC socket to be polled
|
||||
*/
|
||||
static __poll_t rxrpc_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t rxrpc_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct rxrpc_sock *rx = rxrpc_sk(sk);
|
||||
__poll_t mask;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* the socket is readable if there are any messages waiting on the Rx
|
||||
* queue */
|
||||
@ -949,7 +945,7 @@ static const struct proto_ops rxrpc_rpc_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = sock_no_getname,
|
||||
.poll = rxrpc_poll,
|
||||
.poll_mask = rxrpc_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = rxrpc_listen,
|
||||
.shutdown = rxrpc_shutdown,
|
||||
|
@ -1010,7 +1010,7 @@ static const struct proto_ops inet6_seqpacket_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = inet_accept,
|
||||
.getname = sctp_getname,
|
||||
.poll = sctp_poll,
|
||||
.poll_mask = sctp_poll_mask,
|
||||
.ioctl = inet6_ioctl,
|
||||
.listen = sctp_inet_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
|
@ -1016,7 +1016,7 @@ static const struct proto_ops inet_seqpacket_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = inet_accept,
|
||||
.getname = inet_getname, /* Semantics are different. */
|
||||
.poll = sctp_poll,
|
||||
.poll_mask = sctp_poll_mask,
|
||||
.ioctl = inet_ioctl,
|
||||
.listen = sctp_inet_listen,
|
||||
.shutdown = inet_shutdown, /* Looks harmless. */
|
||||
|
@ -7722,14 +7722,12 @@ out:
|
||||
* here, again, by modeling the current TCP/UDP code. We don't have
|
||||
* a good way to test with it yet.
|
||||
*/
|
||||
__poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
__poll_t sctp_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct sctp_sock *sp = sctp_sk(sk);
|
||||
__poll_t mask;
|
||||
|
||||
poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
/* A TCP-style listening socket becomes readable when the accept queue
|
||||
|
59
net/socket.c
59
net/socket.c
@ -117,8 +117,10 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from);
|
||||
static int sock_mmap(struct file *file, struct vm_area_struct *vma);
|
||||
|
||||
static int sock_close(struct inode *inode, struct file *file);
|
||||
static __poll_t sock_poll(struct file *file,
|
||||
struct poll_table_struct *wait);
|
||||
static struct wait_queue_head *sock_get_poll_head(struct file *file,
|
||||
__poll_t events);
|
||||
static __poll_t sock_poll_mask(struct file *file, __poll_t);
|
||||
static __poll_t sock_poll(struct file *file, struct poll_table_struct *wait);
|
||||
static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long compat_sock_ioctl(struct file *file,
|
||||
@ -141,6 +143,8 @@ static const struct file_operations socket_file_ops = {
|
||||
.llseek = no_llseek,
|
||||
.read_iter = sock_read_iter,
|
||||
.write_iter = sock_write_iter,
|
||||
.get_poll_head = sock_get_poll_head,
|
||||
.poll_mask = sock_poll_mask,
|
||||
.poll = sock_poll,
|
||||
.unlocked_ioctl = sock_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
@ -1114,27 +1118,48 @@ out_release:
|
||||
}
|
||||
EXPORT_SYMBOL(sock_create_lite);
|
||||
|
||||
static struct wait_queue_head *sock_get_poll_head(struct file *file,
|
||||
__poll_t events)
|
||||
{
|
||||
struct socket *sock = file->private_data;
|
||||
|
||||
if (!sock->ops->poll_mask)
|
||||
return NULL;
|
||||
sock_poll_busy_loop(sock, events);
|
||||
return sk_sleep(sock->sk);
|
||||
}
|
||||
|
||||
static __poll_t sock_poll_mask(struct file *file, __poll_t events)
|
||||
{
|
||||
struct socket *sock = file->private_data;
|
||||
|
||||
/*
|
||||
* We need to be sure we are in sync with the socket flags modification.
|
||||
*
|
||||
* This memory barrier is paired in the wq_has_sleeper.
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
/* this socket can poll_ll so tell the system call */
|
||||
return sock->ops->poll_mask(sock, events) |
|
||||
(sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0);
|
||||
}
|
||||
|
||||
/* No kernel lock held - perfect */
|
||||
static __poll_t sock_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
__poll_t busy_flag = 0;
|
||||
struct socket *sock;
|
||||
struct socket *sock = file->private_data;
|
||||
__poll_t events = poll_requested_events(wait), mask = 0;
|
||||
|
||||
/*
|
||||
* We can't return errors to poll, so it's either yes or no.
|
||||
*/
|
||||
sock = file->private_data;
|
||||
|
||||
if (sk_can_busy_loop(sock->sk)) {
|
||||
/* this socket can poll_ll so tell the system call */
|
||||
busy_flag = POLL_BUSY_LOOP;
|
||||
|
||||
/* once, only if requested by syscall */
|
||||
if (wait && (wait->_key & POLL_BUSY_LOOP))
|
||||
sk_busy_loop(sock->sk, 1);
|
||||
if (sock->ops->poll) {
|
||||
sock_poll_busy_loop(sock, events);
|
||||
mask = sock->ops->poll(file, sock, wait);
|
||||
} else if (sock->ops->poll_mask) {
|
||||
sock_poll_wait(file, sock_get_poll_head(file, events), wait);
|
||||
mask = sock->ops->poll_mask(sock, events);
|
||||
}
|
||||
|
||||
return busy_flag | sock->ops->poll(file, sock, wait);
|
||||
return mask | sock_poll_busy_flag(sock);
|
||||
}
|
||||
|
||||
static int sock_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
|
@ -692,10 +692,9 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||
}
|
||||
|
||||
/**
|
||||
* tipc_poll - read and possibly block on pollmask
|
||||
* tipc_poll - read pollmask
|
||||
* @file: file structure associated with the socket
|
||||
* @sock: socket for which to calculate the poll bits
|
||||
* @wait: ???
|
||||
*
|
||||
* Returns pollmask value
|
||||
*
|
||||
@ -709,15 +708,12 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||
* imply that the operation will succeed, merely that it should be performed
|
||||
* and will not block.
|
||||
*/
|
||||
static __poll_t tipc_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t tipc_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct tipc_sock *tsk = tipc_sk(sk);
|
||||
__poll_t revents = 0;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
|
||||
if (sk->sk_shutdown & RCV_SHUTDOWN)
|
||||
revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
|
||||
if (sk->sk_shutdown == SHUTDOWN_MASK)
|
||||
@ -3028,7 +3024,7 @@ static const struct proto_ops msg_ops = {
|
||||
.socketpair = tipc_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = tipc_getname,
|
||||
.poll = tipc_poll,
|
||||
.poll_mask = tipc_poll_mask,
|
||||
.ioctl = tipc_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = tipc_shutdown,
|
||||
@ -3049,7 +3045,7 @@ static const struct proto_ops packet_ops = {
|
||||
.socketpair = tipc_socketpair,
|
||||
.accept = tipc_accept,
|
||||
.getname = tipc_getname,
|
||||
.poll = tipc_poll,
|
||||
.poll_mask = tipc_poll_mask,
|
||||
.ioctl = tipc_ioctl,
|
||||
.listen = tipc_listen,
|
||||
.shutdown = tipc_shutdown,
|
||||
@ -3070,7 +3066,7 @@ static const struct proto_ops stream_ops = {
|
||||
.socketpair = tipc_socketpair,
|
||||
.accept = tipc_accept,
|
||||
.getname = tipc_getname,
|
||||
.poll = tipc_poll,
|
||||
.poll_mask = tipc_poll_mask,
|
||||
.ioctl = tipc_ioctl,
|
||||
.listen = tipc_listen,
|
||||
.shutdown = tipc_shutdown,
|
||||
|
@ -638,9 +638,8 @@ static int unix_stream_connect(struct socket *, struct sockaddr *,
|
||||
static int unix_socketpair(struct socket *, struct socket *);
|
||||
static int unix_accept(struct socket *, struct socket *, int, bool);
|
||||
static int unix_getname(struct socket *, struct sockaddr *, int);
|
||||
static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
|
||||
static __poll_t unix_dgram_poll(struct file *, struct socket *,
|
||||
poll_table *);
|
||||
static __poll_t unix_poll_mask(struct socket *, __poll_t);
|
||||
static __poll_t unix_dgram_poll_mask(struct socket *, __poll_t);
|
||||
static int unix_ioctl(struct socket *, unsigned int, unsigned long);
|
||||
static int unix_shutdown(struct socket *, int);
|
||||
static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
|
||||
@ -681,7 +680,7 @@ static const struct proto_ops unix_stream_ops = {
|
||||
.socketpair = unix_socketpair,
|
||||
.accept = unix_accept,
|
||||
.getname = unix_getname,
|
||||
.poll = unix_poll,
|
||||
.poll_mask = unix_poll_mask,
|
||||
.ioctl = unix_ioctl,
|
||||
.listen = unix_listen,
|
||||
.shutdown = unix_shutdown,
|
||||
@ -704,7 +703,7 @@ static const struct proto_ops unix_dgram_ops = {
|
||||
.socketpair = unix_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = unix_getname,
|
||||
.poll = unix_dgram_poll,
|
||||
.poll_mask = unix_dgram_poll_mask,
|
||||
.ioctl = unix_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = unix_shutdown,
|
||||
@ -726,7 +725,7 @@ static const struct proto_ops unix_seqpacket_ops = {
|
||||
.socketpair = unix_socketpair,
|
||||
.accept = unix_accept,
|
||||
.getname = unix_getname,
|
||||
.poll = unix_dgram_poll,
|
||||
.poll_mask = unix_dgram_poll_mask,
|
||||
.ioctl = unix_ioctl,
|
||||
.listen = unix_listen,
|
||||
.shutdown = unix_shutdown,
|
||||
@ -2630,13 +2629,10 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
return err;
|
||||
}
|
||||
|
||||
static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
static __poll_t unix_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
__poll_t mask;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* exceptional events? */
|
||||
if (sk->sk_err)
|
||||
@ -2665,15 +2661,11 @@ static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wa
|
||||
return mask;
|
||||
}
|
||||
|
||||
static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk = sock->sk, *other;
|
||||
unsigned int writable;
|
||||
__poll_t mask;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
int writable;
|
||||
__poll_t mask = 0;
|
||||
|
||||
/* exceptional events? */
|
||||
if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
|
||||
@ -2699,7 +2691,7 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
|
||||
}
|
||||
|
||||
/* No write status requested, avoid expensive OUT tests. */
|
||||
if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT)))
|
||||
if (!(events & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT)))
|
||||
return mask;
|
||||
|
||||
writable = unix_writable(sk);
|
||||
|
@ -850,18 +850,11 @@ static int vsock_shutdown(struct socket *sock, int mode)
|
||||
return err;
|
||||
}
|
||||
|
||||
static __poll_t vsock_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
static __poll_t vsock_poll_mask(struct socket *sock, __poll_t events)
|
||||
{
|
||||
struct sock *sk;
|
||||
__poll_t mask;
|
||||
struct vsock_sock *vsk;
|
||||
|
||||
sk = sock->sk;
|
||||
vsk = vsock_sk(sk);
|
||||
|
||||
poll_wait(file, sk_sleep(sk), wait);
|
||||
mask = 0;
|
||||
struct sock *sk = sock->sk;
|
||||
struct vsock_sock *vsk = vsock_sk(sk);
|
||||
__poll_t mask = 0;
|
||||
|
||||
if (sk->sk_err)
|
||||
/* Signify that there has been an error on this socket. */
|
||||
@ -1091,7 +1084,7 @@ static const struct proto_ops vsock_dgram_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = sock_no_accept,
|
||||
.getname = vsock_getname,
|
||||
.poll = vsock_poll,
|
||||
.poll_mask = vsock_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = vsock_shutdown,
|
||||
@ -1849,7 +1842,7 @@ static const struct proto_ops vsock_stream_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = vsock_accept,
|
||||
.getname = vsock_getname,
|
||||
.poll = vsock_poll,
|
||||
.poll_mask = vsock_poll_mask,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = vsock_listen,
|
||||
.shutdown = vsock_shutdown,
|
||||
|
@ -1750,7 +1750,7 @@ static const struct proto_ops x25_proto_ops = {
|
||||
.socketpair = sock_no_socketpair,
|
||||
.accept = x25_accept,
|
||||
.getname = x25_getname,
|
||||
.poll = datagram_poll,
|
||||
.poll_mask = datagram_poll_mask,
|
||||
.ioctl = x25_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = compat_x25_ioctl,
|
||||
|
@ -397,7 +397,7 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
|
||||
* Check if there was an event already pending on the eventfd
|
||||
* before we registered, and trigger it as if we didn't miss it.
|
||||
*/
|
||||
events = f.file->f_op->poll(f.file, &irqfd->pt);
|
||||
events = vfs_poll(f.file, &irqfd->pt);
|
||||
|
||||
if (events & EPOLLIN)
|
||||
schedule_work(&irqfd->inject);
|
||||
|
Loading…
Reference in New Issue
Block a user