From: Al Viro <viro@ZenIV.linux.org.uk>
To: Christoph Hellwig <hch@lst.de>
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,
Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods
Date: Thu, 11 Jan 2018 17:47:50 +0000 [thread overview]
Message-ID: <20180111174750.GL13338@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20180111113600.GA4120@lst.de>
On Thu, Jan 11, 2018 at 12:36:00PM +0100, Christoph Hellwig wrote:
> 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.
static __poll_t
capi_poll(struct file *file, poll_table *wait)
{
struct capidev *cdev = file->private_data;
__poll_t mask = 0;
if (!cdev->ap.applid)
return POLLERR;
poll_wait(file, &(cdev->recvwait), wait);
mask = POLLOUT | POLLWRNORM;
if (!skb_queue_empty(&cdev->recvqueue))
mask |= POLLIN | POLLRDNORM;
return mask;
}
and a bunch of similar beasts. FWIW, I'm going through that zoo, looking for
existing patterns.
BTW, consider this:
static __poll_t sync_serial_poll(struct file *file, poll_table *wait)
{
int dev = iminor(file_inode(file));
__poll_t mask = 0;
struct sync_port *port;
DEBUGPOLL(
static __poll_t prev_mask;
);
port = &ports[dev];
if (!port->started)
sync_serial_start_port(port);
poll_wait(file, &port->out_wait_q, wait);
poll_wait(file, &port->in_wait_q, wait);
/* No active transfer, descriptors are available */
if (port->output && !port->tr_running)
mask |= POLLOUT | POLLWRNORM;
...
}
Besides having two queues, note the one-time sync_serial_start_port()
there. Where would you map such things? First ->poll_mask()?
> Can't find anything in sysfs,
Large chunk of sysfs is in fs/kernfs/*.c; it's there.
> > 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 I mean is that it would be nice to have do_select() and friends aware of that.
You are hiding the whole thing behind vfs_poll(); sure, we can't really exploit
that while we have the mix of converted and unconverted instances, but it would
be a nice payoff.
As for calling ->poll_mask() first... Three method calls per descriptor on the
first pass? Overhead might get painful...
FWIW, the problem with "sod off early" ones is not the cost of poll_wait() -
it's that sometimes we might not _have_ a queue to sleep on. Hell knows, I need
to finish the walk through that zoo to see what's out there... Pox on
drivers/media - that's where the bulk of instances is, and they are fairly
convoluted...
wait_on_event_..._key() might be a good idea; we probably want comments from
Peter on that one. An interesting testcase would be tty - the amount of
threads sleeping on those queues is going to be large; can we combine
->read_wait and ->write_wait without serious PITA? Another issue is
ldisc handling - the first thing tty_poll() is doing is
ld = tty_ldisc_ref_wait(tty);
and it really waits for ldisc changes in progress to settle. Hell knows
whether anything relies on that, but I wouldn't be surprised if it did -
tty handling is one of the areas where select(2)/poll(2) get non-trivial
use...
--
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: Al Viro <viro@ZenIV.linux.org.uk>
To: Christoph Hellwig <hch@lst.de>
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,
Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods
Date: Thu, 11 Jan 2018 17:47:50 +0000 [thread overview]
Message-ID: <20180111174750.GL13338@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20180111113600.GA4120@lst.de>
On Thu, Jan 11, 2018 at 12:36:00PM +0100, Christoph Hellwig wrote:
> 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.
static __poll_t
capi_poll(struct file *file, poll_table *wait)
{
struct capidev *cdev = file->private_data;
__poll_t mask = 0;
if (!cdev->ap.applid)
return POLLERR;
poll_wait(file, &(cdev->recvwait), wait);
mask = POLLOUT | POLLWRNORM;
if (!skb_queue_empty(&cdev->recvqueue))
mask |= POLLIN | POLLRDNORM;
return mask;
}
and a bunch of similar beasts. FWIW, I'm going through that zoo, looking for
existing patterns.
BTW, consider this:
static __poll_t sync_serial_poll(struct file *file, poll_table *wait)
{
int dev = iminor(file_inode(file));
__poll_t mask = 0;
struct sync_port *port;
DEBUGPOLL(
static __poll_t prev_mask;
);
port = &ports[dev];
if (!port->started)
sync_serial_start_port(port);
poll_wait(file, &port->out_wait_q, wait);
poll_wait(file, &port->in_wait_q, wait);
/* No active transfer, descriptors are available */
if (port->output && !port->tr_running)
mask |= POLLOUT | POLLWRNORM;
...
}
Besides having two queues, note the one-time sync_serial_start_port()
there. Where would you map such things? First ->poll_mask()?
> Can't find anything in sysfs,
Large chunk of sysfs is in fs/kernfs/*.c; it's there.
> > 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 I mean is that it would be nice to have do_select() and friends aware of that.
You are hiding the whole thing behind vfs_poll(); sure, we can't really exploit
that while we have the mix of converted and unconverted instances, but it would
be a nice payoff.
As for calling ->poll_mask() first... Three method calls per descriptor on the
first pass? Overhead might get painful...
FWIW, the problem with "sod off early" ones is not the cost of poll_wait() -
it's that sometimes we might not _have_ a queue to sleep on. Hell knows, I need
to finish the walk through that zoo to see what's out there... Pox on
drivers/media - that's where the bulk of instances is, and they are fairly
convoluted...
wait_on_event_..._key() might be a good idea; we probably want comments from
Peter on that one. An interesting testcase would be tty - the amount of
threads sleeping on those queues is going to be large; can we combine
->read_wait and ->write_wait without serious PITA? Another issue is
ldisc handling - the first thing tty_poll() is doing is
ld = tty_ldisc_ref_wait(tty);
and it really waits for ldisc changes in progress to settle. Hell knows
whether anything relies on that, but I wouldn't be surprised if it did -
tty handling is one of the areas where select(2)/poll(2) get non-trivial
use...
next prev parent reply other threads:[~2018-01-11 17:47 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
2018-01-11 11:36 ` Christoph Hellwig
2018-01-11 17:47 ` Al Viro [this message]
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=20180111174750.GL13338@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=avi@scylladb.com \
--cc=hch@lst.de \
--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=peterz@infradead.org \
/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.