Commit 1059699f authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

block: move blkcg initialization/destroy into disk allocation/release handler



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: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Reviewed-by: default avatarChaitanya 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: default avatarJens Axboe <axboe@kernel.dk>
parent 01d0c698
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -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:
+0 −7
Original line number Diff line number Diff line
@@ -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);
}

/**
+9 −0
Original line number Diff line number Diff line
@@ -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;