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: 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>
This commit is contained in:
parent
01d0c69853
commit
1059699f87
|
@ -496,17 +496,12 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
|
||||||
PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
|
PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
|
||||||
goto fail_stats;
|
goto fail_stats;
|
||||||
|
|
||||||
if (blkcg_init_queue(q))
|
|
||||||
goto fail_ref;
|
|
||||||
|
|
||||||
blk_queue_dma_alignment(q, 511);
|
blk_queue_dma_alignment(q, 511);
|
||||||
blk_set_default_limits(&q->limits);
|
blk_set_default_limits(&q->limits);
|
||||||
q->nr_requests = BLKDEV_DEFAULT_RQ;
|
q->nr_requests = BLKDEV_DEFAULT_RQ;
|
||||||
|
|
||||||
return q;
|
return q;
|
||||||
|
|
||||||
fail_ref:
|
|
||||||
percpu_ref_exit(&q->q_usage_counter);
|
|
||||||
fail_stats:
|
fail_stats:
|
||||||
blk_free_queue_stats(q->stats);
|
blk_free_queue_stats(q->stats);
|
||||||
fail_split:
|
fail_split:
|
||||||
|
|
|
@ -751,13 +751,6 @@ static void blk_exit_queue(struct request_queue *q)
|
||||||
ioc_clear_queue(q);
|
ioc_clear_queue(q);
|
||||||
elevator_exit(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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "blk.h"
|
#include "blk.h"
|
||||||
#include "blk-mq-sched.h"
|
#include "blk-mq-sched.h"
|
||||||
#include "blk-rq-qos.h"
|
#include "blk-rq-qos.h"
|
||||||
|
#include "blk-cgroup.h"
|
||||||
|
|
||||||
static struct kobject *block_depr;
|
static struct kobject *block_depr;
|
||||||
|
|
||||||
|
@ -1120,9 +1121,12 @@ static void disk_release(struct device *dev)
|
||||||
|
|
||||||
blk_mq_cancel_work_sync(disk->queue);
|
blk_mq_cancel_work_sync(disk->queue);
|
||||||
|
|
||||||
|
blkcg_exit_queue(disk->queue);
|
||||||
|
|
||||||
disk_release_events(disk);
|
disk_release_events(disk);
|
||||||
kfree(disk->random);
|
kfree(disk->random);
|
||||||
xa_destroy(&disk->part_tbl);
|
xa_destroy(&disk->part_tbl);
|
||||||
|
|
||||||
disk->queue->disk = NULL;
|
disk->queue->disk = NULL;
|
||||||
blk_put_queue(disk->queue);
|
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))
|
if (xa_insert(&disk->part_tbl, 0, disk->part0, GFP_KERNEL))
|
||||||
goto out_destroy_part_tbl;
|
goto out_destroy_part_tbl;
|
||||||
|
|
||||||
|
if (blkcg_init_queue(q))
|
||||||
|
goto out_erase_part0;
|
||||||
|
|
||||||
rand_initialize_disk(disk);
|
rand_initialize_disk(disk);
|
||||||
disk_to_dev(disk)->class = &block_class;
|
disk_to_dev(disk)->class = &block_class;
|
||||||
disk_to_dev(disk)->type = &disk_type;
|
disk_to_dev(disk)->type = &disk_type;
|
||||||
|
@ -1340,6 +1347,8 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
|
||||||
#endif
|
#endif
|
||||||
return disk;
|
return disk;
|
||||||
|
|
||||||
|
out_erase_part0:
|
||||||
|
xa_erase(&disk->part_tbl, 0);
|
||||||
out_destroy_part_tbl:
|
out_destroy_part_tbl:
|
||||||
xa_destroy(&disk->part_tbl);
|
xa_destroy(&disk->part_tbl);
|
||||||
disk->part0->bd_disk = NULL;
|
disk->part0->bd_disk = NULL;
|
||||||
|
|
Loading…
Reference in New Issue