From: Christoph Hellwig <hch@lst.de>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Christoph Hellwig <hch@lst.de>, 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: Re: [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods
Date: Thu, 11 Jan 2018 12:36:00 +0100 [thread overview]
Message-ID: <20180111113600.GA4120@lst.de> (raw)
In-Reply-To: <20180110210416.GH13338@ZenIV.linux.org.uk>
On Wed, Jan 10, 2018 at 09:04:16PM +0000, Al Viro wrote:
> There's another problem with that - currently ->poll() may tell you "sod off,
> I've got nothing for you to sleep on, eat your POLLHUP|POLLERR|something
> and don't pester me again". With your API that's hard to express sanely.
And what exactly can currently tell 'sod off' right now? ->poll
can only return the (E)POLL* mask. But what would probably be sane
is to do the same thing in vfs_poll I already do in aio poll: call
->poll_mask a first time before calling poll_wait to clear any
already pending events. That way any early error gets instantly
propagated.
> Another piece of fun related to that is handling of disconnects in general -
>
> static __poll_t proc_reg_poll(struct file *file, struct poll_table_struct *pts)
> {
> struct proc_dir_entry *pde = PDE(file_inode(file));
> __poll_t rv = DEFAULT_POLLMASK;
> __poll_t (*poll)(struct file *, struct poll_table_struct *);
> if (use_pde(pde)) {
> poll = pde->proc_fops->poll;
> if (poll)
> rv = poll(file, pts);
> unuse_pde(pde);
> }
> return rv;
> }
>
> and similar in sysfs.
Can't find anything in sysfs, but debugfs has an amazingly bad variant
of the above, including confidence ensuring commit description bits like:
In order not to pollute debugfs with wrapper definitions that aren't ever
needed, I chose not to define a wrapper for every struct file_operations
method possible. Instead, a wrapper is defined only for the subset of
methods which are actually set by any debugfs users.
Currently, these are:
->llseek()
->read()
->write()
->unlocked_ioctl()
->poll()
So anyone implementing say, read_iter/write_iter or compat_ioctl
silently doesn't get the magic protection..
Either way - those two will need updating for the new scheme if
we add proc/debugfs ops, so I better do them now and convert at least
one example each.
> Note, BTW, the places like wait->_qproc = NULL; in do_select() and its ilk.
> Some of them are "don't bother putting me on any queues, I won't be sleeping
> anyway". Some are "I'm already on all queues I care about, I'm going to
> sleep now and the query everything again once woken up". It would be nice
> to have the method splitup reflect that kind of logics...
Hmm. ->poll_mask already is a simple 'are these events pending'
method, and thuse should deal perfectly fine with both cases. What
additional split do you think would be helpful?
> What about af_alg_poll(), BTW? Looks like you've missed that one...
Converted for the next iteration.
> Another thing: IMO file_can_poll() should use FMODE_CAN_POLL - either as
> "true if set, otherwise check ->f_op and set accordingly" or set in
> do_dentry_open() and just check it in file_can_poll()...
I don't really see the point of wasting a fmode bit for it. But
if really want that I cna do it.
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Christoph Hellwig <hch@lst.de>, 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: Re: [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods
Date: Thu, 11 Jan 2018 12:36:00 +0100 [thread overview]
Message-ID: <20180111113600.GA4120@lst.de> (raw)
In-Reply-To: <20180110210416.GH13338@ZenIV.linux.org.uk>
On Wed, Jan 10, 2018 at 09:04:16PM +0000, Al Viro wrote:
> There's another problem with that - currently ->poll() may tell you "sod off,
> I've got nothing for you to sleep on, eat your POLLHUP|POLLERR|something
> and don't pester me again". With your API that's hard to express sanely.
And what exactly can currently tell 'sod off' right now? ->poll
can only return the (E)POLL* mask. But what would probably be sane
is to do the same thing in vfs_poll I already do in aio poll: call
->poll_mask a first time before calling poll_wait to clear any
already pending events. That way any early error gets instantly
propagated.
> Another piece of fun related to that is handling of disconnects in general -
>
> static __poll_t proc_reg_poll(struct file *file, struct poll_table_struct *pts)
> {
> struct proc_dir_entry *pde = PDE(file_inode(file));
> __poll_t rv = DEFAULT_POLLMASK;
> __poll_t (*poll)(struct file *, struct poll_table_struct *);
> if (use_pde(pde)) {
> poll = pde->proc_fops->poll;
> if (poll)
> rv = poll(file, pts);
> unuse_pde(pde);
> }
> return rv;
> }
>
> and similar in sysfs.
Can't find anything in sysfs, but debugfs has an amazingly bad variant
of the above, including confidence ensuring commit description bits like:
In order not to pollute debugfs with wrapper definitions that aren't ever
needed, I chose not to define a wrapper for every struct file_operations
method possible. Instead, a wrapper is defined only for the subset of
methods which are actually set by any debugfs users.
Currently, these are:
->llseek()
->read()
->write()
->unlocked_ioctl()
->poll()
So anyone implementing say, read_iter/write_iter or compat_ioctl
silently doesn't get the magic protection..
Either way - those two will need updating for the new scheme if
we add proc/debugfs ops, so I better do them now and convert at least
one example each.
> Note, BTW, the places like wait->_qproc = NULL; in do_select() and its ilk.
> Some of them are "don't bother putting me on any queues, I won't be sleeping
> anyway". Some are "I'm already on all queues I care about, I'm going to
> sleep now and the query everything again once woken up". It would be nice
> to have the method splitup reflect that kind of logics...
Hmm. ->poll_mask already is a simple 'are these events pending'
method, and thuse should deal perfectly fine with both cases. What
additional split do you think would be helpful?
> What about af_alg_poll(), BTW? Looks like you've missed that one...
Converted for the next iteration.
> Another thing: IMO file_can_poll() should use FMODE_CAN_POLL - either as
> "true if set, otherwise check ->f_op and set accordingly" or set in
> do_dentry_open() and just check it in file_can_poll()...
I don't really see the point of wasting a fmode bit for it. But
if really want that I cna do it.
next prev parent reply other threads:[~2018-01-11 11:36 UTC|newest]
Thread overview: 118+ 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 ` 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
2018-01-10 15:58 ` [PATCH 02/32] fs: add new vfs_poll and file_can_poll helpers Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 21:04 ` Al Viro
2018-01-10 21:04 ` Al Viro
2018-01-11 5:22 ` Al Viro
2018-01-11 5:22 ` Al Viro
2018-01-11 8:28 ` Christoph Hellwig
2018-01-11 8:28 ` Christoph Hellwig
2018-01-11 11:32 ` Christoph Hellwig
2018-01-11 11:32 ` Christoph Hellwig
2018-01-11 11:36 ` Christoph Hellwig [this message]
2018-01-11 11:36 ` Christoph Hellwig
2018-01-11 17:47 ` Al Viro
2018-01-11 17:47 ` Al Viro
2018-01-12 9:06 ` Christoph Hellwig
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 ` 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 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 06/32] net: remove sock_no_poll Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 07/32] net/tcp: convert to ->poll_mask Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 08/32] net/unix: " Christoph Hellwig
2018-01-10 15:58 ` 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 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 10/32] net/dccp: convert to ->poll_mask Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 11/32] net/atm: " Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 12/32] net/vmw_vsock: " Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 13/32] net/tipc: " Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 19:32 ` Jon Maloy
2018-01-10 19:32 ` Jon Maloy
2018-01-10 15:58 ` [PATCH 14/32] net/sctp: " Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 15/32] net/bluetooth: " Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 16/32] net/caif: " Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 17/32] net/nfc: " Christoph Hellwig
2018-01-10 15:58 ` 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 ` 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 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 22/32] eventfd: switch " Christoph Hellwig
2018-01-10 15:58 ` 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 ` 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 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 26/32] aio: refactor read/write iocb setup Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 21:19 ` Jeff Moyer
2018-01-10 21:19 ` Jeff Moyer
2018-01-11 13:38 ` Christoph Hellwig
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 15:58 ` Christoph Hellwig
2018-01-10 21:29 ` Jeff Moyer
2018-01-10 21:29 ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 28/32] aio: simplify cancellation Christoph Hellwig
2018-01-10 15:58 ` 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 15:58 ` Christoph Hellwig
2018-01-10 22:52 ` Jeff Moyer
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 15:58 ` Christoph Hellwig
2018-01-10 22:59 ` Jeff Moyer
2018-01-10 22:59 ` Jeff Moyer
2018-01-10 23:26 ` Jeff Moyer
2018-01-10 23:26 ` Jeff Moyer
2018-01-11 13:43 ` Christoph Hellwig
2018-01-11 13:43 ` Christoph Hellwig
2018-01-11 15:27 ` Jeff Moyer
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
[not found] ` <20180110155853.32348-33-hch-jcswGhMUV9g@public.gmane.org>
2018-01-12 20:44 ` Jeff Moyer
2018-01-12 20:44 ` Jeff Moyer
2018-01-15 8:53 ` Christoph Hellwig
2018-01-15 8:53 ` Christoph Hellwig
2018-01-16 12:04 ` Christoph Hellwig
2018-01-17 0:41 ` Jeff Moyer
2018-01-17 0:41 ` Jeff Moyer
2018-01-17 4:27 ` Al Viro
2018-01-17 4:27 ` Al Viro
2018-01-17 7:08 ` Christoph Hellwig
2018-01-17 7:08 ` Christoph Hellwig
2018-01-17 13:49 ` Jeff Moyer
2018-01-17 13:49 ` Jeff Moyer
2018-01-17 7:36 ` Christoph Hellwig
2018-01-17 7:36 ` Christoph Hellwig
2018-01-17 13:51 ` Jeff Moyer
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 22:36 ` Michael Kerrisk (man-pages)
2018-01-10 23:34 ` Jeff Moyer
2018-01-10 23:34 ` Jeff Moyer
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=20180111113600.GA4120@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.