bfq: Extract bfq_group_set_weight from bfq_io_set_weight_legacy
authorFam Zheng <zhengfeiran@bytedance.com>
Wed, 28 Aug 2019 03:54:52 +0000 (11:54 +0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 6 Sep 2019 20:33:50 +0000 (14:33 -0600)
This function will be useful when we update weight from the soon-coming
per-device interface.

Signed-off-by: Fam Zheng <zhengfeiran@bytedance.com>
Reviewed-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bfq-cgroup.c

index e6fb537b4bfc6bf9ea1b944b9a196b21a0f89ac6..102bdfd6f72c4e291b5a3ba274e42f376531a7b7 100644 (file)
@@ -919,6 +919,36 @@ static int bfq_io_show_weight(struct seq_file *sf, void *v)
        return 0;
 }
 
+static void bfq_group_set_weight(struct bfq_group *bfqg, u64 weight)
+{
+       /*
+        * Setting the prio_changed flag of the entity
+        * to 1 with new_weight == weight would re-set
+        * the value of the weight to its ioprio mapping.
+        * Set the flag only if necessary.
+        */
+       if ((unsigned short)weight != bfqg->entity.new_weight) {
+               bfqg->entity.new_weight = (unsigned short)weight;
+               /*
+                * Make sure that the above new value has been
+                * stored in bfqg->entity.new_weight before
+                * setting the prio_changed flag. In fact,
+                * this flag may be read asynchronously (in
+                * critical sections protected by a different
+                * lock than that held here), and finding this
+                * flag set may cause the execution of the code
+                * for updating parameters whose value may
+                * depend also on bfqg->entity.new_weight (in
+                * __bfq_entity_update_weight_prio).
+                * This barrier makes sure that the new value
+                * of bfqg->entity.new_weight is correctly
+                * seen in that code.
+                */
+               smp_wmb();
+               bfqg->entity.prio_changed = 1;
+       }
+}
+
 static int bfq_io_set_weight_legacy(struct cgroup_subsys_state *css,
                                    struct cftype *cftype,
                                    u64 val)
@@ -937,34 +967,8 @@ static int bfq_io_set_weight_legacy(struct cgroup_subsys_state *css,
        hlist_for_each_entry(blkg, &blkcg->blkg_list, blkcg_node) {
                struct bfq_group *bfqg = blkg_to_bfqg(blkg);
 
-               if (!bfqg)
-                       continue;
-               /*
-                * Setting the prio_changed flag of the entity
-                * to 1 with new_weight == weight would re-set
-                * the value of the weight to its ioprio mapping.
-                * Set the flag only if necessary.
-                */
-               if ((unsigned short)val != bfqg->entity.new_weight) {
-                       bfqg->entity.new_weight = (unsigned short)val;
-                       /*
-                        * Make sure that the above new value has been
-                        * stored in bfqg->entity.new_weight before
-                        * setting the prio_changed flag. In fact,
-                        * this flag may be read asynchronously (in
-                        * critical sections protected by a different
-                        * lock than that held here), and finding this
-                        * flag set may cause the execution of the code
-                        * for updating parameters whose value may
-                        * depend also on bfqg->entity.new_weight (in
-                        * __bfq_entity_update_weight_prio).
-                        * This barrier makes sure that the new value
-                        * of bfqg->entity.new_weight is correctly
-                        * seen in that code.
-                        */
-                       smp_wmb();
-                       bfqg->entity.prio_changed = 1;
-               }
+               if (bfqg)
+                       bfq_group_set_weight(bfqg, val);
        }
        spin_unlock_irq(&blkcg->lock);