On Tue, Feb 05, 2019 at 04:53:04PM -0800, Bart Van Assche wrote:
Could this be what happens?
aio_poll() calls vfs_poll() vfs_poll() calls fuse_dev_poll() fuse_dev_poll() calls poll_wait(file, &fiq->waitq, wait) poll_wait() calls aio_poll_queue_proc(file, &fiq->waitq, wait) aio_poll_queue_proc() stores &fiq->waitq in pt->iocb->poll.head aio_poll() calls spin_lock_irq(&ctx->ctx_lock) aio_poll() calls spin_lock(&req->head->lock) (req == &pt->iocb->poll).
I think the lockdep complaint is about the FUSE fiq->waitq lock not being IRQ-safe and about aio_poll() creating a dependency between an IRQ-safe lock (ctx->ctx_lock) and a lock that is not IRQ-safe (fiq->waitq).
That is exactly the scenario. and the ->wake routine assumes irqs are disabled - you really need to bypass the proper APIs to not have the irqs disabled.