All of 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 04/32] fs: add new vfs_poll and file_can_poll helpers
Date: Fri, 11 May 2018 13:07:35 +0200	[thread overview]
Message-ID: <20180511110803.10910-5-hch@lst.de> (raw)
In-Reply-To: <20180511110803.10910-1-hch@lst.de>

These abstract out calls to the poll method in preparation for changes
in how we poll.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 drivers/staging/comedi/drivers/serial2002.c |  4 ++--
 drivers/vfio/virqfd.c                       |  2 +-
 drivers/vhost/vhost.c                       |  2 +-
 fs/eventpoll.c                              |  5 ++---
 fs/select.c                                 | 23 +++++++--------------
 include/linux/poll.h                        | 12 +++++++++++
 mm/memcontrol.c                             |  2 +-
 net/9p/trans_fd.c                           | 18 ++++------------
 virt/kvm/eventfd.c                          |  2 +-
 9 files changed, 32 insertions(+), 38 deletions(-)

diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c
index b3f3b4a201af..5471b2212a62 100644
--- a/drivers/staging/comedi/drivers/serial2002.c
+++ b/drivers/staging/comedi/drivers/serial2002.c
@@ -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)
diff --git a/drivers/vfio/virqfd.c b/drivers/vfio/virqfd.c
index 085700f1be10..2a1be859ee71 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 f3bd8e941224..f6022881f147 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -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) {
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 602ca4285b2e..67db22fe99c5 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -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 */
diff --git a/fs/select.c b/fs/select.c
index 25da26253485..e30def680b2e 100644
--- a/fs/select.c
+++ b/fs/select.c
@@ -502,14 +502,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;
@@ -825,13 +821,10 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
 
 	/* userland u16 ->events contains POLL... bitmap */
 	filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
-	mask = DEFAULT_POLLMASK;
-	if (f.file->f_op->poll) {
-		pwait->_key = filter | 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 &= filter;		/* Mask out unneeded events. */
 	fdput(f);
 
diff --git a/include/linux/poll.h b/include/linux/poll.h
index a3576da63377..7e0fdcf905d2 100644
--- a/include/linux/poll.h
+++ b/include/linux/poll.h
@@ -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_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 2bd3df3d101a..1695f38630f1 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.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);
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index 0cfba919d167..3811775692d0 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 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;
 }
 
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
index 6e865e8b5b10..90d30fbe95ae 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 & EPOLLIN)
 		schedule_work(&irqfd->inject);
-- 
2.17.0


  parent reply	other threads:[~2018-05-11 11:08 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-11 11:07 aio poll and a new in-kernel poll API V10 Christoph Hellwig
2018-05-11 11:07 ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 01/32] fs: unexport poll_schedule_timeout Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 02/32] fs: cleanup do_pollfd Christoph Hellwig
2018-05-11 11:07 ` [PATCH 03/32] fs: update documentation to mention __poll_t and match the code Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` Christoph Hellwig [this message]
2018-05-11 11:07 ` [PATCH 05/32] fs: introduce new ->get_poll_head and ->poll_mask methods Christoph Hellwig
2018-05-11 11:07 ` [PATCH 06/32] aio: simplify KIOCB_KEY handling Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 07/32] aio: simplify cancellation Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 08/32] aio: replace kiocb_set_cancel_fn with a cancel_kiocb file operation Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 09/32] aio: add delayed cancel support Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 10/32] aio: implement IOCB_CMD_POLL Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 11/32] net: refactor socket_poll Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 12/32] net: add support for ->poll_mask in proto_ops Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 13/32] net: remove sock_no_poll Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 14/32] net/tcp: convert to ->poll_mask Christoph Hellwig
2018-05-11 13:13   ` Eric Dumazet
2018-05-11 13:13     ` Eric Dumazet
2018-05-12 10:09     ` Christoph Hellwig
2018-05-12 10:09       ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 15/32] net/unix: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 16/32] net: convert datagram_poll users tp ->poll_mask Christoph Hellwig
2018-05-11 11:07 ` [PATCH 17/32] net/dccp: convert to ->poll_mask Christoph Hellwig
2018-05-11 11:07 ` [PATCH 18/32] net/atm: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 19/32] net/vmw_vsock: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 20/32] net/tipc: " Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 21/32] net/sctp: " Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 22/32] net/bluetooth: " Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 23/32] net/caif: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 24/32] net/nfc: " Christoph Hellwig
2018-05-11 11:07   ` Christoph Hellwig
2018-05-11 11:07 ` [PATCH 25/32] net/phonet: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 26/32] net/iucv: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 27/32] net/rxrpc: " Christoph Hellwig
2018-05-11 11:07 ` [PATCH 28/32] crypto: af_alg: " Christoph Hellwig
2018-05-11 11:08 ` [PATCH 29/32] pipe: " Christoph Hellwig
2018-05-11 11:08   ` Christoph Hellwig
2018-05-11 11:08 ` [PATCH 30/32] eventfd: switch " Christoph Hellwig
2018-05-11 11:08   ` Christoph Hellwig
2018-05-11 11:08 ` [PATCH 31/32] timerfd: convert " Christoph Hellwig
2018-05-11 11:08   ` Christoph Hellwig
2018-05-11 11:08 ` [PATCH 32/32] random: " Christoph Hellwig
2018-05-11 11:08   ` Christoph Hellwig
  -- strict thread matches above, loose matches on Subject: below --
2018-05-15 19:48 aio poll and a new in-kernel poll API V11 Christoph Hellwig
2018-05-15 19:48 ` [PATCH 04/32] fs: add new vfs_poll and file_can_poll helpers Christoph Hellwig
2018-05-15 19:48   ` Christoph Hellwig
2018-03-30 15:07 aio poll and a new in-kernel poll API V9 Christoph Hellwig
2018-03-30 15:07 ` [PATCH 04/32] fs: add new vfs_poll and file_can_poll helpers Christoph Hellwig
2018-03-30 15:07   ` Christoph Hellwig

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=20180511110803.10910-5-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 \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.