While using blk-wbt, sometimes sync writes are blocked by background writes, for example, a) a background write reaches the (background) limit returned by get_limit(), so it's added into the rqw->wait (non kswapd's rqw in this case) and goes to sleep. b) then a sync write gets queued and goes to sleep when finding that waitqueue_active() returns true and someone else is already on the waiting list. Thus, the sync write will get its rq after the background write getting rq. With this, only background writes will check waitqueue's status and sync writes will only be throttled by the (max) limit returned by get_limit(). Signed-off-by: Liu Bo <bo.li.liu@xxxxxxxxxx> --- - Besides the above problem, it seems waitqueue_active() also requires a smp_mb(). block/blk-wbt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/blk-wbt.c b/block/blk-wbt.c index 6a9a0f0..698d9f7 100644 --- a/block/blk-wbt.c +++ b/block/blk-wbt.c @@ -519,7 +519,8 @@ static inline bool may_queue(struct rq_wb *rwb, struct rq_wait *rqw, * If the waitqueue is already active and we are not the next * in line to be woken up, wait for our turn. */ - if (waitqueue_active(&rqw->wait) && + if ((rw & REQ_BACKGROUND) && + waitqueue_active(&rqw->wait) && rqw->wait.head.next != &wait->entry) return false; -- 2.9.4