1. 19 Sep, 2022 12 commits
  2. 12 Sep, 2022 9 commits
  3. 08 Sep, 2022 3 commits
  4. 05 Sep, 2022 6 commits
  5. 04 Sep, 2022 2 commits
  6. 02 Sep, 2022 1 commit
  7. 01 Sep, 2022 1 commit
  8. 26 Aug, 2022 1 commit
  9. 24 Aug, 2022 1 commit
  10. 23 Aug, 2022 1 commit
    • Yu Kuai's avatar
      sbitmap: fix possible io hung due to lost wakeup · 040b83fc
      Yu Kuai authored
      There are two problems can lead to lost wakeup:
      
      1) invalid wakeup on the wrong waitqueue:
      
      For example, 2 * wake_batch tags are put, while only wake_batch threads
      are woken:
      
      __sbq_wake_up
       atomic_cmpxchg -> reset wait_cnt
      			__sbq_wake_up -> decrease wait_cnt
      			...
      			__sbq_wake_up -> wait_cnt is decreased to 0 again
      			 atomic_cmpxchg
      			 sbq_index_atomic_inc -> increase wake_index
      			 wake_up_nr -> wake up and waitqueue might be empty
       sbq_index_atomic_inc -> increase again, one waitqueue is skipped
       wake_up_nr -> invalid wake up because old wakequeue might be empty
      
      To fix the problem, increasing 'wake_index' before resetting 'wait_cnt'.
      
      2) 'wait_cnt' can be decreased while waitqueue is empty
      
      As pointed out by Jan Kara, following race is possible:
      
      CPU1				CPU2
      __sbq_wake_up			 __sbq_wake_up
       sbq_wake_ptr()			 sbq_wake_ptr() -> the same
       wait_cnt = atomic_dec_return()
       /* decreased to 0 */
       sbq_index_atomic_inc()
       /* move to next waitqueue */
       atomic_set()
       /* reset wait_cnt */
       wake_up_nr()
       /* wake up on the old waitqueue */
      				 wait_cnt = atomic_dec_return()
      				 /*
      				  * decrease wait_cnt in the old
      				  * waitqueue, while it can be
      				  * empty.
      				  */
      
      Fix the problem by waking up before updating 'wake_index' and
      'wait_cnt'.
      
      With this patch, noted that 'wait_cnt' is still decreased in the old
      empty waitqueue, however, the wakeup is redirected to a active waitqueue,
      and the extra decrement on the old empty waitqueue is not handled.
      
      Fixes: 88459642 ("blk-mq: abstract tag allocation out into sbitmap library")
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Reviewed-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20220803121504.212071-1-yukuai1@huaweicloud.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
      040b83fc
  11. 22 Aug, 2022 3 commits