bfq-iosched: stop using blkg->stat_bytes and ->stat_ios
authorTejun Heo <tj@kernel.org>
Thu, 7 Nov 2019 19:18:00 +0000 (11:18 -0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 7 Nov 2019 19:28:13 +0000 (12:28 -0700)
When used on cgroup1, bfq uses the blkg->stat_bytes and ->stat_ios
from blk-cgroup core to populate six stat knobs.  blk-cgroup core is
moving away from blkg_rwstat to improve scalability and won't be able
to support this usage.

It isn't like the sharing gains all that much.  Let's break it out to
dedicated rwstat counters which are updated when on cgroup1.  This
makes use of bfqg_*rwstat*() helpers outside of
CONFIG_BFQ_CGROUP_DEBUG.  Move them out.

v2: Compile fix when !CONFIG_BFQ_CGROUP_DEBUG.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bfq-cgroup.c
block/bfq-iosched.c
block/bfq-iosched.h

index d4755d4ad009c073a0725e329a567c54f89d78d5..cea0ae12f93783df801a2b85fc2d73cbea994f3c 100644 (file)
@@ -347,6 +347,14 @@ void bfqg_and_blkg_put(struct bfq_group *bfqg)
        bfqg_put(bfqg);
 }
 
+void bfqg_stats_update_legacy_io(struct request_queue *q, struct request *rq)
+{
+       struct bfq_group *bfqg = blkg_to_bfqg(rq->bio->bi_blkg);
+
+       blkg_rwstat_add(&bfqg->stats.bytes, rq->cmd_flags, blk_rq_bytes(rq));
+       blkg_rwstat_add(&bfqg->stats.ios, rq->cmd_flags, 1);
+}
+
 /* @stats = 0 */
 static void bfqg_stats_reset(struct bfqg_stats *stats)
 {
@@ -431,6 +439,8 @@ void bfq_init_entity(struct bfq_entity *entity, struct bfq_group *bfqg)
 
 static void bfqg_stats_exit(struct bfqg_stats *stats)
 {
+       blkg_rwstat_exit(&stats->bytes);
+       blkg_rwstat_exit(&stats->ios);
 #ifdef CONFIG_BFQ_CGROUP_DEBUG
        blkg_rwstat_exit(&stats->merged);
        blkg_rwstat_exit(&stats->service_time);
@@ -448,6 +458,10 @@ static void bfqg_stats_exit(struct bfqg_stats *stats)
 
 static int bfqg_stats_init(struct bfqg_stats *stats, gfp_t gfp)
 {
+       if (blkg_rwstat_init(&stats->bytes, gfp) ||
+           blkg_rwstat_init(&stats->ios, gfp))
+               return -ENOMEM;
+
 #ifdef CONFIG_BFQ_CGROUP_DEBUG
        if (blkg_rwstat_init(&stats->merged, gfp) ||
            blkg_rwstat_init(&stats->service_time, gfp) ||
@@ -1057,7 +1071,6 @@ static ssize_t bfq_io_set_weight(struct kernfs_open_file *of,
        return bfq_io_set_device_weight(of, buf, nbytes, off);
 }
 
-#ifdef CONFIG_BFQ_CGROUP_DEBUG
 static int bfqg_print_rwstat(struct seq_file *sf, void *v)
 {
        blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), blkg_prfill_rwstat,
@@ -1082,6 +1095,7 @@ static int bfqg_print_rwstat_recursive(struct seq_file *sf, void *v)
        return 0;
 }
 
+#ifdef CONFIG_BFQ_CGROUP_DEBUG
 static int bfqg_print_stat(struct seq_file *sf, void *v)
 {
        blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), blkg_prfill_stat,
@@ -1125,7 +1139,8 @@ static int bfqg_print_stat_recursive(struct seq_file *sf, void *v)
 static u64 bfqg_prfill_sectors(struct seq_file *sf, struct blkg_policy_data *pd,
                               int off)
 {
-       u64 sum = blkg_rwstat_total(&pd->blkg->stat_bytes);
+       struct bfq_group *bfqg = blkg_to_bfqg(pd->blkg);
+       u64 sum = blkg_rwstat_total(&bfqg->stats.bytes);
 
        return __blkg_prfill_u64(sf, pd, sum >> 9);
 }
@@ -1142,8 +1157,8 @@ static u64 bfqg_prfill_sectors_recursive(struct seq_file *sf,
 {
        struct blkg_rwstat_sample tmp;
 
-       blkg_rwstat_recursive_sum(pd->blkg, NULL,
-                       offsetof(struct blkcg_gq, stat_bytes), &tmp);
+       blkg_rwstat_recursive_sum(pd->blkg, &blkcg_policy_bfq,
+                       offsetof(struct bfq_group, stats.bytes), &tmp);
 
        return __blkg_prfill_u64(sf, pd,
                (tmp.cnt[BLKG_RWSTAT_READ] + tmp.cnt[BLKG_RWSTAT_WRITE]) >> 9);
@@ -1226,13 +1241,13 @@ struct cftype bfq_blkcg_legacy_files[] = {
        /* statistics, covers only the tasks in the bfqg */
        {
                .name = "bfq.io_service_bytes",
-               .private = (unsigned long)&blkcg_policy_bfq,
-               .seq_show = blkg_print_stat_bytes,
+               .private = offsetof(struct bfq_group, stats.bytes),
+               .seq_show = bfqg_print_rwstat,
        },
        {
                .name = "bfq.io_serviced",
-               .private = (unsigned long)&blkcg_policy_bfq,
-               .seq_show = blkg_print_stat_ios,
+               .private = offsetof(struct bfq_group, stats.ios),
+               .seq_show = bfqg_print_rwstat,
        },
 #ifdef CONFIG_BFQ_CGROUP_DEBUG
        {
@@ -1269,13 +1284,13 @@ struct cftype bfq_blkcg_legacy_files[] = {
        /* the same statistics which cover the bfqg and its descendants */
        {
                .name = "bfq.io_service_bytes_recursive",
-               .private = (unsigned long)&blkcg_policy_bfq,
-               .seq_show = blkg_print_stat_bytes_recursive,
+               .private = offsetof(struct bfq_group, stats.bytes),
+               .seq_show = bfqg_print_rwstat_recursive,
        },
        {
                .name = "bfq.io_serviced_recursive",
-               .private = (unsigned long)&blkcg_policy_bfq,
-               .seq_show = blkg_print_stat_ios_recursive,
+               .private = offsetof(struct bfq_group, stats.ios),
+               .seq_show = bfqg_print_rwstat_recursive,
        },
 #ifdef CONFIG_BFQ_CGROUP_DEBUG
        {
index 0319d63398223420c3b99e537c426c4a0df2b953..41d2d83c919b5a57cc3ecf97e67e325725226a2b 100644 (file)
@@ -5464,6 +5464,10 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
        bool idle_timer_disabled = false;
        unsigned int cmd_flags;
 
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
+       if (!cgroup_subsys_on_dfl(io_cgrp_subsys) && rq->bio)
+               bfqg_stats_update_legacy_io(q, rq);
+#endif
        spin_lock_irq(&bfqd->lock);
        if (blk_mq_sched_try_insert_merge(q, rq)) {
                spin_unlock_irq(&bfqd->lock);
index 5d1a519640f6a3a94e2fabfe9fe7678905f26bc8..2676c06218f17c007a5974e084ce93f00509a483 100644 (file)
@@ -809,6 +809,9 @@ struct bfq_stat {
 };
 
 struct bfqg_stats {
+       /* basic stats */
+       struct blkg_rwstat              bytes;
+       struct blkg_rwstat              ios;
 #ifdef CONFIG_BFQ_CGROUP_DEBUG
        /* number of ios merged */
        struct blkg_rwstat              merged;
@@ -956,6 +959,7 @@ void bfq_put_async_queues(struct bfq_data *bfqd, struct bfq_group *bfqg);
 
 /* ---------------- cgroups-support interface ---------------- */
 
+void bfqg_stats_update_legacy_io(struct request_queue *q, struct request *rq);
 void bfqg_stats_update_io_add(struct bfq_group *bfqg, struct bfq_queue *bfqq,
                              unsigned int op);
 void bfqg_stats_update_io_remove(struct bfq_group *bfqg, unsigned int op);