blk-cgroup: simplify blkg freeing from initialization failure paths
authorChristoph Hellwig <hch@lst.de>
Fri, 3 Feb 2023 15:03:45 +0000 (16:03 +0100)
committerJens Axboe <axboe@kernel.dk>
Fri, 3 Feb 2023 15:20:05 +0000 (08:20 -0700)
There is no need to delay freeing a blkg to a workqueue when freeing it
after an initialization failure.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20230203150400.3199230-5-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-cgroup.c

index 9df02a6..1038688 100644 (file)
@@ -114,10 +114,8 @@ static bool blkcg_policy_enabled(struct request_queue *q,
        return pol && test_bit(pol->plid, q->blkcg_pols);
 }
 
-static void blkg_free_workfn(struct work_struct *work)
+static void blkg_free(struct blkcg_gq *blkg)
 {
-       struct blkcg_gq *blkg = container_of(work, struct blkcg_gq,
-                                            free_work);
        struct request_queue *q = blkg->q;
        int i;
 
@@ -143,23 +141,9 @@ static void blkg_free_workfn(struct work_struct *work)
        kfree(blkg);
 }
 
-/**
- * blkg_free - free a blkg
- * @blkg: blkg to free
- *
- * Free @blkg which may be partially allocated.
- */
-static void blkg_free(struct blkcg_gq *blkg)
+static void blkg_free_workfn(struct work_struct *work)
 {
-       if (!blkg)
-               return;
-
-       /*
-        * Both ->pd_free_fn() and request queue's release handler may
-        * sleep, so free us by scheduling one work func
-        */
-       INIT_WORK(&blkg->free_work, blkg_free_workfn);
-       schedule_work(&blkg->free_work);
+       blkg_free(container_of(work, struct blkcg_gq, free_work));
 }
 
 static void __blkg_release(struct rcu_head *rcu)
@@ -170,7 +154,10 @@ static void __blkg_release(struct rcu_head *rcu)
 
        /* release the blkcg and parent blkg refs this blkg has been holding */
        css_put(&blkg->blkcg->css);
-       blkg_free(blkg);
+
+       /* ->pd_free_fn() may sleep, so free from a work queue */
+       INIT_WORK(&blkg->free_work, blkg_free_workfn);
+       schedule_work(&blkg->free_work);
 }
 
 /*