Re: [PATCH -next 7/8] block, bfq: cleanup bfq_bfqq_update_budg_for_activation()

From: yukuai (C)
Date: Thu May 19 2022 - 09:21:41 EST


在 2022/05/19 19:18, Jan Kara 写道:
On Sat 14-05-22 17:05:21, Yu Kuai wrote:
It will only be called from bfq_bfqq_handle_idle_busy_switch() in
specific code branch, there is no need to precaculate
'bfqq_wants_to_preempt' each time bfq_bfqq_handle_idle_busy_switch()
is caleld.

Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx>

Please see below:

@@ -1816,14 +1807,6 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,
(bfqq->bic || RQ_BIC(rq)->stably_merged) &&
(*interactive || soft_rt)));
- /*
- * Using the last flag, update budget and check whether bfqq
- * may want to preempt the in-service queue.
- */
- bfqq_wants_to_preempt =
- bfq_bfqq_update_budg_for_activation(bfqd, bfqq,
- arrived_in_time);
-
/*
* If bfqq happened to be activated in a burst, but has been
* idle for much more than an interactive queue, then we
...
@@ -1918,7 +1900,7 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,
* (2) this switch of bfqq to busy changes the scenario.
*/
if (bfqd->in_service_queue &&
- ((bfqq_wants_to_preempt &&
+ ((bfq_bfqq_update_budg_for_activation(bfqd, bfqq) &&
bfqq->wr_coeff >= bfqd->in_service_queue->wr_coeff) ||
bfq_bfqq_higher_class_or_weight(bfqq, bfqd->in_service_queue) ||
!bfq_better_to_idle(bfqd->in_service_queue)) &&

So these changes are actually wrong because
bfq_bfqq_update_budg_for_activation() relies on
bfq_bfqq_non_blocking_wait_rq() but bfq_add_bfqq_busy() clears that. And
bfq_add_bfqq_busy() is called between the place where
bfq_bfqq_update_budg_for_activation() was called previously and now so your
patch breaks this logic.

Hi,

You are right, thanks for the explanation, I'll remove this patch and
the next patch in next version.

Kuai

Honza