Linux-Fsdevel Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: viro@zeniv.linux.org.uk
Cc: Avi Kivity <avi@scylladb.com>,
linux-aio@kvack.org, linux-fsdevel@vger.kernel.org,
netdev@vger.kernel.org, linux-api@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH 02/32] fs: add new vfs_poll and file_can_poll helpers
Date: Wed, 10 Jan 2018 16:58:23 +0100 [thread overview]
Message-ID: <20180110155853.32348-3-hch@lst.de> (raw)
In-Reply-To: <20180110155853.32348-1-hch@lst.de>
These abstract out calls to the poll method in preparation for changes to
those methods.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/staging/comedi/drivers/serial2002.c | 4 ++--
drivers/vfio/virqfd.c | 2 +-
drivers/vhost/vhost.c | 2 +-
fs/eventpoll.c | 5 ++---
fs/select.c | 25 +++++++++----------------
include/linux/poll.h | 12 ++++++++++++
mm/memcontrol.c | 2 +-
net/9p/trans_fd.c | 18 ++++--------------
virt/kvm/eventfd.c | 2 +-
9 files changed, 33 insertions(+), 39 deletions(-)
diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c
index a557be8a5076..5e2a2dc372e0 100644
--- a/drivers/staging/comedi/drivers/serial2002.c
+++ b/drivers/staging/comedi/drivers/serial2002.c
@@ -121,7 +121,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 & (POLLRDNORM | POLLRDBAND | POLLIN |
POLLHUP | POLLERR)) {
break;
@@ -144,7 +144,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)
diff --git a/drivers/vfio/virqfd.c b/drivers/vfio/virqfd.c
index 8cc4b48ff127..ef539a07a08c 100644
--- a/drivers/vfio/virqfd.c
+++ b/drivers/vfio/virqfd.c
@@ -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
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 3bbeabff505a..b6311dc74d71 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -209,7 +209,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 & POLLERR) {
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 42e35a6977c9..7d65f628810e 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -882,8 +882,7 @@ static unsigned int 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);
@@ -2015,7 +2014,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 */
diff --git a/fs/select.c b/fs/select.c
index ec14171dd78a..50df63c16bfe 100644
--- a/fs/select.c
+++ b/fs/select.c
@@ -503,14 +503,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;
@@ -819,14 +815,11 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
/* userland u16 ->events contains POLL... bitmap */
__poll_t filter = demangle_poll(pollfd->events) |
POLLERR | POLLHUP;
- 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;
- }
+ pwait->_key = filter | busy_flag;
+ mask = vfs_poll(f.file, pwait);
+ if (mask & busy_flag)
+ *can_busy_poll = true;
+
/* Mask out unneeded events. */
mask &= filter;
fdput(f);
diff --git a/include/linux/poll.h b/include/linux/poll.h
index 04781a753326..6eb3343c2ee1 100644
--- a/include/linux/poll.h
+++ b/include/linux/poll.h
@@ -73,6 +73,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_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;
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 9011997d8a5c..284e69f345f8 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3928,7 +3928,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);
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index d6f7f7cb79c4..74df034726f8 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c
@@ -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 POLLERR;
}
- 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 & ~POLLOUT) | (n & ~POLLIN);
- }
-
+ ret = vfs_poll(ts->rd, pt);
+ if (ts->rd != ts->wr)
+ ret = (vfs_poll(ts->wr, pt) & ~POLLIN) | (ret & ~POLLOUT);
return ret;
}
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
index a334399fafec..df8a23cbf457 100644
--- a/virt/kvm/eventfd.c
+++ b/virt/kvm/eventfd.c
@@ -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 & POLLIN)
schedule_work(&irqfd->inject);
--
2.14.2
next prev parent reply other threads:[~2018-01-10 15:58 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-10 15:58 aio poll, io_pgetevents and a new in-kernel poll API V2 Christoph Hellwig
2018-01-10 15:58 ` [PATCH 01/32] fs: update documentation for __poll_t Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig [this message]
2018-01-10 15:58 ` [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods Christoph Hellwig
2018-01-10 21:04 ` Al Viro
2018-01-11 5:22 ` Al Viro
2018-01-11 8:28 ` Christoph Hellwig
2018-01-11 11:32 ` Christoph Hellwig
2018-01-11 11:36 ` Christoph Hellwig
2018-01-11 17:47 ` Al Viro
2018-01-12 9:06 ` Christoph Hellwig
2018-01-17 16:05 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 04/32] net: refactor socket_poll Christoph Hellwig
2018-01-10 15:58 ` [PATCH 05/32] net: add support for ->poll_mask in proto_ops Christoph Hellwig
2018-01-10 15:58 ` [PATCH 06/32] net: remove sock_no_poll Christoph Hellwig
2018-01-10 15:58 ` [PATCH 07/32] net/tcp: convert to ->poll_mask Christoph Hellwig
2018-01-10 15:58 ` [PATCH 08/32] net/unix: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 09/32] net: convert datagram_poll users tp ->poll_mask Christoph Hellwig
2018-01-10 15:58 ` [PATCH 10/32] net/dccp: convert to ->poll_mask Christoph Hellwig
2018-01-10 15:58 ` [PATCH 11/32] net/atm: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 12/32] net/vmw_vsock: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 13/32] net/tipc: " Christoph Hellwig
2018-01-10 19:32 ` Jon Maloy
2018-01-10 15:58 ` [PATCH 14/32] net/sctp: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 15/32] net/bluetooth: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 16/32] net/caif: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 17/32] net/nfc: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 18/32] net/phonet: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 19/32] net/iucv: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 20/32] net/rxrpc: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 21/32] pipe: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 22/32] eventfd: switch " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 23/32] timerfd: convert " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 24/32] aio: don't print the page size at boot time Christoph Hellwig
2018-01-10 15:58 ` [PATCH 25/32] aio: remove an outdated comment in aio_complete Christoph Hellwig
2018-01-10 15:58 ` [PATCH 26/32] aio: refactor read/write iocb setup Christoph Hellwig
2018-01-10 21:19 ` Jeff Moyer
2018-01-11 13:38 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 27/32] aio: sanitize ki_list handling Christoph Hellwig
2018-01-10 21:29 ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 28/32] aio: simplify cancellation Christoph Hellwig
2018-01-10 22:50 ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 29/32] aio: delete iocbs from the active_reqs list in kiocb_cancel Christoph Hellwig
2018-01-10 22:52 ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 30/32] aio: add delayed cancel support Christoph Hellwig
2018-01-10 22:59 ` Jeff Moyer
2018-01-10 23:26 ` Jeff Moyer
2018-01-11 13:43 ` Christoph Hellwig
2018-01-11 15:27 ` Jeff Moyer
2018-01-15 8:54 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 31/32] aio: implement IOCB_CMD_POLL Christoph Hellwig
2018-01-10 15:58 ` [PATCH 32/32] aio: implement io_pgetevents Christoph Hellwig
2018-01-12 20:44 ` Jeff Moyer
2018-01-15 8:53 ` Christoph Hellwig
2018-01-16 12:04 ` Christoph Hellwig
2018-01-17 0:41 ` Jeff Moyer
2018-01-17 4:27 ` Al Viro
2018-01-17 7:08 ` Christoph Hellwig
2018-01-17 13:49 ` Jeff Moyer
2018-01-17 7:36 ` Christoph Hellwig
2018-01-17 13:51 ` Jeff Moyer
2018-01-10 22:36 ` aio poll, io_pgetevents and a new in-kernel poll API V2 Michael Kerrisk (man-pages)
2018-01-10 23:34 ` Jeff Moyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180110155853.32348-3-hch@lst.de \
--to=hch@lst.de \
--cc=avi@scylladb.com \
--cc=linux-aio@kvack.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
--subject='Re: [PATCH 02/32] fs: add new vfs_poll and file_can_poll helpers' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).