]> www.infradead.org Git - users/hch/block.git/commitdiff
block: BFQ: Refactor bfq_exit_icq() to silence sparse warning
authorJohn Garry <john.g.garry@oracle.com>
Fri, 14 Jun 2024 09:03:45 +0000 (09:03 +0000)
committerJens Axboe <axboe@kernel.dk>
Sun, 16 Jun 2024 21:30:32 +0000 (15:30 -0600)
Currently building for C=1 generates the following warning:
block/bfq-iosched.c:5498:9: warning: context imbalance in 'bfq_exit_icq' - different lock contexts for basic block

Refactor bfq_exit_icq() into a core part which loops for the actuators,
and only lock calling this routine when necessary.

Signed-off-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20240614090345.655716-4-john.g.garry@oracle.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bfq-iosched.c

index 4b88a54a9b76cba3bca954e50f509ff6028251ee..36a4998c4b378b88c4a4b2d1ae9e995c7711db26 100644 (file)
@@ -5463,40 +5463,42 @@ static void bfq_exit_icq_bfqq(struct bfq_io_cq *bic, bool is_sync,
        }
 }
 
+static void _bfq_exit_icq(struct bfq_io_cq *bic, unsigned int num_actuators)
+{
+       struct bfq_iocq_bfqq_data *bfqq_data = bic->bfqq_data;
+       unsigned int act_idx;
+
+       for (act_idx = 0; act_idx < num_actuators; act_idx++) {
+               if (bfqq_data[act_idx].stable_merge_bfqq)
+                       bfq_put_stable_ref(bfqq_data[act_idx].stable_merge_bfqq);
+
+               bfq_exit_icq_bfqq(bic, true, act_idx);
+               bfq_exit_icq_bfqq(bic, false, act_idx);
+       }
+}
+
 static void bfq_exit_icq(struct io_cq *icq)
 {
        struct bfq_io_cq *bic = icq_to_bic(icq);
        struct bfq_data *bfqd = bic_to_bfqd(bic);
        unsigned long flags;
-       unsigned int act_idx;
+
        /*
         * If bfqd and thus bfqd->num_actuators is not available any
         * longer, then cycle over all possible per-actuator bfqqs in
         * next loop. We rely on bic being zeroed on creation, and
         * therefore on its unused per-actuator fields being NULL.
-        */
-       unsigned int num_actuators = BFQ_MAX_ACTUATORS;
-       struct bfq_iocq_bfqq_data *bfqq_data = bic->bfqq_data;
-
-       /*
+        *
         * bfqd is NULL if scheduler already exited, and in that case
         * this is the last time these queues are accessed.
         */
        if (bfqd) {
                spin_lock_irqsave(&bfqd->lock, flags);
-               num_actuators = bfqd->num_actuators;
-       }
-
-       for (act_idx = 0; act_idx < num_actuators; act_idx++) {
-               if (bfqq_data[act_idx].stable_merge_bfqq)
-                       bfq_put_stable_ref(bfqq_data[act_idx].stable_merge_bfqq);
-
-               bfq_exit_icq_bfqq(bic, true, act_idx);
-               bfq_exit_icq_bfqq(bic, false, act_idx);
-       }
-
-       if (bfqd)
+               _bfq_exit_icq(bic, bfqd->num_actuators);
                spin_unlock_irqrestore(&bfqd->lock, flags);
+       } else {
+               _bfq_exit_icq(bic, BFQ_MAX_ACTUATORS);
+       }
 }
 
 /*