• Pavel Begunkov's avatar
    io_uring: fix link traversal locking · 6af3f48b
    Pavel Begunkov authored
    WARNING: inconsistent lock state
    5.16.0-rc2-syzkaller #0 Not tainted
    inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
    ffff888078e11418 (&ctx->timeout_lock
    ){?.+.}-{2:2}
    , at: io_timeout_fn+0x6f/0x360 fs/io_uring.c:5943
    {HARDIRQ-ON-W} state was registered at:
      [...]
      spin_unlock_irq include/linux/spinlock.h:399 [inline]
      __io_poll_remove_one fs/io_uring.c:5669 [inline]
      __io_poll_remove_one fs/io_uring.c:5654 [inline]
      io_poll_remove_one+0x236/0x870 fs/io_uring.c:5680
      io_poll_remove_all+0x1af/0x235 fs/io_uring.c:5709
      io_ring_ctx_wait_and_kill+0x1cc/0x322 fs/io_uring.c:9534
      io_uring_release+0x42/0x46 fs/io_uring.c:9554
      __fput+0x286/0x9f0 fs/file_table.c:280
      task_work_run+0xdd/0x1a0 kernel/task_work.c:164
      exit_task_work include/linux/task_work.h:32 [inline]
      do_exit+0xc14/0x2b40 kernel/exit.c:832
    
    674ee8e1 ("io_uring: correct link-list traversal locking") fixed a
    data race but introduced a possible deadlock and inconsistentcy in irq
    states. E.g.
    
    io_poll_remove_all()
        spin_lock_irq(timeout_lock)
        io_poll_remove_one()
            spin_lock/unlock_irq(poll_lock);
        spin_unlock_irq(timeout_lock)
    
    Another type of problem is freeing a request while holding
    ->timeout_lock, which may leads to a deadlock in
    io_commit_cqring() -> io_flush_timeouts() and other places.
    
    Having 3 nested locks is also too ugly. Add io_match_task_safe(), which
    would briefly take and release timeout_lock for race prevention inside,
    so the actuall request cancellation / free / etc. code doesn't have it
    taken.
    
    Reported-by: syzbot+ff49a3059d49b0ca0eec@syzkaller.appspotmail.com
    Reported-by: syzbot+847f02ec20a6609a328b@syzkaller.appspotmail.com
    Reported-by: syzbot+3368aadcd30425ceb53b@syzkaller.appspotmail.com
    Reported-by: syzbot+51ce8887cdef77c9ac83@syzkaller.appspotmail.com
    Reported-by: syzbot+3cb756a49d2f394a9ee3@syzkaller.appspotmail.com
    Fixes: 674ee8e1 ("io_uring: correct link-list traversal locking")
    Cc: stable@kernel.org # 5.15+
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Link: https://lore.kernel.org/r/397f7ebf3f4171f1abe41f708ac1ecb5766f0b68.1637937097.git.asml.silence@gmail.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    6af3f48b
io_uring.c 275 KB