]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
blk-cgroup: move congestion_count to struct blkcg
authorXiu Jianfeng <xiujianfeng@huawei.com>
Tue, 16 Jul 2024 13:30:58 +0000 (13:30 +0000)
committerJens Axboe <axboe@kernel.dk>
Fri, 19 Jul 2024 15:40:07 +0000 (09:40 -0600)
The congestion_count was introduced into the struct cgroup by
commit d09d8df3a294 ("blkcg: add generic throttling mechanism"),
but since it is closely related to the blkio subsys, it is not
appropriate to put it in the struct cgroup, so let's move it to
struct blkcg. There should be no functional changes because blkcg
is per cgroup.

Signed-off-by: Xiu Jianfeng <xiujianfeng@huawei.com>
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20240716133058.3491350-1-xiujianfeng@huawei.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-cgroup.c
block/blk-cgroup.h
include/linux/cgroup-defs.h

index 37e6cc91d576bf956854635126a0ce02a858b995..69e70964398c653704ec863af946b0e1b0eef926 100644 (file)
@@ -2182,12 +2182,13 @@ void blk_cgroup_bio_start(struct bio *bio)
 
 bool blk_cgroup_congested(void)
 {
-       struct cgroup_subsys_state *css;
+       struct blkcg *blkcg;
        bool ret = false;
 
        rcu_read_lock();
-       for (css = blkcg_css(); css; css = css->parent) {
-               if (atomic_read(&css->cgroup->congestion_count)) {
+       for (blkcg = css_to_blkcg(blkcg_css()); blkcg;
+            blkcg = blkcg_parent(blkcg)) {
+               if (atomic_read(&blkcg->congestion_count)) {
                        ret = true;
                        break;
                }
index bd472a30bc61f607224b99fae274dff0a01d2301..864fad4a850bb6b4b19c613ed40b6ec9e61ac714 100644 (file)
@@ -95,6 +95,8 @@ struct blkcg {
        struct cgroup_subsys_state      css;
        spinlock_t                      lock;
        refcount_t                      online_pin;
+       /* If there is block congestion on this cgroup. */
+       atomic_t                        congestion_count;
 
        struct radix_tree_root          blkg_tree;
        struct blkcg_gq __rcu           *blkg_hint;
@@ -374,7 +376,7 @@ static inline void blkcg_use_delay(struct blkcg_gq *blkg)
        if (WARN_ON_ONCE(atomic_read(&blkg->use_delay) < 0))
                return;
        if (atomic_add_return(1, &blkg->use_delay) == 1)
-               atomic_inc(&blkg->blkcg->css.cgroup->congestion_count);
+               atomic_inc(&blkg->blkcg->congestion_count);
 }
 
 static inline int blkcg_unuse_delay(struct blkcg_gq *blkg)
@@ -399,7 +401,7 @@ static inline int blkcg_unuse_delay(struct blkcg_gq *blkg)
        if (old == 0)
                return 0;
        if (old == 1)
-               atomic_dec(&blkg->blkcg->css.cgroup->congestion_count);
+               atomic_dec(&blkg->blkcg->congestion_count);
        return 1;
 }
 
@@ -418,7 +420,7 @@ static inline void blkcg_set_delay(struct blkcg_gq *blkg, u64 delay)
 
        /* We only want 1 person setting the congestion count for this blkg. */
        if (!old && atomic_try_cmpxchg(&blkg->use_delay, &old, -1))
-               atomic_inc(&blkg->blkcg->css.cgroup->congestion_count);
+               atomic_inc(&blkg->blkcg->congestion_count);
 
        atomic64_set(&blkg->delay_nsec, delay);
 }
@@ -435,7 +437,7 @@ static inline void blkcg_clear_delay(struct blkcg_gq *blkg)
 
        /* We only want 1 person clearing the congestion count for this blkg. */
        if (old && atomic_try_cmpxchg(&blkg->use_delay, &old, 0))
-               atomic_dec(&blkg->blkcg->css.cgroup->congestion_count);
+               atomic_dec(&blkg->blkcg->congestion_count);
 }
 
 /**
index ea48c861cd3695296b5de1548bbb03cf61c62e4a..ec82c4b7ed4db726ee12ec9201d007cff0ca44de 100644 (file)
@@ -534,9 +534,6 @@ struct cgroup {
        /* used to store eBPF programs */
        struct cgroup_bpf bpf;
 
-       /* If there is block congestion on this cgroup. */
-       atomic_t congestion_count;
-
        /* Used to store internal freezer state */
        struct cgroup_freezer_state freezer;