Re: [PATCH 12/36] fs: add new vfs_poll and file_can_poll helpers
On Mon, Mar 05, 2018 at 01:27:19PM -0800, Christoph Hellwig wrote: > These abstract out calls to the poll method in preparation for changes > in how we poll. > > Signed-off-by: Christoph Hellwig> --- > 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 +- For the fs/include/mm changes, Reviewed-by: Darrick J. Wong The other conversions look fine to me too but I've never looked at them before. :) --D > 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, ); > + mask = vfs_poll(f, ); > 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, , 1, ) == 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(>wait, virqfd_wakeup); > init_poll_funcptr(>pt, virqfd_ptable_queue_proc); > > - events = irqfd.file->f_op->poll(irqfd.file, >pt); > + events = vfs_poll(irqfd.file, >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 1b3e8d2d5c8b..4d27e288bb1d 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, >table); > + mask = vfs_poll(file, >table); > if (mask) > vhost_poll_wakeup(>wait, 0, 0, poll_to_key(mask)); > if (mask & EPOLLERR) { > diff --git a/fs/eventpoll.c b/fs/eventpoll.c > index 0f3494ed3ed0..2bebae5a38cf 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, >poll_wait, pt); > @@ -2020,7 +2019,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 c6c504a814f9..ba91103707ea 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); > +
[PATCH 12/36] fs: add new vfs_poll and file_can_poll helpers
These abstract out calls to the poll method in preparation for changes in how we poll. Signed-off-by: Christoph Hellwig--- 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, ); + mask = vfs_poll(f, ); 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, , 1, ) == 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(>wait, virqfd_wakeup); init_poll_funcptr(>pt, virqfd_ptable_queue_proc); - events = irqfd.file->f_op->poll(irqfd.file, >pt); + events = vfs_poll(irqfd.file, >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 1b3e8d2d5c8b..4d27e288bb1d 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, >table); + mask = vfs_poll(file, >table); if (mask) vhost_poll_wakeup(>wait, 0, 0, poll_to_key(mask)); if (mask & EPOLLERR) { diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 0f3494ed3ed0..2bebae5a38cf 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, >poll_wait, pt); @@ -2020,7 +2019,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 c6c504a814f9..ba91103707ea 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; @@ -819,13 +815,10 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
[PATCH 12/36] fs: add new vfs_poll and file_can_poll helpers
These abstract out calls to the poll method in preparation for changes in how we poll. Signed-off-by: Christoph Hellwig--- 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 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, ); + mask = vfs_poll(f, ); 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, , 1, ) == 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(>wait, virqfd_wakeup); init_poll_funcptr(>pt, virqfd_ptable_queue_proc); - events = irqfd.file->f_op->poll(irqfd.file, >pt); + events = vfs_poll(irqfd.file, >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, >table); + mask = vfs_poll(file, >table); if (mask) vhost_poll_wakeup(>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, >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 2ad66647f340..e96f1342c2f6 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; @@ -818,13 +814,10 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait, /*
[PATCH 12/36] fs: add new vfs_poll and file_can_poll helpers
These abstract out calls to the poll method in preparation for changes in how we poll. Signed-off-by: Christoph Hellwig--- 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 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, ); + mask = vfs_poll(f, ); 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, , 1, ) == 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(>wait, virqfd_wakeup); init_poll_funcptr(>pt, virqfd_ptable_queue_proc); - events = irqfd.file->f_op->poll(irqfd.file, >pt); + events = vfs_poll(irqfd.file, >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, >table); + mask = vfs_poll(file, >table); if (mask) vhost_poll_wakeup(>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, >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 2ad66647f340..e96f1342c2f6 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; @@ -818,13 +814,10 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait, /*