Re: [PATCH] blk-cgroup: check blkcg policy is enabled in blkg_create()
From: Tejun Heo <tj@kernel.org>
Date: 2021-10-11 17:17:04
Also in:
cgroups, lkml
On Fri, Oct 08, 2021 at 03:27:20PM +0800, Yu Kuai wrote:
quoted hunk ↗ jump to hunk
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index eb48090eefce..00e1d97621ea 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c@@ -226,6 +226,20 @@ struct blkcg_gq *blkg_lookup_slowpath(struct blkcg *blkcg, } EXPORT_SYMBOL_GPL(blkg_lookup_slowpath); +static void blkg_check_pd(struct request_queue *q, struct blkcg_gq *blkg) +{ + int i; + + for (i = 0; i < BLKCG_MAX_POLS; i++) { + struct blkcg_policy *pol = blkcg_policy[i]; + + if (blkg->pd[i] && !blkcg_policy_enabled(q, pol)) { + pol->pd_free_fn(blkg->pd[i]); + blkg->pd[i] = NULL; + } + } +} + /* * If @new_blkg is %NULL, this function tries to allocate a new one as * necessary using %GFP_NOWAIT. @new_blkg is always consumed on return.@@ -252,6 +266,9 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg, goto err_free_blkg; } + if (new_blkg) + blkg_check_pd(q, new_blkg); +
Can't this happen the other way around too? ie. Linking a pd which doesn't have an entry for a policy which got enabled inbetween? And what if an existing policy was de-registered and another policy got the policy id inbetween? I think the correct solution here would be synchronizing alloc - create blocks against policy deactivation rather than trying to patch an allocated blkg later. Deactivation being a really slow path, there are plenty of options. The main challenge would making it difficult to make mistakes with, I guess. Thanks. -- tejun