Thread (43 messages) 43 messages, 4 authors, 2018-01-17

Re: [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods

From: Al Viro <viro@ZenIV.linux.org.uk>
Date: 2018-01-11 05:22:05
Also in: linux-fsdevel, lkml, netdev

On Wed, Jan 10, 2018 at 09:04:16PM +0000, Al Viro wrote:
On Wed, Jan 10, 2018 at 04:58:24PM +0100, Christoph Hellwig wrote:
quoted
->get_poll_head returns the waitqueue that the poll operation is going
to sleep on.  Note that this means we can only use a single waitqueue
for the poll, unlike some current drivers that use two waitqueues for
different events.  But now that we have keyed wakeups and heavily use
those for poll there aren't that many good reason left to keep the
multiple waitqueues, and if there are any ->poll is still around, the
driver just won't support aio poll.
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.

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.  

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...

What about af_alg_poll(), BTW?  Looks like you've missed that one...

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()...
Whee...  The very first ->poll() instance in alphabetic order on pathnames:
in arch/cris/arch-v10/drivers/gpio.c

static __poll_t gpio_poll(struct file *file, poll_table *wait)
{
        __poll_t mask = 0;
        struct gpio_private *priv = file->private_data;
        unsigned long data;
        unsigned long flags;

        spin_lock_irqsave(&gpio_lock, flags);

        poll_wait(file, &priv->alarm_wq, wait);

IOW, we are doing poll_wait() (== possible GFP_KERNEL __get_free_page()) under
a spinlock...

--
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>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help