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.