]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring: fix race between poll completion and cancel_hash insertion
authorHao Xu <haoxu@linux.alibaba.com>
Wed, 22 Sep 2021 10:12:36 +0000 (18:12 +0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 24 Sep 2021 16:24:34 +0000 (10:24 -0600)
commit02651d0f06afc2a20e941bdd65b1a25387b661da
tree2bfb3a10247a77a18deeb83f4f2387c9e76da197
parent5932d9d4006248a460871bd9d972c4815b55e5fc
io_uring: fix race between poll completion and cancel_hash insertion

If poll arming and poll completion runs in parallel, there maybe races.
For instance, run io_poll_add in iowq and io_poll_task_func in original
context, then:

  iowq                                      original context
  io_poll_add
    vfs_poll
     (interruption happens
      tw queued to original
      context)                              io_poll_task_func
                                              generate cqe
                                              del from cancel_hash[]
    if !poll.done
      insert to cancel_hash[]

The entry left in cancel_hash[], similar case for fast poll.
Fix it by set poll.done = true when del from cancel_hash[].

Fixes: 08be3dc244fc ("io_uring: terminate multishot poll for CQ ring overflow")
Signed-off-by: Hao Xu <haoxu@linux.alibaba.com>
Link: https://lore.kernel.org/r/20210922101238.7177-2-haoxu@linux.alibaba.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c