block, bfq: let also stably merged queues enjoy weight raising
authorPaolo Valente <paolo.valente@linaro.org>
Sat, 19 Jun 2021 14:09:42 +0000 (16:09 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 21 Jun 2021 21:03:41 +0000 (15:03 -0600)
Merged bfq_queues are kept out of weight-raising (low-latency)
mechanisms. The reason is that these queues are usually created for
non-interactive and non-soft-real-time tasks. Yet this is not the case
for stably-merged queues. These queues are merged just because they
are created shortly after each other. So they may easily serve the I/O
of an interactive or soft-real time application, if the application
happens to spawn multiple processes.

To address this issue, this commits lets also stably-merged queued
enjoy weight raising.

Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
Link: https://lore.kernel.org/r/20210619140948.98712-2-paolo.valente@linaro.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bfq-iosched.c

index acd1f88..da2363f 100644 (file)
@@ -1729,10 +1729,23 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,
                bfqq->entity.new_weight == 40;
        *interactive = !in_burst && idle_for_long_time &&
                bfqq->entity.new_weight == 40;
+       /*
+        * Merged bfq_queues are kept out of weight-raising
+        * (low-latency) mechanisms. The reason is that these queues
+        * are usually created for non-interactive and
+        * non-soft-real-time tasks. Yet this is not the case for
+        * stably-merged queues. These queues are merged just because
+        * they are created shortly after each other. So they may
+        * easily serve the I/O of an interactive or soft-real time
+        * application, if the application happens to spawn multiple
+        * processes. So let also stably-merged queued enjoy weight
+        * raising.
+        */
        wr_or_deserves_wr = bfqd->low_latency &&
                (bfqq->wr_coeff > 1 ||
                 (bfq_bfqq_sync(bfqq) &&
-                 bfqq->bic && (*interactive || soft_rt)));
+                 (bfqq->bic || RQ_BIC(rq)->stably_merged) &&
+                  (*interactive || soft_rt)));
 
        /*
         * Using the last flag, update budget and check whether bfqq