]> www.infradead.org Git - users/hch/misc.git/commitdiff
block: move blkcg initialization/destroy into disk allocation/release handler
authorMing Lei <ming.lei@redhat.com>
Tue, 8 Mar 2022 05:51:55 +0000 (06:51 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Mar 2022 02:40:01 +0000 (19:40 -0700)
blkcg works on FS bio level, so it is reasonable to make both blkcg and
gendisk sharing same lifetime. Meantime there won't be any FS IO when
releasing disk, so safe to move blkcg initialization/destroy into disk
allocation/release handler

Long term, we can move blkcg into gendisk completely.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Link: https://lore.kernel.org/r/20220308055200.735835-10-hch@lst.de
[axboe: fixup missing blk-cgroup.h include]
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-core.c
block/blk-sysfs.c
block/genhd.c

index 4d858fc08f8ba787c5c2efa73bf5d2156a33549d..3fa2f08d3750b375481b9a7e9889098cdf7f6b02 100644 (file)
@@ -496,17 +496,12 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
                                PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
                goto fail_stats;
 
-       if (blkcg_init_queue(q))
-               goto fail_ref;
-
        blk_queue_dma_alignment(q, 511);
        blk_set_default_limits(&q->limits);
        q->nr_requests = BLKDEV_DEFAULT_RQ;
 
        return q;
 
-fail_ref:
-       percpu_ref_exit(&q->q_usage_counter);
 fail_stats:
        blk_free_queue_stats(q->stats);
 fail_split:
index 241ded62f458ff3a2dd520a88110c2e76122cb07..220085109d7f0076a580ca125c46e606d6d91dd2 100644 (file)
@@ -751,13 +751,6 @@ static void blk_exit_queue(struct request_queue *q)
                ioc_clear_queue(q);
                elevator_exit(q);
        }
-
-       /*
-        * Remove all references to @q from the block cgroup controller before
-        * restoring @q->queue_lock to avoid that restoring this pointer causes
-        * e.g. blkcg_print_blkgs() to crash.
-        */
-       blkcg_exit_queue(q);
 }
 
 /**
index 54f60ded2ee6f69fc190dab554beb81440cfbdf7..fc10aedab2099f56cf4609ede05f45826a307373 100644 (file)
@@ -29,6 +29,7 @@
 #include "blk.h"
 #include "blk-mq-sched.h"
 #include "blk-rq-qos.h"
+#include "blk-cgroup.h"
 
 static struct kobject *block_depr;
 
@@ -1120,9 +1121,12 @@ static void disk_release(struct device *dev)
 
        blk_mq_cancel_work_sync(disk->queue);
 
+       blkcg_exit_queue(disk->queue);
+
        disk_release_events(disk);
        kfree(disk->random);
        xa_destroy(&disk->part_tbl);
+
        disk->queue->disk = NULL;
        blk_put_queue(disk->queue);
 
@@ -1328,6 +1332,9 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
        if (xa_insert(&disk->part_tbl, 0, disk->part0, GFP_KERNEL))
                goto out_destroy_part_tbl;
 
+       if (blkcg_init_queue(q))
+               goto out_erase_part0;
+
        rand_initialize_disk(disk);
        disk_to_dev(disk)->class = &block_class;
        disk_to_dev(disk)->type = &disk_type;
@@ -1340,6 +1347,8 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
 #endif
        return disk;
 
+out_erase_part0:
+       xa_erase(&disk->part_tbl, 0);
 out_destroy_part_tbl:
        xa_destroy(&disk->part_tbl);
        disk->part0->bd_disk = NULL;