Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08d383a7 authored by Paolo Valente's avatar Paolo Valente Committed by Jens Axboe
Browse files

block, bfq: reset last_completed_rq_bfqq if the pointed queue is freed



Since commit 13a857a4 ("block, bfq: detect wakers and
unconditionally inject their I/O"), BFQ stores, in a per-device
pointer last_completed_rq_bfqq, the last bfq_queue that had an I/O
request completed. If some bfq_queue receives new I/O right after the
last request of last_completed_rq_bfqq has been completed, then
last_completed_rq_bfqq may be a waker bfq_queue.

But if the bfq_queue last_completed_rq_bfqq points to is freed, then
last_completed_rq_bfqq becomes a dangling reference. This commit
resets last_completed_rq_bfqq if the pointed bfq_queue is freed.

Fixes: 13a857a4 ("block, bfq: detect wakers and unconditionally inject their I/O")
Reported-by: default avatarDouglas Anderson <dianders@chromium.org>
Tested-by: default avatarDouglas Anderson <dianders@chromium.org>
Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 430380b4
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -1924,7 +1924,8 @@ static void bfq_add_request(struct request *rq)
		 * confirmed no later than during the next
		 * I/O-plugging interval for bfqq.
		 */
		if (!bfq_bfqq_has_short_ttime(bfqq) &&
		if (bfqd->last_completed_rq_bfqq &&
		    !bfq_bfqq_has_short_ttime(bfqq) &&
		    ktime_get_ns() - bfqd->last_completion <
		    200 * NSEC_PER_USEC) {
			if (bfqd->last_completed_rq_bfqq != bfqq &&
@@ -4808,6 +4809,9 @@ void bfq_put_queue(struct bfq_queue *bfqq)
			bfqq->bfqd->burst_size--;
	}

	if (bfqq->bfqd && bfqq->bfqd->last_completed_rq_bfqq == bfqq)
		bfqq->bfqd->last_completed_rq_bfqq = NULL;

	kmem_cache_free(bfq_pool, bfqq);
#ifdef CONFIG_BFQ_GROUP_IOSCHED
	bfqg_and_blkg_put(bfqg);