From: Tao Cui <cui.tao@linux.dev>
To: tj@kernel.org, axboe@kernel.dk, josef@toxicpanda.com
Cc: cgroups@vger.kernel.org, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, cui.tao@linux.dev,
Tao Cui <cuitao@kylinos.cn>
Subject: [PATCH v4] blk-cgroup: fix leaks and online flag on radix_tree_insert failure
Date: Wed, 15 Jul 2026 21:24:07 +0800 [thread overview]
Message-ID: <20260715132407.1469777-1-cui.tao@linux.dev> (raw)
From: Tao Cui <cuitao@kylinos.cn>
When radix_tree_insert() fails in blkg_create(), the error path has two
issues:
1. blkg->online is set to true unconditionally, even when the blkg was
never fully inserted. Move the assignment inside the success block.
2. The error path calls blkg_put() without first calling
percpu_ref_kill(). Because the refcount is still in percpu mode,
percpu_ref_put() only does this_cpu_sub() without checking for zero,
so blkg_release() is never triggered. This permanently leaks the
blkg memory, its percpu iostat, policy data, the parent blkg
reference, and the cgroup css reference — the latter preventing the
cgroup from ever being destroyed.
Fix by replacing blkg_put() with percpu_ref_kill(), matching the pattern
used in blkg_destroy().
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
v4:
- Resend. No functional change. Folded in Acked-by from Tejun Heo and
rebased onto current mainline (context-only: the err_put_css label was
renamed to err_free_blkg upstream).
v3:
- Remove the redundant blkg_put() after percpu_ref_kill() to avoid a
double-put that causes the refcount to go negative and bypass
blkg_release(), as pointed out by the sashiko AI review.
v3: https://lore.kernel.org/all/20260507061229.57466-1-cuitao@kylinos.cn/
v2:
- Also fix the percpu_ref leak on the radix_tree_insert() error path by
adding percpu_ref_kill() before blkg_put(), as pointed out by the
sashiko AI review.
v1: https://lore.kernel.org/all/20260506131124.16755-1-cuitao@kylinos.cn/
---
block/blk-cgroup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index d2a1f5903f24..d9676126c5b5 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -434,15 +434,15 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg, struct gendisk *disk,
blkg->pd[i]->online = true;
}
}
+ blkg->online = true;
}
- blkg->online = true;
spin_unlock(&blkcg->lock);
if (!ret)
return blkg;
/* @blkg failed fully initialized, use the usual release path */
- blkg_put(blkg);
+ percpu_ref_kill(&blkg->refcnt);
return ERR_PTR(ret);
err_free_blkg:
--
2.43.0
next reply other threads:[~2026-07-15 13:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-15 13:24 Tao Cui [this message]
2026-07-15 22:34 ` [PATCH v4] blk-cgroup: fix leaks and online flag on radix_tree_insert failure Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260715132407.1469777-1-cui.tao@linux.dev \
--to=cui.tao@linux.dev \
--cc=axboe@kernel.dk \
--cc=cgroups@vger.kernel.org \
--cc=cuitao@kylinos.cn \
--cc=josef@toxicpanda.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.