Skip to content

Commit e92bc4c

Browse files
Laibin Qiuaxboe
authored andcommitted
block/wbt: fix negative inflight counter when remove scsi device
Now that we disable wbt by set WBT_STATE_OFF_DEFAULT in wbt_disable_default() when switch elevator to bfq. And when we remove scsi device, wbt will be enabled by wbt_enable_default. If it become false positive between wbt_wait() and wbt_track() when submit write request. The following is the scenario that triggered the problem. T1 T2 T3 elevator_switch_mq bfq_init_queue wbt_disable_default <= Set rwb->enable_state (OFF) Submit_bio blk_mq_make_request rq_qos_throttle <= rwb->enable_state (OFF) scsi_remove_device sd_remove del_gendisk blk_unregister_queue elv_unregister_queue wbt_enable_default <= Set rwb->enable_state (ON) q_qos_track <= rwb->enable_state (ON) ^^^^^^ this request will mark WBT_TRACKED without inflight add and will lead to drop rqw->inflight to -1 in wbt_done() which will trigger IO hung. Fix this by move wbt_enable_default() from elv_unregister to bfq_exit_queue(). Only re-enable wbt when bfq exit. Fixes: 76a8040 ("blk-wbt: make sure throttle is enabled properly") Remove oneline stale comment, and kill one oneshot local variable. Signed-off-by: Ming Lei <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Link: https://lore.kernel.org/linux-block/[email protected]/ Signed-off-by: Laibin Qiu <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 7a5428d commit e92bc4c

File tree

2 files changed

+2
-2
lines changed

2 files changed

+2
-2
lines changed

block/bfq-iosched.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7018,6 +7018,8 @@ static void bfq_exit_queue(struct elevator_queue *e)
70187018
spin_unlock_irq(&bfqd->lock);
70197019
#endif
70207020

7021+
wbt_enable_default(bfqd->queue);
7022+
70217023
kfree(bfqd);
70227024
}
70237025

block/elevator.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,8 +525,6 @@ void elv_unregister_queue(struct request_queue *q)
525525
kobject_del(&e->kobj);
526526

527527
e->registered = 0;
528-
/* Re-enable throttling in case elevator disabled it */
529-
wbt_enable_default(q);
530528
}
531529
}
532530

0 commit comments

Comments
 (0)