| From 45e6dbffed077e03e925b1c60022d80eab3016cd Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 19 Jun 2021 17:36:59 +0800 |
| Subject: blk-wbt: introduce a new disable state to prevent false positive by |
| rwb_enabled() |
| |
| From: Zhang Yi <yi.zhang@huawei.com> |
| |
| [ Upstream commit 1d0903d61e9645c6330b94247b96dd873dfc11c8 ] |
| |
| Now that we disable wbt by simply zero out rwb->wb_normal in |
| wbt_disable_default() when switch elevator to bfq, but it's not safe |
| because it will become false positive if we change queue depth. If it |
| become false positive between wbt_wait() and wbt_track() when submit |
| write request, it will lead to drop rqw->inflight to -1 in wbt_done(), |
| which will end up trigger IO hung. Fix this issue by introduce a new |
| state which mean the wbt was disabled. |
| |
| Fixes: a79050434b45 ("blk-rq-qos: refactor out common elements of blk-wbt") |
| Signed-off-by: Zhang Yi <yi.zhang@huawei.com> |
| Link: https://lore.kernel.org/r/20210619093700.920393-2-yi.zhang@huawei.com |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| block/blk-wbt.c | 5 +++-- |
| block/blk-wbt.h | 1 + |
| 2 files changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/block/blk-wbt.c b/block/blk-wbt.c |
| index fd410086fe1d..d90082c6b41f 100644 |
| --- a/block/blk-wbt.c |
| +++ b/block/blk-wbt.c |
| @@ -77,7 +77,8 @@ enum { |
| |
| static inline bool rwb_enabled(struct rq_wb *rwb) |
| { |
| - return rwb && rwb->wb_normal != 0; |
| + return rwb && rwb->enable_state != WBT_STATE_OFF_DEFAULT && |
| + rwb->wb_normal != 0; |
| } |
| |
| static void wb_timestamp(struct rq_wb *rwb, unsigned long *var) |
| @@ -702,7 +703,7 @@ void wbt_disable_default(struct request_queue *q) |
| rwb = RQWB(rqos); |
| if (rwb->enable_state == WBT_STATE_ON_DEFAULT) { |
| blk_stat_deactivate(rwb->cb); |
| - rwb->wb_normal = 0; |
| + rwb->enable_state = WBT_STATE_OFF_DEFAULT; |
| } |
| } |
| EXPORT_SYMBOL_GPL(wbt_disable_default); |
| diff --git a/block/blk-wbt.h b/block/blk-wbt.h |
| index 16bdc85b8df9..2eb01becde8c 100644 |
| --- a/block/blk-wbt.h |
| +++ b/block/blk-wbt.h |
| @@ -34,6 +34,7 @@ enum { |
| enum { |
| WBT_STATE_ON_DEFAULT = 1, |
| WBT_STATE_ON_MANUAL = 2, |
| + WBT_STATE_OFF_DEFAULT |
| }; |
| |
| struct rq_wb { |
| -- |
| 2.30.2 |
| |