1. 17 Apr, 2024 1 commit
    • Gabriel Krisman Bertazi's avatar
      io-wq: write next_work before dropping acct_lock · 068c27e3
      Gabriel Krisman Bertazi authored
      Commit 361aee45 ("io-wq: add intermediate work step between pending
      list and active work") closed a race between a cancellation and the work
      being removed from the wq for execution.  To ensure the request is
      always reachable by the cancellation, we need to move it within the wq
      lock, which also synchronizes the cancellation.  But commit
      42abc95f ("io-wq: decouple work_list protection from the big
      wqe->lock") replaced the wq lock here and accidentally reintroduced the
      race by releasing the acct_lock too early.
      
      In other words:
      
              worker                |     cancellation
      work = io_get_next_work()     |
      raw_spin_unlock(&acct->lock); |
      			      |
                                    | io_acct_cancel_pending_work
                                    | io_wq_worker_cancel()
      worker->next_work = work
      
      Using acct_lock is still enough since we synchronize on it on
      io_acct_cancel_pending_work.
      
      Fixes: 42abc95f ("io-wq: decouple work_list protection from the big wqe->lock")
      Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@suse.de>
      Link: https://lore.kernel.org/r/20240416021054.3940-2-krisman@suse.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
      068c27e3
  2. 15 Apr, 2024 39 commits