Skip to content

Commit

Permalink
block: move blkcg initialization/destroy into disk allocation/release…
Browse files Browse the repository at this point in the history
… 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>
  • Loading branch information
Ming Lei authored and axboe committed Mar 9, 2022
1 parent 01d0c69 commit 1059699
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 12 deletions.
5 changes: 0 additions & 5 deletions block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
7 changes: 0 additions & 7 deletions block/blk-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand Down
9 changes: 9 additions & 0 deletions block/genhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 1059699

Please sign in to comment.