dm-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers
@ 2021-06-02  6:53 Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 01/30] blk-mq: factor out a blk_mq_alloc_sq_tag_set helper Christoph Hellwig
                   ` (31 more replies)
  0 siblings, 32 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Hi all,

this series is the scond part of cleaning up lifetimes and allocation of
the gendisk and request_queue structure.  It adds a new interface to
allocate the disk and queue together for blk based drivers, and uses that
in all drivers that do not have any caveats in their gendisk and
request_queue lifetime rules.

Diffstat:
 block/blk-mq.c                      |   91 +++++++++++++++-------------------
 block/blk.h                         |    1 
 block/elevator.c                    |    2 
 drivers/block/amiflop.c             |   16 +-----
 drivers/block/aoe/aoeblk.c          |   33 ++++--------
 drivers/block/aoe/aoedev.c          |    3 -
 drivers/block/ataflop.c             |   16 +-----
 drivers/block/floppy.c              |   20 +------
 drivers/block/loop.c                |   19 ++-----
 drivers/block/nbd.c                 |   53 +++++++------------
 drivers/block/null_blk/main.c       |   11 +---
 drivers/block/paride/pcd.c          |   19 +++----
 drivers/block/paride/pd.c           |   30 ++++-------
 drivers/block/paride/pf.c           |   18 ++----
 drivers/block/ps3disk.c             |   36 +++++--------
 drivers/block/rbd.c                 |   52 ++++++-------------
 drivers/block/rnbd/rnbd-clt.c       |   35 +++----------
 drivers/block/sunvdc.c              |   47 ++++-------------
 drivers/block/swim.c                |   34 +++++-------
 drivers/block/swim3.c               |   33 +++++-------
 drivers/block/sx8.c                 |   23 ++------
 drivers/block/virtio_blk.c          |   26 ++-------
 drivers/block/xen-blkfront.c        |   96 ++++++++++++++----------------------
 drivers/block/z2ram.c               |   15 +----
 drivers/cdrom/gdrom.c               |   45 +++++++---------
 drivers/md/dm-rq.c                  |    9 +--
 drivers/memstick/core/ms_block.c    |   25 +++------
 drivers/memstick/core/mspro_block.c |   26 ++++-----
 drivers/mtd/mtd_blkdevs.c           |   48 ++++++++----------
 drivers/mtd/ubi/block.c             |   68 ++++++++++---------------
 drivers/s390/block/scm_blk.c        |   21 ++-----
 include/linux/blk-mq.h              |   24 ++++++---
 include/linux/elevator.h            |    1 
 33 files changed, 386 insertions(+), 610 deletions(-)

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 01/30] blk-mq: factor out a blk_mq_alloc_sq_tag_set helper
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 02/30] blk-mq: improve the blk_mq_init_allocated_queue interface Christoph Hellwig
                   ` (30 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Factour out a helper to initialize a simple single hw queue tag_set from
blk_mq_init_sq_queue.  This will allow to phase out blk_mq_init_sq_queue
in favor of a more symmetric and general API.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/blk-mq.c         | 32 ++++++++++++++++++--------------
 include/linux/blk-mq.h |  3 +++
 2 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index f11d4018ce2e..eaacfa963a73 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -3152,24 +3152,12 @@ struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
 	struct request_queue *q;
 	int ret;
 
-	memset(set, 0, sizeof(*set));
-	set->ops = ops;
-	set->nr_hw_queues = 1;
-	set->nr_maps = 1;
-	set->queue_depth = queue_depth;
-	set->numa_node = NUMA_NO_NODE;
-	set->flags = set_flags;
-
-	ret = blk_mq_alloc_tag_set(set);
+	ret = blk_mq_alloc_sq_tag_set(set, ops, queue_depth, set_flags);
 	if (ret)
 		return ERR_PTR(ret);
-
 	q = blk_mq_init_queue(set);
-	if (IS_ERR(q)) {
+	if (IS_ERR(q))
 		blk_mq_free_tag_set(set);
-		return q;
-	}
-
 	return q;
 }
 EXPORT_SYMBOL(blk_mq_init_sq_queue);
@@ -3589,6 +3577,22 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
 }
 EXPORT_SYMBOL(blk_mq_alloc_tag_set);
 
+/* allocate and initialize a tagset for a simple single-queue device */
+int blk_mq_alloc_sq_tag_set(struct blk_mq_tag_set *set,
+		const struct blk_mq_ops *ops, unsigned int queue_depth,
+		unsigned int set_flags)
+{
+	memset(set, 0, sizeof(*set));
+	set->ops = ops;
+	set->nr_hw_queues = 1;
+	set->nr_maps = 1;
+	set->queue_depth = queue_depth;
+	set->numa_node = NUMA_NO_NODE;
+	set->flags = set_flags;
+	return blk_mq_alloc_tag_set(set);
+}
+EXPORT_SYMBOL_GPL(blk_mq_alloc_sq_tag_set);
+
 void blk_mq_free_tag_set(struct blk_mq_tag_set *set)
 {
 	int i, j;
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 359486940fa0..bb950fc669ef 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -439,6 +439,9 @@ struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
 void blk_mq_unregister_dev(struct device *, struct request_queue *);
 
 int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set);
+int blk_mq_alloc_sq_tag_set(struct blk_mq_tag_set *set,
+		const struct blk_mq_ops *ops, unsigned int queue_depth,
+		unsigned int set_flags);
 void blk_mq_free_tag_set(struct blk_mq_tag_set *set);
 
 void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 02/30] blk-mq: improve the blk_mq_init_allocated_queue interface
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 01/30] blk-mq: factor out a blk_mq_alloc_sq_tag_set helper Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 03/30] blk-mq: add the blk_mq_alloc_disk APIs Christoph Hellwig
                   ` (29 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Don't return the passed in request_queue but a normal error code, and
drop the elevator_init argument in favor of just calling elevator_init_mq
directly from dm-rq.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/blk-mq.c           | 36 ++++++++++++++----------------------
 block/blk.h              |  1 -
 block/elevator.c         |  2 +-
 drivers/md/dm-rq.c       |  9 +++------
 include/linux/blk-mq.h   |  5 ++---
 include/linux/elevator.h |  1 +
 6 files changed, 21 insertions(+), 33 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index eaacfa963a73..6112741e1ff9 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -3115,21 +3115,18 @@ void blk_mq_release(struct request_queue *q)
 struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
 		void *queuedata)
 {
-	struct request_queue *uninit_q, *q;
+	struct request_queue *q;
+	int ret;
 
-	uninit_q = blk_alloc_queue(set->numa_node);
-	if (!uninit_q)
+	q = blk_alloc_queue(set->numa_node);
+	if (!q)
 		return ERR_PTR(-ENOMEM);
-	uninit_q->queuedata = queuedata;
-
-	/*
-	 * Initialize the queue without an elevator. device_add_disk() will do
-	 * the initialization.
-	 */
-	q = blk_mq_init_allocated_queue(set, uninit_q, false);
-	if (IS_ERR(q))
-		blk_cleanup_queue(uninit_q);
-
+	q->queuedata = queuedata;
+	ret = blk_mq_init_allocated_queue(set, q);
+	if (ret) {
+		blk_cleanup_queue(q);
+		return ERR_PTR(ret);
+	}
 	return q;
 }
 EXPORT_SYMBOL_GPL(blk_mq_init_queue_data);
@@ -3273,9 +3270,8 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
 	mutex_unlock(&q->sysfs_lock);
 }
 
-struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
-						  struct request_queue *q,
-						  bool elevator_init)
+int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
+		struct request_queue *q)
 {
 	/* mark the queue as mq asap */
 	q->mq_ops = set->ops;
@@ -3325,11 +3321,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
 	blk_mq_init_cpu_queues(q, set->nr_hw_queues);
 	blk_mq_add_queue_tag_set(set, q);
 	blk_mq_map_swqueue(q);
-
-	if (elevator_init)
-		elevator_init_mq(q);
-
-	return q;
+	return 0;
 
 err_hctxs:
 	kfree(q->queue_hw_ctx);
@@ -3340,7 +3332,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
 	q->poll_cb = NULL;
 err_exit:
 	q->mq_ops = NULL;
-	return ERR_PTR(-ENOMEM);
+	return -ENOMEM;
 }
 EXPORT_SYMBOL(blk_mq_init_allocated_queue);
 
diff --git a/block/blk.h b/block/blk.h
index 3440142f029b..d3fa47af3607 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -192,7 +192,6 @@ void blk_account_io_done(struct request *req, u64 now);
 
 void blk_insert_flush(struct request *rq);
 
-void elevator_init_mq(struct request_queue *q);
 int elevator_switch_mq(struct request_queue *q,
 			      struct elevator_type *new_e);
 void __elevator_exit(struct request_queue *, struct elevator_queue *);
diff --git a/block/elevator.c b/block/elevator.c
index 440699c28119..06e203426410 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -693,7 +693,7 @@ void elevator_init_mq(struct request_queue *q)
 		elevator_put(e);
 	}
 }
-
+EXPORT_SYMBOL_GPL(elevator_init_mq); /* only for dm-rq */
 
 /*
  * switch to new_e io scheduler. be careful not to introduce deadlocks -
diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c
index 9c3bc3711b33..0dbd48cbdff9 100644
--- a/drivers/md/dm-rq.c
+++ b/drivers/md/dm-rq.c
@@ -530,7 +530,6 @@ static const struct blk_mq_ops dm_mq_ops = {
 
 int dm_mq_init_request_queue(struct mapped_device *md, struct dm_table *t)
 {
-	struct request_queue *q;
 	struct dm_target *immutable_tgt;
 	int err;
 
@@ -557,12 +556,10 @@ int dm_mq_init_request_queue(struct mapped_device *md, struct dm_table *t)
 	if (err)
 		goto out_kfree_tag_set;
 
-	q = blk_mq_init_allocated_queue(md->tag_set, md->queue, true);
-	if (IS_ERR(q)) {
-		err = PTR_ERR(q);
+	err = blk_mq_init_allocated_queue(md->tag_set, md->queue);
+	if (err)
 		goto out_tag_set;
-	}
-
+	elevator_init_mq(md->queue);
 	return 0;
 
 out_tag_set:
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index bb950fc669ef..73750b2838d2 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -429,9 +429,8 @@ enum {
 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
 struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
 		void *queuedata);
-struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
-						  struct request_queue *q,
-						  bool elevator_init);
+int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
+		struct request_queue *q);
 struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
 						const struct blk_mq_ops *ops,
 						unsigned int queue_depth,
diff --git a/include/linux/elevator.h b/include/linux/elevator.h
index dcb2f9022c1d..783ecb3cb77a 100644
--- a/include/linux/elevator.h
+++ b/include/linux/elevator.h
@@ -120,6 +120,7 @@ extern void elv_merged_request(struct request_queue *, struct request *,
 extern bool elv_attempt_insert_merge(struct request_queue *, struct request *);
 extern struct request *elv_former_request(struct request_queue *, struct request *);
 extern struct request *elv_latter_request(struct request_queue *, struct request *);
+void elevator_init_mq(struct request_queue *q);
 
 /*
  * io scheduler registration
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 03/30] blk-mq: add the blk_mq_alloc_disk APIs
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 01/30] blk-mq: factor out a blk_mq_alloc_sq_tag_set helper Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 02/30] blk-mq: improve the blk_mq_init_allocated_queue interface Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-03  0:03   ` Chaitanya Kulkarni
  2021-06-02  6:53 ` [dm-devel] [PATCH 04/30] virtio-blk: use blk_mq_alloc_disk Christoph Hellwig
                   ` (28 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Add a new API to allocate a gendisk including the request_queue for use
with blk-mq based drivers.  This is to avoid boilerplate code in drivers.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/blk-mq.c         | 19 +++++++++++++++++++
 include/linux/blk-mq.h | 12 ++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 6112741e1ff9..1e6036e6fd66 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -3137,6 +3137,25 @@ struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set)
 }
 EXPORT_SYMBOL(blk_mq_init_queue);
 
+struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata)
+{
+	struct request_queue *q;
+	struct gendisk *disk;
+
+	q = blk_mq_init_queue_data(set, queuedata);
+	if (IS_ERR(q))
+		return ERR_CAST(q);
+
+	disk = __alloc_disk_node(0, set->numa_node);
+	if (!disk) {
+		blk_cleanup_queue(q);
+		return ERR_PTR(-ENOMEM);
+	}
+	disk->queue = q;
+	return disk;
+}
+EXPORT_SYMBOL(__blk_mq_alloc_disk);
+
 /*
  * Helper for setting up a queue with mq ops, given queue depth, and
  * the passed in mq ops flags.
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 73750b2838d2..f496c6c5b5d2 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -426,6 +426,18 @@ enum {
 	((policy & ((1 << BLK_MQ_F_ALLOC_POLICY_BITS) - 1)) \
 		<< BLK_MQ_F_ALLOC_POLICY_START_BIT)
 
+#define blk_mq_alloc_disk(set, queuedata)				\
+({									\
+	static struct lock_class_key __key;				\
+	struct gendisk *__disk = __blk_mq_alloc_disk(set, queuedata);	\
+									\
+	if (__disk)							\
+		lockdep_init_map(&__disk->lockdep_map,			\
+			"(bio completion)", &__key, 0);			\
+	__disk;								\
+})
+struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set,
+		void *queuedata);
 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
 struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
 		void *queuedata);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 04/30] virtio-blk: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (2 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 03/30] blk-mq: add the blk_mq_alloc_disk APIs Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 05/30] pcd: " Christoph Hellwig
                   ` (27 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/virtio_blk.c | 26 +++++++-------------------
 1 file changed, 7 insertions(+), 19 deletions(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index b9fa3ef5b57c..e4bd3b1fc3c2 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -749,13 +749,6 @@ static int virtblk_probe(struct virtio_device *vdev)
 	if (err)
 		goto out_free_vblk;
 
-	/* FIXME: How many partitions?  How long is a piece of string? */
-	vblk->disk = alloc_disk(1 << PART_BITS);
-	if (!vblk->disk) {
-		err = -ENOMEM;
-		goto out_free_vq;
-	}
-
 	/* Default queue sizing is to fill the ring. */
 	if (likely(!virtblk_queue_depth)) {
 		queue_depth = vblk->vqs[0].vq->num_free;
@@ -779,21 +772,20 @@ static int virtblk_probe(struct virtio_device *vdev)
 
 	err = blk_mq_alloc_tag_set(&vblk->tag_set);
 	if (err)
-		goto out_put_disk;
+		goto out_free_vq;
 
-	q = blk_mq_init_queue(&vblk->tag_set);
-	if (IS_ERR(q)) {
-		err = -ENOMEM;
+	vblk->disk = blk_mq_alloc_disk(&vblk->tag_set, vblk);
+	if (IS_ERR(vblk->disk)) {
+		err = PTR_ERR(vblk->disk);
 		goto out_free_tags;
 	}
-	vblk->disk->queue = q;
-
-	q->queuedata = vblk;
+	q = vblk->disk->queue;
 
 	virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN);
 
 	vblk->disk->major = major;
 	vblk->disk->first_minor = index_to_minor(index);
+	vblk->disk->minors = 1 << PART_BITS;
 	vblk->disk->private_data = vblk;
 	vblk->disk->fops = &virtblk_fops;
 	vblk->disk->flags |= GENHD_FL_EXT_DEVT;
@@ -892,8 +884,6 @@ static int virtblk_probe(struct virtio_device *vdev)
 
 out_free_tags:
 	blk_mq_free_tag_set(&vblk->tag_set);
-out_put_disk:
-	put_disk(vblk->disk);
 out_free_vq:
 	vdev->config->del_vqs(vdev);
 	kfree(vblk->vqs);
@@ -913,8 +903,7 @@ static void virtblk_remove(struct virtio_device *vdev)
 	flush_work(&vblk->config_work);
 
 	del_gendisk(vblk->disk);
-	blk_cleanup_queue(vblk->disk->queue);
-
+	blk_cleanup_disk(vblk->disk);
 	blk_mq_free_tag_set(&vblk->tag_set);
 
 	mutex_lock(&vblk->vdev_mutex);
@@ -925,7 +914,6 @@ static void virtblk_remove(struct virtio_device *vdev)
 	/* Virtqueues are stopped, nothing can use vblk->vdev anymore. */
 	vblk->vdev = NULL;
 
-	put_disk(vblk->disk);
 	vdev->config->del_vqs(vdev);
 	kfree(vblk->vqs);
 
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 05/30] pcd: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (3 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 04/30] virtio-blk: use blk_mq_alloc_disk Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 06/30] pf: " Christoph Hellwig
                   ` (26 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/paride/pcd.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c
index 70da8b86ce58..f9cdd11f02f5 100644
--- a/drivers/block/paride/pcd.c
+++ b/drivers/block/paride/pcd.c
@@ -309,21 +309,19 @@ static void pcd_init_units(void)
 
 	pcd_drive_count = 0;
 	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
-		struct gendisk *disk = alloc_disk(1);
+		struct gendisk *disk;
 
-		if (!disk)
+		if (blk_mq_alloc_sq_tag_set(&cd->tag_set, &pcd_mq_ops, 1,
+				BLK_MQ_F_SHOULD_MERGE))
 			continue;
 
-		disk->queue = blk_mq_init_sq_queue(&cd->tag_set, &pcd_mq_ops,
-						   1, BLK_MQ_F_SHOULD_MERGE);
-		if (IS_ERR(disk->queue)) {
-			disk->queue = NULL;
-			put_disk(disk);
+		disk = blk_mq_alloc_disk(&cd->tag_set, cd);
+		if (IS_ERR(disk)) {
+			blk_mq_free_tag_set(&cd->tag_set);
 			continue;
 		}
 
 		INIT_LIST_HEAD(&cd->rq_list);
-		disk->queue->queuedata = cd;
 		blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
 		cd->disk = disk;
 		cd->pi = &cd->pia;
@@ -343,6 +341,7 @@ static void pcd_init_units(void)
 		cd->info.mask = 0;
 		disk->major = major;
 		disk->first_minor = unit;
+		disk->minors = 1;
 		strcpy(disk->disk_name, cd->name);	/* umm... */
 		disk->fops = &pcd_bdops;
 		disk->flags = GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE;
@@ -759,10 +758,8 @@ static int pcd_detect(void)
 	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
 		if (!cd->disk)
 			continue;
-		blk_cleanup_queue(cd->disk->queue);
-		cd->disk->queue = NULL;
+		blk_cleanup_disk(cd->disk);
 		blk_mq_free_tag_set(&cd->tag_set);
-		put_disk(cd->disk);
 	}
 	pi_unregister_driver(par_drv);
 	return -1;
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 06/30] pf: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (4 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 05/30] pcd: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 07/30] ms_block: " Christoph Hellwig
                   ` (25 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/paride/pf.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c
index bb09f21ce21a..d5b9c88ba76f 100644
--- a/drivers/block/paride/pf.c
+++ b/drivers/block/paride/pf.c
@@ -294,20 +294,17 @@ static void __init pf_init_units(void)
 	for (unit = 0, pf = units; unit < PF_UNITS; unit++, pf++) {
 		struct gendisk *disk;
 
-		disk = alloc_disk(1);
-		if (!disk)
+		if (blk_mq_alloc_sq_tag_set(&pf->tag_set, &pf_mq_ops, 1,
+				BLK_MQ_F_SHOULD_MERGE))
 			continue;
 
-		disk->queue = blk_mq_init_sq_queue(&pf->tag_set, &pf_mq_ops,
-							1, BLK_MQ_F_SHOULD_MERGE);
-		if (IS_ERR(disk->queue)) {
-			disk->queue = NULL;
-			put_disk(disk);
+		disk = blk_mq_alloc_disk(&pf->tag_set, pf);
+		if (IS_ERR(disk)) {
+			blk_mq_free_tag_set(&pf->tag_set);
 			continue;
 		}
 
 		INIT_LIST_HEAD(&pf->rq_list);
-		disk->queue->queuedata = pf;
 		blk_queue_max_segments(disk->queue, cluster);
 		blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
 		pf->disk = disk;
@@ -318,6 +315,7 @@ static void __init pf_init_units(void)
 		snprintf(pf->name, PF_NAMELEN, "%s%d", name, unit);
 		disk->major = major;
 		disk->first_minor = unit;
+		disk->minors = 1;
 		strcpy(disk->disk_name, pf->name);
 		disk->fops = &pf_fops;
 		disk->events = DISK_EVENT_MEDIA_CHANGE;
@@ -766,10 +764,8 @@ static int pf_detect(void)
 	for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
 		if (!pf->disk)
 			continue;
-		blk_cleanup_queue(pf->disk->queue);
-		pf->disk->queue = NULL;
+		blk_cleanup_disk(pf->disk);
 		blk_mq_free_tag_set(&pf->tag_set);
-		put_disk(pf->disk);
 	}
 	pi_unregister_driver(par_drv);
 	return -1;
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 07/30] ms_block: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (5 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 06/30] pf: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-03 15:36   ` Ulf Hansson
  2021-06-02  6:53 ` [dm-devel] [PATCH 08/30] mspro: " Christoph Hellwig
                   ` (24 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/memstick/core/ms_block.c | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c
index 0bacf4268f83..dac258d12aca 100644
--- a/drivers/memstick/core/ms_block.c
+++ b/drivers/memstick/core/ms_block.c
@@ -2110,21 +2110,17 @@ static int msb_init_disk(struct memstick_dev *card)
 	if (msb->disk_id  < 0)
 		return msb->disk_id;
 
-	msb->disk = alloc_disk(0);
-	if (!msb->disk) {
-		rc = -ENOMEM;
+	rc = blk_mq_alloc_sq_tag_set(&msb->tag_set, &msb_mq_ops, 2,
+				     BLK_MQ_F_SHOULD_MERGE);
+	if (rc)
 		goto out_release_id;
-	}
 
-	msb->queue = blk_mq_init_sq_queue(&msb->tag_set, &msb_mq_ops, 2,
-						BLK_MQ_F_SHOULD_MERGE);
-	if (IS_ERR(msb->queue)) {
-		rc = PTR_ERR(msb->queue);
-		msb->queue = NULL;
-		goto out_put_disk;
+	msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
+	if (IS_ERR(msb->disk)) {
+		rc = PTR_ERR(msb->disk);
+		goto out_free_tag_set;
 	}
-
-	msb->queue->queuedata = card;
+	msb->queue = msb->disk->queue;
 
 	blk_queue_max_hw_sectors(msb->queue, MS_BLOCK_MAX_PAGES);
 	blk_queue_max_segments(msb->queue, MS_BLOCK_MAX_SEGS);
@@ -2135,7 +2131,6 @@ static int msb_init_disk(struct memstick_dev *card)
 	sprintf(msb->disk->disk_name, "msblk%d", msb->disk_id);
 	msb->disk->fops = &msb_bdops;
 	msb->disk->private_data = msb;
-	msb->disk->queue = msb->queue;
 
 	capacity = msb->pages_in_block * msb->logical_block_count;
 	capacity *= (msb->page_size / 512);
@@ -2155,8 +2150,8 @@ static int msb_init_disk(struct memstick_dev *card)
 	dbg("Disk added");
 	return 0;
 
-out_put_disk:
-	put_disk(msb->disk);
+out_free_tag_set:
+	blk_mq_free_tag_set(&msb->tag_set);
 out_release_id:
 	mutex_lock(&msb_disk_lock);
 	idr_remove(&msb_disk_idr, msb->disk_id);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 08/30] mspro: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (6 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 07/30] ms_block: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-03 15:36   ` Ulf Hansson
  2021-06-02  6:53 ` [dm-devel] [PATCH 09/30] mtd_blkdevs: " Christoph Hellwig
                   ` (23 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/memstick/core/mspro_block.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
index cf7fe0d58ee7..22778d0e24f5 100644
--- a/drivers/memstick/core/mspro_block.c
+++ b/drivers/memstick/core/mspro_block.c
@@ -1205,21 +1205,17 @@ static int mspro_block_init_disk(struct memstick_dev *card)
 	if (disk_id < 0)
 		return disk_id;
 
-	msb->disk = alloc_disk(1 << MSPRO_BLOCK_PART_SHIFT);
-	if (!msb->disk) {
-		rc = -ENOMEM;
+	rc = blk_mq_alloc_sq_tag_set(&msb->tag_set, &mspro_mq_ops, 2,
+				     BLK_MQ_F_SHOULD_MERGE);
+	if (rc)
 		goto out_release_id;
-	}
 
-	msb->queue = blk_mq_init_sq_queue(&msb->tag_set, &mspro_mq_ops, 2,
-						BLK_MQ_F_SHOULD_MERGE);
-	if (IS_ERR(msb->queue)) {
-		rc = PTR_ERR(msb->queue);
-		msb->queue = NULL;
-		goto out_put_disk;
+	msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
+	if (IS_ERR(msb->disk)) {
+		rc = PTR_ERR(msb->disk);
+		goto out_free_tag_set;
 	}
-
-	msb->queue->queuedata = card;
+	msb->queue = msb->disk->queue;
 
 	blk_queue_max_hw_sectors(msb->queue, MSPRO_BLOCK_MAX_PAGES);
 	blk_queue_max_segments(msb->queue, MSPRO_BLOCK_MAX_SEGS);
@@ -1228,10 +1224,10 @@ static int mspro_block_init_disk(struct memstick_dev *card)
 
 	msb->disk->major = major;
 	msb->disk->first_minor = disk_id << MSPRO_BLOCK_PART_SHIFT;
+	msb->disk->minors = 1 << MSPRO_BLOCK_PART_SHIFT;
 	msb->disk->fops = &ms_block_bdops;
 	msb->usage_count = 1;
 	msb->disk->private_data = msb;
-	msb->disk->queue = msb->queue;
 
 	sprintf(msb->disk->disk_name, "mspblk%d", disk_id);
 
@@ -1247,8 +1243,8 @@ static int mspro_block_init_disk(struct memstick_dev *card)
 	msb->active = 1;
 	return 0;
 
-out_put_disk:
-	put_disk(msb->disk);
+out_free_tag_set:
+	blk_mq_free_tag_set(&msb->tag_set);
 out_release_id:
 	mutex_lock(&mspro_block_disk_lock);
 	idr_remove(&mspro_block_disk_idr, disk_id);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 09/30] mtd_blkdevs: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (7 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 08/30] mspro: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
       [not found]   ` <CGME20210615154746eucas1p1321b6f1cf38d21899632e132cf025e61@eucas1p1.samsung.com>
  2021-06-02  6:53 ` [dm-devel] [PATCH 10/30] ps3disk: " Christoph Hellwig
                   ` (22 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/mtd/mtd_blkdevs.c | 48 ++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 26 deletions(-)

diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index fb8e12d590a1..5dc4c966ea73 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -30,11 +30,9 @@ static void blktrans_dev_release(struct kref *kref)
 	struct mtd_blktrans_dev *dev =
 		container_of(kref, struct mtd_blktrans_dev, ref);
 
-	dev->disk->private_data = NULL;
-	blk_cleanup_queue(dev->rq);
+	blk_cleanup_disk(dev->disk);
 	blk_mq_free_tag_set(dev->tag_set);
 	kfree(dev->tag_set);
-	put_disk(dev->disk);
 	list_del(&dev->list);
 	kfree(dev);
 }
@@ -354,7 +352,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
 	if (new->devnum > (MINORMASK >> tr->part_bits) ||
 	    (tr->part_bits && new->devnum >= 27 * 26)) {
 		mutex_unlock(&blktrans_ref_mutex);
-		goto error1;
+		return ret;
 	}
 
 	list_add_tail(&new->list, &tr->devs);
@@ -366,17 +364,28 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
 	if (!tr->writesect)
 		new->readonly = 1;
 
-	/* Create gendisk */
 	ret = -ENOMEM;
-	gd = alloc_disk(1 << tr->part_bits);
+	new->tag_set = kzalloc(sizeof(*new->tag_set), GFP_KERNEL);
+	if (!new->tag_set)
+		goto out_list_del;
 
-	if (!gd)
-		goto error2;
+	ret = blk_mq_alloc_sq_tag_set(new->tag_set, &mtd_mq_ops, 2,
+			BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
+	if (ret)
+		goto out_kfree_tag_set;
+
+	/* Create gendisk */
+	gd = blk_mq_alloc_disk(new->tag_set, new);
+	if (IS_ERR(gd)) {
+		ret = PTR_ERR(gd);
+		goto out_free_tag_set;
+	}
 
 	new->disk = gd;
 	gd->private_data = new;
 	gd->major = tr->major;
 	gd->first_minor = (new->devnum) << tr->part_bits;
+	gd->minors = 1 << tr->part_bits;
 	gd->fops = &mtd_block_ops;
 
 	if (tr->part_bits)
@@ -398,22 +407,9 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
 	spin_lock_init(&new->queue_lock);
 	INIT_LIST_HEAD(&new->rq_list);
 
-	new->tag_set = kzalloc(sizeof(*new->tag_set), GFP_KERNEL);
-	if (!new->tag_set)
-		goto error3;
-
-	new->rq = blk_mq_init_sq_queue(new->tag_set, &mtd_mq_ops, 2,
-				BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
-	if (IS_ERR(new->rq)) {
-		ret = PTR_ERR(new->rq);
-		new->rq = NULL;
-		goto error4;
-	}
-
 	if (tr->flush)
 		blk_queue_write_cache(new->rq, true, false);
 
-	new->rq->queuedata = new;
 	blk_queue_logical_block_size(new->rq, tr->blksize);
 
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, new->rq);
@@ -437,13 +433,13 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
 		WARN_ON(ret);
 	}
 	return 0;
-error4:
+
+out_free_tag_set:
+	blk_mq_free_tag_set(new->tag_set);
+out_kfree_tag_set:
 	kfree(new->tag_set);
-error3:
-	put_disk(new->disk);
-error2:
+out_list_del:
 	list_del(&new->list);
-error1:
 	return ret;
 }
 
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 10/30] ps3disk: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (8 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 09/30] mtd_blkdevs: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-06 15:58   ` Geoff Levand
  2021-06-02  6:53 ` [dm-devel] [PATCH 11/30] swim3: " Christoph Hellwig
                   ` (21 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/ps3disk.c | 36 ++++++++++++++----------------------
 1 file changed, 14 insertions(+), 22 deletions(-)

diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c
index ba3ece56cbb3..f374ea2c67ce 100644
--- a/drivers/block/ps3disk.c
+++ b/drivers/block/ps3disk.c
@@ -29,7 +29,6 @@
 
 struct ps3disk_private {
 	spinlock_t lock;		/* Request queue spinlock */
-	struct request_queue *queue;
 	struct blk_mq_tag_set tag_set;
 	struct gendisk *gendisk;
 	unsigned int blocking_factor;
@@ -267,7 +266,7 @@ static irqreturn_t ps3disk_interrupt(int irq, void *data)
 	blk_mq_end_request(req, error);
 	spin_unlock(&priv->lock);
 
-	blk_mq_run_hw_queues(priv->queue, true);
+	blk_mq_run_hw_queues(priv->gendisk->queue, true);
 	return IRQ_HANDLED;
 }
 
@@ -441,17 +440,20 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
 
 	ps3disk_identify(dev);
 
-	queue = blk_mq_init_sq_queue(&priv->tag_set, &ps3disk_mq_ops, 1,
+	error = blk_mq_alloc_sq_tag_set(&priv->tag_set, &ps3disk_mq_ops, 1,
 					BLK_MQ_F_SHOULD_MERGE);
-	if (IS_ERR(queue)) {
-		dev_err(&dev->sbd.core, "%s:%u: blk_mq_init_queue failed\n",
-			__func__, __LINE__);
-		error = PTR_ERR(queue);
+	if (error)
 		goto fail_teardown;
+
+	gendisk = blk_mq_alloc_disk(&priv->tag_set, dev);
+	if (IS_ERR(gendisk)) {
+		dev_err(&dev->sbd.core, "%s:%u: blk_mq_alloc_disk failed\n",
+			__func__, __LINE__);
+		error = PTR_ERR(gendisk);
+		goto fail_free_tag_set;
 	}
 
-	priv->queue = queue;
-	queue->queuedata = dev;
+	queue = gendisk->queue;
 
 	blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9);
 	blk_queue_dma_alignment(queue, dev->blk_size-1);
@@ -462,19 +464,11 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
 	blk_queue_max_segments(queue, -1);
 	blk_queue_max_segment_size(queue, dev->bounce_size);
 
-	gendisk = alloc_disk(PS3DISK_MINORS);
-	if (!gendisk) {
-		dev_err(&dev->sbd.core, "%s:%u: alloc_disk failed\n", __func__,
-			__LINE__);
-		error = -ENOMEM;
-		goto fail_cleanup_queue;
-	}
-
 	priv->gendisk = gendisk;
 	gendisk->major = ps3disk_major;
 	gendisk->first_minor = devidx * PS3DISK_MINORS;
+	gendisk->minors = PS3DISK_MINORS;
 	gendisk->fops = &ps3disk_fops;
-	gendisk->queue = queue;
 	gendisk->private_data = dev;
 	snprintf(gendisk->disk_name, sizeof(gendisk->disk_name), PS3DISK_NAME,
 		 devidx+'a');
@@ -490,8 +484,7 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
 	device_add_disk(&dev->sbd.core, gendisk, NULL);
 	return 0;
 
-fail_cleanup_queue:
-	blk_cleanup_queue(queue);
+fail_free_tag_set:
 	blk_mq_free_tag_set(&priv->tag_set);
 fail_teardown:
 	ps3stor_teardown(dev);
@@ -517,9 +510,8 @@ static void ps3disk_remove(struct ps3_system_bus_device *_dev)
 		    &ps3disk_mask);
 	mutex_unlock(&ps3disk_mask_mutex);
 	del_gendisk(priv->gendisk);
-	blk_cleanup_queue(priv->queue);
+	blk_cleanup_disk(priv->gendisk);
 	blk_mq_free_tag_set(&priv->tag_set);
-	put_disk(priv->gendisk);
 	dev_notice(&dev->sbd.core, "Synchronizing disk cache\n");
 	ps3disk_sync_cache(dev);
 	ps3stor_teardown(dev);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 11/30] swim3: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (9 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 10/30] ps3disk: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 12/30] swim: " Christoph Hellwig
                   ` (20 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/swim3.c | 33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c
index a515d0c1d2cb..965af0a3e95b 100644
--- a/drivers/block/swim3.c
+++ b/drivers/block/swim3.c
@@ -1202,30 +1202,27 @@ static int swim3_attach(struct macio_dev *mdev,
 			return rc;
 	}
 
-	disk = alloc_disk(1);
-	if (disk == NULL) {
-		rc = -ENOMEM;
-		goto out_unregister;
-	}
-
 	fs = &floppy_states[floppy_count];
 	memset(fs, 0, sizeof(*fs));
 
-	disk->queue = blk_mq_init_sq_queue(&fs->tag_set, &swim3_mq_ops, 2,
-						BLK_MQ_F_SHOULD_MERGE);
-	if (IS_ERR(disk->queue)) {
-		rc = PTR_ERR(disk->queue);
-		disk->queue = NULL;
-		goto out_put_disk;
+	rc = blk_mq_alloc_sq_tag_set(&fs->tag_set, &swim3_mq_ops, 2,
+			BLK_MQ_F_SHOULD_MERGE);
+	if (rc)
+		goto out_unregister;
+
+	disk = blk_mq_alloc_disk(&fs->tag_set, fs);
+	if (IS_ERR(disk)) {
+		rc = PTR_ERR(disk);
+		goto out_free_tag_set;
 	}
-	disk->queue->queuedata = fs;
 
 	rc = swim3_add_device(mdev, floppy_count);
 	if (rc)
-		goto out_cleanup_queue;
+		goto out_cleanup_disk;
 
 	disk->major = FLOPPY_MAJOR;
 	disk->first_minor = floppy_count;
+	disk->minors = 1;
 	disk->fops = &floppy_fops;
 	disk->private_data = fs;
 	disk->events = DISK_EVENT_MEDIA_CHANGE;
@@ -1237,12 +1234,10 @@ static int swim3_attach(struct macio_dev *mdev,
 	disks[floppy_count++] = disk;
 	return 0;
 
-out_cleanup_queue:
-	blk_cleanup_queue(disk->queue);
-	disk->queue = NULL;
+out_cleanup_disk:
+	blk_cleanup_disk(disk);
+out_free_tag_set:
 	blk_mq_free_tag_set(&fs->tag_set);
-out_put_disk:
-	put_disk(disk);
 out_unregister:
 	if (floppy_count == 0)
 		unregister_blkdev(FLOPPY_MAJOR, "fd");
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 12/30] swim: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (10 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 11/30] swim3: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 13/30] sunvdc: " Christoph Hellwig
                   ` (19 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/swim.c | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/drivers/block/swim.c b/drivers/block/swim.c
index 2917b21f48ff..7ccc8d2a41bc 100644
--- a/drivers/block/swim.c
+++ b/drivers/block/swim.c
@@ -800,23 +800,20 @@ static int swim_floppy_init(struct swim_priv *swd)
 	spin_lock_init(&swd->lock);
 
 	for (drive = 0; drive < swd->floppy_count; drive++) {
-		struct request_queue *q;
-
-		swd->unit[drive].disk = alloc_disk(1);
-		if (swd->unit[drive].disk == NULL) {
-			err = -ENOMEM;
+		err = blk_mq_alloc_sq_tag_set(&swd->unit[drive].tag_set,
+				&swim_mq_ops, 2, BLK_MQ_F_SHOULD_MERGE);
+		if (err)
 			goto exit_put_disks;
-		}
 
-		q = blk_mq_init_sq_queue(&swd->unit[drive].tag_set, &swim_mq_ops,
-						2, BLK_MQ_F_SHOULD_MERGE);
-		if (IS_ERR(q)) {
-			err = PTR_ERR(q);
+		swd->unit[drive].disk =
+			blk_mq_alloc_disk(&swd->unit[drive].tag_set,
+					  &swd->unit[drive]);
+		if (IS_ERR(swd->unit[drive].disk)) {
+			blk_mq_free_tag_set(&swd->unit[drive].tag_set);
+			err = PTR_ERR(swd->unit[drive].disk);
 			goto exit_put_disks;
 		}
 
-		swd->unit[drive].disk->queue = q;
-		swd->unit[drive].disk->queue->queuedata = &swd->unit[drive];
 		swd->unit[drive].swd = swd;
 	}
 
@@ -824,6 +821,7 @@ static int swim_floppy_init(struct swim_priv *swd)
 		swd->unit[drive].disk->flags = GENHD_FL_REMOVABLE;
 		swd->unit[drive].disk->major = FLOPPY_MAJOR;
 		swd->unit[drive].disk->first_minor = drive;
+		swd->unit[drive].disk->minors = 1;
 		sprintf(swd->unit[drive].disk->disk_name, "fd%d", drive);
 		swd->unit[drive].disk->fops = &floppy_fops;
 		swd->unit[drive].disk->events = DISK_EVENT_MEDIA_CHANGE;
@@ -839,14 +837,10 @@ static int swim_floppy_init(struct swim_priv *swd)
 	do {
 		struct gendisk *disk = swd->unit[drive].disk;
 
-		if (disk) {
-			if (disk->queue) {
-				blk_cleanup_queue(disk->queue);
-				disk->queue = NULL;
-			}
-			blk_mq_free_tag_set(&swd->unit[drive].tag_set);
-			put_disk(disk);
-		}
+		if (!disk)
+			continue;
+		blk_cleanup_disk(disk);
+		blk_mq_free_tag_set(&swd->unit[drive].tag_set);
 	} while (drive--);
 	return err;
 }
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 13/30] sunvdc: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (11 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 12/30] swim: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 14/30] gdrom: " Christoph Hellwig
                   ` (18 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/sunvdc.c | 47 ++++++++++++------------------------------
 1 file changed, 13 insertions(+), 34 deletions(-)

diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
index 39aeebc6837d..c53b38578bb7 100644
--- a/drivers/block/sunvdc.c
+++ b/drivers/block/sunvdc.c
@@ -780,27 +780,6 @@ static const struct blk_mq_ops vdc_mq_ops = {
 	.queue_rq	= vdc_queue_rq,
 };
 
-static void cleanup_queue(struct request_queue *q)
-{
-	struct vdc_port *port = q->queuedata;
-
-	blk_cleanup_queue(q);
-	blk_mq_free_tag_set(&port->tag_set);
-}
-
-static struct request_queue *init_queue(struct vdc_port *port)
-{
-	struct request_queue *q;
-
-	q = blk_mq_init_sq_queue(&port->tag_set, &vdc_mq_ops, VDC_TX_RING_SIZE,
-					BLK_MQ_F_SHOULD_MERGE);
-	if (IS_ERR(q))
-		return q;
-
-	q->queuedata = port;
-	return q;
-}
-
 static int probe_disk(struct vdc_port *port)
 {
 	struct request_queue *q;
@@ -838,21 +817,21 @@ static int probe_disk(struct vdc_port *port)
 				    (u64)geom.num_sec);
 	}
 
-	q = init_queue(port);
-	if (IS_ERR(q)) {
-		printk(KERN_ERR PFX "%s: Could not allocate queue.\n",
-		       port->vio.name);
-		return PTR_ERR(q);
-	}
-	g = alloc_disk(1 << PARTITION_SHIFT);
-	if (!g) {
+	err = blk_mq_alloc_sq_tag_set(&port->tag_set, &vdc_mq_ops,
+			VDC_TX_RING_SIZE, BLK_MQ_F_SHOULD_MERGE);
+	if (err)
+		return err;
+
+	g = blk_mq_alloc_disk(&port->tag_set, port);
+	if (IS_ERR(g)) {
 		printk(KERN_ERR PFX "%s: Could not allocate gendisk.\n",
 		       port->vio.name);
-		cleanup_queue(q);
-		return -ENOMEM;
+		blk_mq_free_tag_set(&port->tag_set);
+		return PTR_ERR(g);
 	}
 
 	port->disk = g;
+	q = g->queue;
 
 	/* Each segment in a request is up to an aligned page in size. */
 	blk_queue_segment_boundary(q, PAGE_SIZE - 1);
@@ -862,6 +841,7 @@ static int probe_disk(struct vdc_port *port)
 	blk_queue_max_hw_sectors(q, port->max_xfer_size);
 	g->major = vdc_major;
 	g->first_minor = port->vio.vdev->dev_no << PARTITION_SHIFT;
+	g->minors = 1 << PARTITION_SHIFT;
 	strcpy(g->disk_name, port->disk_name);
 
 	g->fops = &vdc_fops;
@@ -1083,9 +1063,8 @@ static int vdc_port_remove(struct vio_dev *vdev)
 		del_timer_sync(&port->vio.timer);
 
 		del_gendisk(port->disk);
-		cleanup_queue(port->disk->queue);
-		put_disk(port->disk);
-		port->disk = NULL;
+		blk_cleanup_disk(port->disk);
+		blk_mq_free_tag_set(&port->tag_set);
 
 		vdc_free_tx_ring(port);
 		vio_ldc_free(&port->vio);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 14/30] gdrom: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (12 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 13/30] sunvdc: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 15/30] blk-mq: remove blk_mq_init_sq_queue Christoph Hellwig
                   ` (17 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/cdrom/gdrom.c | 45 ++++++++++++++++++++-----------------------
 1 file changed, 21 insertions(+), 24 deletions(-)

diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index c6d8c0f59722..8e1fe75af93f 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -772,53 +772,50 @@ static int probe_gdrom(struct platform_device *devptr)
 		goto probe_fail_no_mem;
 	}
 	probe_gdrom_setupcd();
-	gd.disk = alloc_disk(1);
-	if (!gd.disk) {
-		err = -ENODEV;
-		goto probe_fail_no_disk;
+
+	err = blk_mq_alloc_sq_tag_set(&gd.tag_set, &gdrom_mq_ops, 1,
+				BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
+	if (err)
+		goto probe_fail_free_cd_info;
+
+	gd.disk = blk_mq_alloc_disk(&gd.tag_set, NULL);
+	if (IS_ERR(gd.disk)) {
+		err = PTR_ERR(gd.disk);
+		goto probe_fail_free_tag_set;
 	}
+	gd.gdrom_rq = gd.disk->queue;
 	probe_gdrom_setupdisk();
 	if (register_cdrom(gd.disk, gd.cd_info)) {
 		err = -ENODEV;
-		goto probe_fail_cdrom_register;
+		goto probe_fail_cleanup_disk;
 	}
 	gd.disk->fops = &gdrom_bdops;
 	gd.disk->events = DISK_EVENT_MEDIA_CHANGE;
 	/* latch on to the interrupt */
 	err = gdrom_set_interrupt_handlers();
 	if (err)
-		goto probe_fail_cmdirq_register;
-
-	gd.gdrom_rq = blk_mq_init_sq_queue(&gd.tag_set, &gdrom_mq_ops, 1,
-				BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
-	if (IS_ERR(gd.gdrom_rq)) {
-		err = PTR_ERR(gd.gdrom_rq);
-		gd.gdrom_rq = NULL;
-		goto probe_fail_requestq;
-	}
+		goto probe_fail_cleanup_disk;
 
 	err = probe_gdrom_setupqueue();
 	if (err)
-		goto probe_fail_toc;
+		goto probe_fail_free_irqs;
 
 	gd.toc = kzalloc(sizeof(struct gdromtoc), GFP_KERNEL);
 	if (!gd.toc) {
 		err = -ENOMEM;
-		goto probe_fail_toc;
+		goto probe_fail_free_irqs;
 	}
 	add_disk(gd.disk);
 	return 0;
 
-probe_fail_toc:
-	blk_cleanup_queue(gd.gdrom_rq);
-	blk_mq_free_tag_set(&gd.tag_set);
-probe_fail_requestq:
+probe_fail_free_irqs:
 	free_irq(HW_EVENT_GDROM_DMA, &gd);
 	free_irq(HW_EVENT_GDROM_CMD, &gd);
-probe_fail_cmdirq_register:
-probe_fail_cdrom_register:
-	del_gendisk(gd.disk);
-probe_fail_no_disk:
+probe_fail_cleanup_disk:
+	blk_cleanup_disk(gd.disk);
+probe_fail_free_tag_set:
+	blk_mq_free_tag_set(&gd.tag_set);
+probe_fail_free_cd_info:
 	kfree(gd.cd_info);
 probe_fail_no_mem:
 	unregister_blkdev(gdrom_major, GDROM_DEV_NAME);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 15/30] blk-mq: remove blk_mq_init_sq_queue
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (13 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 14/30] gdrom: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-03  0:04   ` Chaitanya Kulkarni
  2021-06-02  6:53 ` [dm-devel] [PATCH 16/30] aoe: use blk_mq_alloc_disk and blk_cleanup_disk Christoph Hellwig
                   ` (16 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

All users are gone now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/blk-mq.c         | 22 ----------------------
 include/linux/blk-mq.h |  4 ----
 2 files changed, 26 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 1e6036e6fd66..25e25177c2b1 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -3156,28 +3156,6 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata)
 }
 EXPORT_SYMBOL(__blk_mq_alloc_disk);
 
-/*
- * Helper for setting up a queue with mq ops, given queue depth, and
- * the passed in mq ops flags.
- */
-struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
-					   const struct blk_mq_ops *ops,
-					   unsigned int queue_depth,
-					   unsigned int set_flags)
-{
-	struct request_queue *q;
-	int ret;
-
-	ret = blk_mq_alloc_sq_tag_set(set, ops, queue_depth, set_flags);
-	if (ret)
-		return ERR_PTR(ret);
-	q = blk_mq_init_queue(set);
-	if (IS_ERR(q))
-		blk_mq_free_tag_set(set);
-	return q;
-}
-EXPORT_SYMBOL(blk_mq_init_sq_queue);
-
 static struct blk_mq_hw_ctx *blk_mq_alloc_and_init_hctx(
 		struct blk_mq_tag_set *set, struct request_queue *q,
 		int hctx_idx, int node)
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index f496c6c5b5d2..02a4aab0aeac 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -443,10 +443,6 @@ struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
 		void *queuedata);
 int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
 		struct request_queue *q);
-struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
-						const struct blk_mq_ops *ops,
-						unsigned int queue_depth,
-						unsigned int set_flags);
 void blk_mq_unregister_dev(struct device *, struct request_queue *);
 
 int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 16/30] aoe: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (14 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 15/30] blk-mq: remove blk_mq_init_sq_queue Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 17/30] floppy: " Christoph Hellwig
                   ` (15 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/aoe/aoeblk.c | 33 ++++++++++++---------------------
 drivers/block/aoe/aoedev.c |  3 +--
 2 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c
index c34e71b0c4a9..06b360f7123a 100644
--- a/drivers/block/aoe/aoeblk.c
+++ b/drivers/block/aoe/aoeblk.c
@@ -338,14 +338,13 @@ static const struct blk_mq_ops aoeblk_mq_ops = {
 	.queue_rq	= aoeblk_queue_rq,
 };
 
-/* alloc_disk and add_disk can sleep */
+/* blk_mq_alloc_disk and add_disk can sleep */
 void
 aoeblk_gdalloc(void *vp)
 {
 	struct aoedev *d = vp;
 	struct gendisk *gd;
 	mempool_t *mp;
-	struct request_queue *q;
 	struct blk_mq_tag_set *set;
 	ulong flags;
 	int late = 0;
@@ -362,19 +361,12 @@ aoeblk_gdalloc(void *vp)
 	if (late)
 		return;
 
-	gd = alloc_disk(AOE_PARTITIONS);
-	if (gd == NULL) {
-		pr_err("aoe: cannot allocate disk structure for %ld.%d\n",
-			d->aoemajor, d->aoeminor);
-		goto err;
-	}
-
 	mp = mempool_create(MIN_BUFS, mempool_alloc_slab, mempool_free_slab,
 		buf_pool_cache);
 	if (mp == NULL) {
 		printk(KERN_ERR "aoe: cannot allocate bufpool for %ld.%d\n",
 			d->aoemajor, d->aoeminor);
-		goto err_disk;
+		goto err;
 	}
 
 	set = &d->tag_set;
@@ -391,12 +383,11 @@ aoeblk_gdalloc(void *vp)
 		goto err_mempool;
 	}
 
-	q = blk_mq_init_queue(set);
-	if (IS_ERR(q)) {
+	gd = blk_mq_alloc_disk(set, d);
+	if (IS_ERR(gd)) {
 		pr_err("aoe: cannot allocate block queue for %ld.%d\n",
 			d->aoemajor, d->aoeminor);
-		blk_mq_free_tag_set(set);
-		goto err_mempool;
+		goto err_tagset;
 	}
 
 	spin_lock_irqsave(&d->lock, flags);
@@ -405,16 +396,16 @@ aoeblk_gdalloc(void *vp)
 	WARN_ON(d->flags & DEVFL_TKILL);
 	WARN_ON(d->gd);
 	WARN_ON(d->flags & DEVFL_UP);
-	blk_queue_max_hw_sectors(q, BLK_DEF_MAX_SECTORS);
-	blk_queue_io_opt(q, SZ_2M);
+	blk_queue_max_hw_sectors(gd->queue, BLK_DEF_MAX_SECTORS);
+	blk_queue_io_opt(gd->queue, SZ_2M);
 	d->bufpool = mp;
-	d->blkq = gd->queue = q;
-	q->queuedata = d;
+	d->blkq = gd->queue;
 	d->gd = gd;
 	if (aoe_maxsectors)
-		blk_queue_max_hw_sectors(q, aoe_maxsectors);
+		blk_queue_max_hw_sectors(gd->queue, aoe_maxsectors);
 	gd->major = AOE_MAJOR;
 	gd->first_minor = d->sysminor;
+	gd->minors = AOE_PARTITIONS;
 	gd->fops = &aoe_bdops;
 	gd->private_data = d;
 	set_capacity(gd, d->ssize);
@@ -435,10 +426,10 @@ aoeblk_gdalloc(void *vp)
 	spin_unlock_irqrestore(&d->lock, flags);
 	return;
 
+err_tagset:
+	blk_mq_free_tag_set(set);
 err_mempool:
 	mempool_destroy(mp);
-err_disk:
-	put_disk(gd);
 err:
 	spin_lock_irqsave(&d->lock, flags);
 	d->flags &= ~DEVFL_GD_NOW;
diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c
index e2ea2356da06..c5753c6bfe80 100644
--- a/drivers/block/aoe/aoedev.c
+++ b/drivers/block/aoe/aoedev.c
@@ -277,9 +277,8 @@ freedev(struct aoedev *d)
 	if (d->gd) {
 		aoedisk_rm_debugfs(d);
 		del_gendisk(d->gd);
-		put_disk(d->gd);
+		blk_cleanup_disk(d->gd);
 		blk_mq_free_tag_set(&d->tag_set);
-		blk_cleanup_queue(d->blkq);
 	}
 	t = d->targets;
 	e = t + d->ntargets;
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 17/30] floppy: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (15 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 16/30] aoe: use blk_mq_alloc_disk and blk_cleanup_disk Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 18/30] loop: " Christoph Hellwig
                   ` (14 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/floppy.c | 20 +++++---------------
 1 file changed, 5 insertions(+), 15 deletions(-)

diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 8a9d22207c59..cbed9776f285 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4491,23 +4491,15 @@ static bool floppy_available(int drive)
 static int floppy_alloc_disk(unsigned int drive, unsigned int type)
 {
 	struct gendisk *disk;
-	int err;
-
-	disk = alloc_disk(1);
-	if (!disk)
-		return -ENOMEM;
 
-	disk->queue = blk_mq_init_queue(&tag_sets[drive]);
-	if (IS_ERR(disk->queue)) {
-		err = PTR_ERR(disk->queue);
-		disk->queue = NULL;
-		put_disk(disk);
-		return err;
-	}
+	disk = blk_mq_alloc_disk(&tag_sets[drive], NULL);
+	if (IS_ERR(disk))
+		return PTR_ERR(disk);
 
 	blk_queue_max_hw_sectors(disk->queue, 64);
 	disk->major = FLOPPY_MAJOR;
 	disk->first_minor = TOMINOR(drive) | (type << 2);
+	disk->minors = 1;
 	disk->fops = &floppy_fops;
 	disk->events = DISK_EVENT_MEDIA_CHANGE;
 	if (type)
@@ -4727,10 +4719,8 @@ static int __init do_floppy_init(void)
 		if (!disks[drive][0])
 			break;
 		del_timer_sync(&motor_off_timer[drive]);
-		blk_cleanup_queue(disks[drive][0]->queue);
-		disks[drive][0]->queue = NULL;
+		blk_cleanup_disk(disks[drive][0]);
 		blk_mq_free_tag_set(&tag_sets[drive]);
-		put_disk(disks[drive][0]);
 	}
 	return err;
 }
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 18/30] loop: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (16 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 17/30] floppy: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-03  0:05   ` Chaitanya Kulkarni
  2021-06-02  6:53 ` [dm-devel] [PATCH 19/30] nbd: " Christoph Hellwig
                   ` (13 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/loop.c | 19 ++++++-------------
 1 file changed, 6 insertions(+), 13 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 95c570f5923f..3f40e673a101 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -2117,12 +2117,12 @@ static int loop_add(struct loop_device **l, int i)
 	if (err)
 		goto out_free_idr;
 
-	lo->lo_queue = blk_mq_init_queue(&lo->tag_set);
-	if (IS_ERR(lo->lo_queue)) {
-		err = PTR_ERR(lo->lo_queue);
+	disk = lo->lo_disk = blk_mq_alloc_disk(&lo->tag_set, lo);
+	if (IS_ERR(disk)) {
+		err = PTR_ERR(disk);
 		goto out_cleanup_tags;
 	}
-	lo->lo_queue->queuedata = lo;
+	lo->lo_queue = lo->lo_disk->queue;
 
 	blk_queue_max_hw_sectors(lo->lo_queue, BLK_DEF_MAX_SECTORS);
 
@@ -2134,11 +2134,6 @@ static int loop_add(struct loop_device **l, int i)
 	 */
 	blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);
 
-	err = -ENOMEM;
-	disk = lo->lo_disk = alloc_disk(1 << part_shift);
-	if (!disk)
-		goto out_free_queue;
-
 	/*
 	 * Disable partition scanning by default. The in-kernel partition
 	 * scanning can be requested individually per-device during its
@@ -2166,6 +2161,7 @@ static int loop_add(struct loop_device **l, int i)
 	spin_lock_init(&lo->lo_lock);
 	disk->major		= LOOP_MAJOR;
 	disk->first_minor	= i << part_shift;
+	disk->minors		= 1 << part_shift;
 	disk->fops		= &lo_fops;
 	disk->private_data	= lo;
 	disk->queue		= lo->lo_queue;
@@ -2174,8 +2170,6 @@ static int loop_add(struct loop_device **l, int i)
 	*l = lo;
 	return lo->lo_number;
 
-out_free_queue:
-	blk_cleanup_queue(lo->lo_queue);
 out_cleanup_tags:
 	blk_mq_free_tag_set(&lo->tag_set);
 out_free_idr:
@@ -2189,9 +2183,8 @@ static int loop_add(struct loop_device **l, int i)
 static void loop_remove(struct loop_device *lo)
 {
 	del_gendisk(lo->lo_disk);
-	blk_cleanup_queue(lo->lo_queue);
 	blk_mq_free_tag_set(&lo->tag_set);
-	put_disk(lo->lo_disk);
+	blk_cleanup_disk(lo->lo_disk);
 	mutex_destroy(&lo->lo_mutex);
 	kfree(lo);
 }
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 19/30] nbd: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (17 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 18/30] loop: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk Christoph Hellwig
                   ` (12 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/nbd.c | 53 ++++++++++++++++++---------------------------
 1 file changed, 21 insertions(+), 32 deletions(-)

diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 45d2c28c8fc8..614d82e7fae4 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -219,15 +219,11 @@ static const struct device_attribute pid_attr = {
 static void nbd_dev_remove(struct nbd_device *nbd)
 {
 	struct gendisk *disk = nbd->disk;
-	struct request_queue *q;
 
 	if (disk) {
-		q = disk->queue;
 		del_gendisk(disk);
-		blk_cleanup_queue(q);
 		blk_mq_free_tag_set(&nbd->tag_set);
-		disk->private_data = NULL;
-		put_disk(disk);
+		blk_cleanup_disk(disk);
 	}
 
 	/*
@@ -1646,15 +1642,24 @@ static int nbd_dev_add(int index)
 {
 	struct nbd_device *nbd;
 	struct gendisk *disk;
-	struct request_queue *q;
 	int err = -ENOMEM;
 
 	nbd = kzalloc(sizeof(struct nbd_device), GFP_KERNEL);
 	if (!nbd)
 		goto out;
 
-	disk = alloc_disk(1 << part_shift);
-	if (!disk)
+	nbd->tag_set.ops = &nbd_mq_ops;
+	nbd->tag_set.nr_hw_queues = 1;
+	nbd->tag_set.queue_depth = 128;
+	nbd->tag_set.numa_node = NUMA_NO_NODE;
+	nbd->tag_set.cmd_size = sizeof(struct nbd_cmd);
+	nbd->tag_set.flags = BLK_MQ_F_SHOULD_MERGE |
+		BLK_MQ_F_BLOCKING;
+	nbd->tag_set.driver_data = nbd;
+	nbd->destroy_complete = NULL;
+
+	err = blk_mq_alloc_tag_set(&nbd->tag_set);
+	if (err)
 		goto out_free_nbd;
 
 	if (index >= 0) {
@@ -1668,30 +1673,15 @@ static int nbd_dev_add(int index)
 			index = err;
 	}
 	if (err < 0)
-		goto out_free_disk;
-
+		goto out_free_tags;
 	nbd->index = index;
-	nbd->disk = disk;
-	nbd->tag_set.ops = &nbd_mq_ops;
-	nbd->tag_set.nr_hw_queues = 1;
-	nbd->tag_set.queue_depth = 128;
-	nbd->tag_set.numa_node = NUMA_NO_NODE;
-	nbd->tag_set.cmd_size = sizeof(struct nbd_cmd);
-	nbd->tag_set.flags = BLK_MQ_F_SHOULD_MERGE |
-		BLK_MQ_F_BLOCKING;
-	nbd->tag_set.driver_data = nbd;
-	nbd->destroy_complete = NULL;
 
-	err = blk_mq_alloc_tag_set(&nbd->tag_set);
-	if (err)
+	disk = blk_mq_alloc_disk(&nbd->tag_set, NULL);
+	if (IS_ERR(disk)) {
+		err = PTR_ERR(disk);
 		goto out_free_idr;
-
-	q = blk_mq_init_queue(&nbd->tag_set);
-	if (IS_ERR(q)) {
-		err = PTR_ERR(q);
-		goto out_free_tags;
 	}
-	disk->queue = q;
+	nbd->disk = disk;
 
 	/*
 	 * Tell the block layer that we are not a rotational device
@@ -1712,6 +1702,7 @@ static int nbd_dev_add(int index)
 	INIT_LIST_HEAD(&nbd->list);
 	disk->major = NBD_MAJOR;
 	disk->first_minor = index << part_shift;
+	disk->minors = 1 << part_shift;
 	disk->fops = &nbd_fops;
 	disk->private_data = nbd;
 	sprintf(disk->disk_name, "nbd%d", index);
@@ -1719,12 +1710,10 @@ static int nbd_dev_add(int index)
 	nbd_total_devices++;
 	return index;
 
-out_free_tags:
-	blk_mq_free_tag_set(&nbd->tag_set);
 out_free_idr:
 	idr_remove(&nbd_index_idr, index);
-out_free_disk:
-	put_disk(disk);
+out_free_tags:
+	blk_mq_free_tag_set(&nbd->tag_set);
 out_free_nbd:
 	kfree(nbd);
 out:
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (18 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 19/30] nbd: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-03  0:10   ` Chaitanya Kulkarni
  2021-06-02  6:53 ` [dm-devel] [PATCH 21/30] pd: use blk_mq_alloc_disk and blk_cleanup_disk Christoph Hellwig
                   ` (11 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/null_blk/main.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c
index d8e098f1e5b5..74fb2ec63219 100644
--- a/drivers/block/null_blk/main.c
+++ b/drivers/block/null_blk/main.c
@@ -1851,13 +1851,12 @@ static int null_add_dev(struct nullb_device *dev)
 
 		rv = -ENOMEM;
 		nullb->tag_set->timeout = 5 * HZ;
-		nullb->q = blk_mq_init_queue_data(nullb->tag_set, nullb);
-		if (IS_ERR(nullb->q))
-			goto out_cleanup_tags;
-		nullb->disk = alloc_disk_node(1, nullb->dev->home_node);
-		if (!nullb->disk)
+		nullb->disk = blk_mq_alloc_disk(nullb->tag_set, nullb);
+		if (IS_ERR(nullb->disk)) {
+			rv = PTR_ERR(nullb->disk);
 			goto out_cleanup_disk;
-		nullb->disk->queue = nullb->q;
+		}
+		nullb->q = nullb->disk->queue;
 	} else if (dev->queue_mode == NULL_Q_BIO) {
 		rv = -ENOMEM;
 		nullb->disk = blk_alloc_disk(nullb->dev->home_node);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 21/30] pd: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (19 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 22/30] rbd: " Christoph Hellwig
                   ` (10 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/paride/pd.c | 30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c
index 828a45ffe0e7..3b2b8e872beb 100644
--- a/drivers/block/paride/pd.c
+++ b/drivers/block/paride/pd.c
@@ -879,18 +879,6 @@ static void pd_probe_drive(struct pd_unit *disk)
 {
 	struct gendisk *p;
 
-	p = alloc_disk(1 << PD_BITS);
-	if (!p)
-		return;
-
-	strcpy(p->disk_name, disk->name);
-	p->fops = &pd_fops;
-	p->major = major;
-	p->first_minor = (disk - pd) << PD_BITS;
-	p->events = DISK_EVENT_MEDIA_CHANGE;
-	disk->gd = p;
-	p->private_data = disk;
-
 	memset(&disk->tag_set, 0, sizeof(disk->tag_set));
 	disk->tag_set.ops = &pd_mq_ops;
 	disk->tag_set.cmd_size = sizeof(struct pd_req);
@@ -903,14 +891,21 @@ static void pd_probe_drive(struct pd_unit *disk)
 	if (blk_mq_alloc_tag_set(&disk->tag_set))
 		return;
 
-	p->queue = blk_mq_init_queue(&disk->tag_set);
-	if (IS_ERR(p->queue)) {
+	p = blk_mq_alloc_disk(&disk->tag_set, disk);
+	if (!p) {
 		blk_mq_free_tag_set(&disk->tag_set);
-		p->queue = NULL;
 		return;
 	}
+	disk->gd = p;
+
+	strcpy(p->disk_name, disk->name);
+	p->fops = &pd_fops;
+	p->major = major;
+	p->first_minor = (disk - pd) << PD_BITS;
+	p->minors = 1 << PD_BITS;
+	p->events = DISK_EVENT_MEDIA_CHANGE;
+	p->private_data = disk;
 
-	p->queue->queuedata = disk;
 	blk_queue_max_hw_sectors(p->queue, cluster);
 	blk_queue_bounce_limit(p->queue, BLK_BOUNCE_HIGH);
 
@@ -1019,9 +1014,8 @@ static void __exit pd_exit(void)
 		if (p) {
 			disk->gd = NULL;
 			del_gendisk(p);
-			blk_cleanup_queue(p->queue);
 			blk_mq_free_tag_set(&disk->tag_set);
-			put_disk(p);
+			blk_cleanup_disk(p);
 			pi_release(disk->pi);
 		}
 	}
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 22/30] rbd: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (20 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 21/30] pd: use blk_mq_alloc_disk and blk_cleanup_disk Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 23/30] rnbd: " Christoph Hellwig
                   ` (9 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/rbd.c | 52 ++++++++++++++++-----------------------------
 1 file changed, 18 insertions(+), 34 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index bbb88eb009e0..531d390902dd 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4750,9 +4750,8 @@ static blk_status_t rbd_queue_rq(struct blk_mq_hw_ctx *hctx,
 
 static void rbd_free_disk(struct rbd_device *rbd_dev)
 {
-	blk_cleanup_queue(rbd_dev->disk->queue);
+	blk_cleanup_disk(rbd_dev->disk);
 	blk_mq_free_tag_set(&rbd_dev->tag_set);
-	put_disk(rbd_dev->disk);
 	rbd_dev->disk = NULL;
 }
 
@@ -4922,22 +4921,6 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
 	    rbd_dev->layout.object_size * rbd_dev->layout.stripe_count;
 	int err;
 
-	/* create gendisk info */
-	disk = alloc_disk(single_major ?
-			  (1 << RBD_SINGLE_MAJOR_PART_SHIFT) :
-			  RBD_MINORS_PER_MAJOR);
-	if (!disk)
-		return -ENOMEM;
-
-	snprintf(disk->disk_name, sizeof(disk->disk_name), RBD_DRV_NAME "%d",
-		 rbd_dev->dev_id);
-	disk->major = rbd_dev->major;
-	disk->first_minor = rbd_dev->minor;
-	if (single_major)
-		disk->flags |= GENHD_FL_EXT_DEVT;
-	disk->fops = &rbd_bd_ops;
-	disk->private_data = rbd_dev;
-
 	memset(&rbd_dev->tag_set, 0, sizeof(rbd_dev->tag_set));
 	rbd_dev->tag_set.ops = &rbd_mq_ops;
 	rbd_dev->tag_set.queue_depth = rbd_dev->opts->queue_depth;
@@ -4948,13 +4931,26 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
 
 	err = blk_mq_alloc_tag_set(&rbd_dev->tag_set);
 	if (err)
-		goto out_disk;
+		return err;
 
-	q = blk_mq_init_queue(&rbd_dev->tag_set);
-	if (IS_ERR(q)) {
-		err = PTR_ERR(q);
+	disk = blk_mq_alloc_disk(&rbd_dev->tag_set, rbd_dev);
+	if (IS_ERR(disk)) {
+		err = PTR_ERR(disk);
 		goto out_tag_set;
 	}
+	q = disk->queue;
+
+	snprintf(disk->disk_name, sizeof(disk->disk_name), RBD_DRV_NAME "%d",
+		 rbd_dev->dev_id);
+	disk->major = rbd_dev->major;
+	disk->first_minor = rbd_dev->minor;
+	if (single_major) {
+		disk->minors = (1 << RBD_SINGLE_MAJOR_PART_SHIFT);
+		disk->flags |= GENHD_FL_EXT_DEVT;
+	} else {
+		disk->minors = RBD_MINORS_PER_MAJOR;
+	}
+	disk->fops = &rbd_bd_ops;
 
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
 	/* QUEUE_FLAG_ADD_RANDOM is off by default for blk-mq */
@@ -4976,21 +4972,11 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
 	if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC))
 		blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, q);
 
-	/*
-	 * disk_release() expects a queue ref from add_disk() and will
-	 * put it.  Hold an extra ref until add_disk() is called.
-	 */
-	WARN_ON(!blk_get_queue(q));
-	disk->queue = q;
-	q->queuedata = rbd_dev;
-
 	rbd_dev->disk = disk;
 
 	return 0;
 out_tag_set:
 	blk_mq_free_tag_set(&rbd_dev->tag_set);
-out_disk:
-	put_disk(disk);
 	return err;
 }
 
@@ -7088,8 +7074,6 @@ static ssize_t do_rbd_add(struct bus_type *bus,
 		goto err_out_image_lock;
 
 	device_add_disk(&rbd_dev->dev, rbd_dev->disk, NULL);
-	/* see rbd_init_disk() */
-	blk_put_queue(rbd_dev->disk->queue);
 
 	spin_lock(&rbd_dev_list_lock);
 	list_add_tail(&rbd_dev->node, &rbd_dev_list);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 23/30] rnbd: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (21 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 22/30] rbd: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  7:49   ` Jinpu Wang
  2021-06-02  6:53 ` [dm-devel] [PATCH 24/30] sx8: " Christoph Hellwig
                   ` (8 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/rnbd/rnbd-clt.c | 35 ++++++++---------------------------
 1 file changed, 8 insertions(+), 27 deletions(-)

diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
index c604a402cd5c..f4fa45d24c0b 100644
--- a/drivers/block/rnbd/rnbd-clt.c
+++ b/drivers/block/rnbd/rnbd-clt.c
@@ -1353,18 +1353,6 @@ static void rnbd_init_mq_hw_queues(struct rnbd_clt_dev *dev)
 	}
 }
 
-static int setup_mq_dev(struct rnbd_clt_dev *dev)
-{
-	dev->queue = blk_mq_init_queue(&dev->sess->tag_set);
-	if (IS_ERR(dev->queue)) {
-		rnbd_clt_err(dev, "Initializing multiqueue queue failed, err: %ld\n",
-			      PTR_ERR(dev->queue));
-		return PTR_ERR(dev->queue);
-	}
-	rnbd_init_mq_hw_queues(dev);
-	return 0;
-}
-
 static void setup_request_queue(struct rnbd_clt_dev *dev)
 {
 	blk_queue_logical_block_size(dev->queue, dev->logical_block_size);
@@ -1393,13 +1381,13 @@ static void setup_request_queue(struct rnbd_clt_dev *dev)
 	blk_queue_io_opt(dev->queue, dev->sess->max_io_size);
 	blk_queue_virt_boundary(dev->queue, SZ_4K - 1);
 	blk_queue_write_cache(dev->queue, dev->wc, dev->fua);
-	dev->queue->queuedata = dev;
 }
 
 static void rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
 {
 	dev->gd->major		= rnbd_client_major;
 	dev->gd->first_minor	= idx << RNBD_PART_BITS;
+	dev->gd->minors		= 1 << RNBD_PART_BITS;
 	dev->gd->fops		= &rnbd_client_ops;
 	dev->gd->queue		= dev->queue;
 	dev->gd->private_data	= dev;
@@ -1426,24 +1414,18 @@ static void rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
 
 static int rnbd_client_setup_device(struct rnbd_clt_dev *dev)
 {
-	int err, idx = dev->clt_device_id;
+	int idx = dev->clt_device_id;
 
 	dev->size = dev->nsectors * dev->logical_block_size;
 
-	err = setup_mq_dev(dev);
-	if (err)
-		return err;
+	dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev);
+	if (IS_ERR(dev->gd))
+		return PTR_ERR(dev->gd);
+	dev->queue = dev->gd->queue;
+	rnbd_init_mq_hw_queues(dev);
 
 	setup_request_queue(dev);
-
-	dev->gd = alloc_disk_node(1 << RNBD_PART_BITS,	NUMA_NO_NODE);
-	if (!dev->gd) {
-		blk_cleanup_queue(dev->queue);
-		return -ENOMEM;
-	}
-
 	rnbd_clt_setup_gen_disk(dev, idx);
-
 	return 0;
 }
 
@@ -1650,8 +1632,7 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
 static void destroy_gen_disk(struct rnbd_clt_dev *dev)
 {
 	del_gendisk(dev->gd);
-	blk_cleanup_queue(dev->queue);
-	put_disk(dev->gd);
+	blk_cleanup_disk(dev->gd);
 }
 
 static void destroy_sysfs(struct rnbd_clt_dev *dev,
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 24/30] sx8: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (22 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 23/30] rnbd: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 25/30] xen-blkfront: " Christoph Hellwig
                   ` (7 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/sx8.c | 23 +++++++----------------
 1 file changed, 7 insertions(+), 16 deletions(-)

diff --git a/drivers/block/sx8.c b/drivers/block/sx8.c
index 2cdf2771f8e8..f01f860b0e62 100644
--- a/drivers/block/sx8.c
+++ b/drivers/block/sx8.c
@@ -1343,32 +1343,25 @@ static int carm_init_disk(struct carm_host *host, unsigned int port_no)
 {
 	struct carm_port *port = &host->port[port_no];
 	struct gendisk *disk;
-	struct request_queue *q;
 
 	port->host = host;
 	port->port_no = port_no;
 
-	disk = alloc_disk(CARM_MINORS_PER_MAJOR);
-	if (!disk)
-		return -ENOMEM;
+	disk = blk_mq_alloc_disk(&host->tag_set, port);
+	if (IS_ERR(disk))
+		return PTR_ERR(disk);
 
 	port->disk = disk;
 	sprintf(disk->disk_name, DRV_NAME "/%u",
 		(unsigned int)host->id * CARM_MAX_PORTS + port_no);
 	disk->major = host->major;
 	disk->first_minor = port_no * CARM_MINORS_PER_MAJOR;
+	disk->minors = CARM_MINORS_PER_MAJOR;
 	disk->fops = &carm_bd_ops;
 	disk->private_data = port;
 
-	q = blk_mq_init_queue(&host->tag_set);
-	if (IS_ERR(q))
-		return PTR_ERR(q);
-
-	blk_queue_max_segments(q, CARM_MAX_REQ_SG);
-	blk_queue_segment_boundary(q, CARM_SG_BOUNDARY);
-
-	q->queuedata = port;
-	disk->queue = q;
+	blk_queue_max_segments(disk->queue, CARM_MAX_REQ_SG);
+	blk_queue_segment_boundary(disk->queue, CARM_SG_BOUNDARY);
 	return 0;
 }
 
@@ -1382,9 +1375,7 @@ static void carm_free_disk(struct carm_host *host, unsigned int port_no)
 
 	if (disk->flags & GENHD_FL_UP)
 		del_gendisk(disk);
-	if (disk->queue)
-		blk_cleanup_queue(disk->queue);
-	put_disk(disk);
+	blk_cleanup_disk(disk);
 }
 
 static int carm_init_shm(struct carm_host *host)
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 25/30] xen-blkfront: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (23 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 24/30] sx8: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 26/30] ubi: " Christoph Hellwig
                   ` (6 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/xen-blkfront.c | 96 +++++++++++++++---------------------
 1 file changed, 39 insertions(+), 57 deletions(-)

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index f2c1aedcdf5a..8d49f8fa98bb 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -968,48 +968,6 @@ static void blkif_set_queue_limits(struct blkfront_info *info)
 	blk_queue_dma_alignment(rq, 511);
 }
 
-static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size,
-				unsigned int physical_sector_size)
-{
-	struct request_queue *rq;
-	struct blkfront_info *info = gd->private_data;
-
-	memset(&info->tag_set, 0, sizeof(info->tag_set));
-	info->tag_set.ops = &blkfront_mq_ops;
-	info->tag_set.nr_hw_queues = info->nr_rings;
-	if (HAS_EXTRA_REQ && info->max_indirect_segments == 0) {
-		/*
-		 * When indirect descriptior is not supported, the I/O request
-		 * will be split between multiple request in the ring.
-		 * To avoid problems when sending the request, divide by
-		 * 2 the depth of the queue.
-		 */
-		info->tag_set.queue_depth =  BLK_RING_SIZE(info) / 2;
-	} else
-		info->tag_set.queue_depth = BLK_RING_SIZE(info);
-	info->tag_set.numa_node = NUMA_NO_NODE;
-	info->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
-	info->tag_set.cmd_size = sizeof(struct blkif_req);
-	info->tag_set.driver_data = info;
-
-	if (blk_mq_alloc_tag_set(&info->tag_set))
-		return -EINVAL;
-	rq = blk_mq_init_queue(&info->tag_set);
-	if (IS_ERR(rq)) {
-		blk_mq_free_tag_set(&info->tag_set);
-		return PTR_ERR(rq);
-	}
-
-	rq->queuedata = info;
-	info->rq = gd->queue = rq;
-	info->gd = gd;
-	info->sector_size = sector_size;
-	info->physical_sector_size = physical_sector_size;
-	blkif_set_queue_limits(info);
-
-	return 0;
-}
-
 static const char *flush_info(struct blkfront_info *info)
 {
 	if (info->feature_flush && info->feature_fua)
@@ -1146,12 +1104,36 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
 
 	err = xlbd_reserve_minors(minor, nr_minors);
 	if (err)
-		goto out;
+		return err;
 	err = -ENODEV;
 
-	gd = alloc_disk(nr_minors);
-	if (gd == NULL)
-		goto release;
+	memset(&info->tag_set, 0, sizeof(info->tag_set));
+	info->tag_set.ops = &blkfront_mq_ops;
+	info->tag_set.nr_hw_queues = info->nr_rings;
+	if (HAS_EXTRA_REQ && info->max_indirect_segments == 0) {
+		/*
+		 * When indirect descriptior is not supported, the I/O request
+		 * will be split between multiple request in the ring.
+		 * To avoid problems when sending the request, divide by
+		 * 2 the depth of the queue.
+		 */
+		info->tag_set.queue_depth =  BLK_RING_SIZE(info) / 2;
+	} else
+		info->tag_set.queue_depth = BLK_RING_SIZE(info);
+	info->tag_set.numa_node = NUMA_NO_NODE;
+	info->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
+	info->tag_set.cmd_size = sizeof(struct blkif_req);
+	info->tag_set.driver_data = info;
+
+	err = blk_mq_alloc_tag_set(&info->tag_set);
+	if (err)
+		goto out_release_minors;
+
+	gd = blk_mq_alloc_disk(&info->tag_set, info);
+	if (IS_ERR(gd)) {
+		err = PTR_ERR(gd);
+		goto out_free_tag_set;
+	}
 
 	strcpy(gd->disk_name, DEV_NAME);
 	ptr = encode_disk_name(gd->disk_name + sizeof(DEV_NAME) - 1, offset);
@@ -1164,14 +1146,16 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
 
 	gd->major = XENVBD_MAJOR;
 	gd->first_minor = minor;
+	gd->minors = nr_minors;
 	gd->fops = &xlvbd_block_fops;
 	gd->private_data = info;
 	set_capacity(gd, capacity);
 
-	if (xlvbd_init_blk_queue(gd, sector_size, physical_sector_size)) {
-		del_gendisk(gd);
-		goto release;
-	}
+	info->rq = gd->queue;
+	info->gd = gd;
+	info->sector_size = sector_size;
+	info->physical_sector_size = physical_sector_size;
+	blkif_set_queue_limits(info);
 
 	xlvbd_flush(info);
 
@@ -1186,9 +1170,10 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
 
 	return 0;
 
- release:
+out_free_tag_set:
+	blk_mq_free_tag_set(&info->tag_set);
+out_release_minors:
 	xlbd_release_minors(minor, nr_minors);
- out:
 	return err;
 }
 
@@ -1217,12 +1202,9 @@ static void xlvbd_release_gendisk(struct blkfront_info *info)
 	nr_minors = info->gd->minors;
 	xlbd_release_minors(minor, nr_minors);
 
-	blk_cleanup_queue(info->rq);
-	blk_mq_free_tag_set(&info->tag_set);
-	info->rq = NULL;
-
-	put_disk(info->gd);
+	blk_cleanup_disk(info->gd);
 	info->gd = NULL;
+	blk_mq_free_tag_set(&info->tag_set);
 }
 
 /* Already hold rinfo->ring_lock. */
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 26/30] ubi: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (24 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 25/30] xen-blkfront: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 27/30] scm_blk: " Christoph Hellwig
                   ` (5 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/mtd/ubi/block.c | 68 ++++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 39 deletions(-)

diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c
index e1a2ae21dfd3..e003b4b44ffa 100644
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
@@ -394,53 +394,46 @@ int ubiblock_create(struct ubi_volume_info *vi)
 	dev->vol_id = vi->vol_id;
 	dev->leb_size = vi->usable_leb_size;
 
+	dev->tag_set.ops = &ubiblock_mq_ops;
+	dev->tag_set.queue_depth = 64;
+	dev->tag_set.numa_node = NUMA_NO_NODE;
+	dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
+	dev->tag_set.cmd_size = sizeof(struct ubiblock_pdu);
+	dev->tag_set.driver_data = dev;
+	dev->tag_set.nr_hw_queues = 1;
+
+	ret = blk_mq_alloc_tag_set(&dev->tag_set);
+	if (ret) {
+		dev_err(disk_to_dev(dev->gd), "blk_mq_alloc_tag_set failed");
+		goto out_free_dev;;
+	}
+
+
 	/* Initialize the gendisk of this ubiblock device */
-	gd = alloc_disk(1);
-	if (!gd) {
-		pr_err("UBI: block: alloc_disk failed\n");
-		ret = -ENODEV;
-		goto out_free_dev;
+	gd = blk_mq_alloc_disk(&dev->tag_set, dev);
+	if (IS_ERR(gd)) {
+		ret = PTR_ERR(gd);
+		goto out_free_tags;
 	}
 
 	gd->fops = &ubiblock_ops;
 	gd->major = ubiblock_major;
+	gd->minors = 1;
 	gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, 0, 0, GFP_KERNEL);
 	if (gd->first_minor < 0) {
 		dev_err(disk_to_dev(gd),
 			"block: dynamic minor allocation failed");
 		ret = -ENODEV;
-		goto out_put_disk;
+		goto out_cleanup_disk;
 	}
 	gd->private_data = dev;
 	sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id);
 	set_capacity(gd, disk_capacity);
 	dev->gd = gd;
 
-	dev->tag_set.ops = &ubiblock_mq_ops;
-	dev->tag_set.queue_depth = 64;
-	dev->tag_set.numa_node = NUMA_NO_NODE;
-	dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
-	dev->tag_set.cmd_size = sizeof(struct ubiblock_pdu);
-	dev->tag_set.driver_data = dev;
-	dev->tag_set.nr_hw_queues = 1;
-
-	ret = blk_mq_alloc_tag_set(&dev->tag_set);
-	if (ret) {
-		dev_err(disk_to_dev(dev->gd), "blk_mq_alloc_tag_set failed");
-		goto out_remove_minor;
-	}
-
-	dev->rq = blk_mq_init_queue(&dev->tag_set);
-	if (IS_ERR(dev->rq)) {
-		dev_err(disk_to_dev(gd), "blk_mq_init_queue failed");
-		ret = PTR_ERR(dev->rq);
-		goto out_free_tags;
-	}
+	dev->rq = gd->queue;
 	blk_queue_max_segments(dev->rq, UBI_MAX_SG_COUNT);
 
-	dev->rq->queuedata = dev;
-	dev->gd->queue = dev->rq;
-
 	/*
 	 * Create one workqueue per volume (per registered block device).
 	 * Rembember workqueues are cheap, they're not threads.
@@ -448,7 +441,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
 	dev->wq = alloc_workqueue("%s", 0, 0, gd->disk_name);
 	if (!dev->wq) {
 		ret = -ENOMEM;
-		goto out_free_queue;
+		goto out_remove_minor;
 	}
 
 	list_add_tail(&dev->list, &ubiblock_devices);
@@ -460,14 +453,12 @@ int ubiblock_create(struct ubi_volume_info *vi)
 	mutex_unlock(&devices_mutex);
 	return 0;
 
-out_free_queue:
-	blk_cleanup_queue(dev->rq);
-out_free_tags:
-	blk_mq_free_tag_set(&dev->tag_set);
 out_remove_minor:
 	idr_remove(&ubiblock_minor_idr, gd->first_minor);
-out_put_disk:
-	put_disk(dev->gd);
+out_cleanup_disk:
+	blk_cleanup_disk(dev->gd);
+out_free_tags:
+	blk_mq_free_tag_set(&dev->tag_set);
 out_free_dev:
 	kfree(dev);
 out_unlock:
@@ -483,11 +474,10 @@ static void ubiblock_cleanup(struct ubiblock *dev)
 	/* Flush pending work */
 	destroy_workqueue(dev->wq);
 	/* Finally destroy the blk queue */
-	blk_cleanup_queue(dev->rq);
-	blk_mq_free_tag_set(&dev->tag_set);
 	dev_info(disk_to_dev(dev->gd), "released");
+	blk_cleanup_disk(dev->gd);
+	blk_mq_free_tag_set(&dev->tag_set);
 	idr_remove(&ubiblock_minor_idr, dev->gd->first_minor);
-	put_disk(dev->gd);
 }
 
 int ubiblock_remove(struct ubi_volume_info *vi)
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 27/30] scm_blk: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (25 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 26/30] ubi: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02 12:02   ` Niklas Schnelle
  2021-06-02  6:53 ` [dm-devel] [PATCH 28/30] amiflop: " Christoph Hellwig
                   ` (4 subsequent siblings)
  31 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/s390/block/scm_blk.c | 21 ++++++---------------
 1 file changed, 6 insertions(+), 15 deletions(-)

diff --git a/drivers/s390/block/scm_blk.c b/drivers/s390/block/scm_blk.c
index a4f6f2e62b1d..88cba6212ee2 100644
--- a/drivers/s390/block/scm_blk.c
+++ b/drivers/s390/block/scm_blk.c
@@ -462,12 +462,12 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 	if (ret)
 		goto out;
 
-	rq = blk_mq_init_queue(&bdev->tag_set);
-	if (IS_ERR(rq)) {
-		ret = PTR_ERR(rq);
+	bdev->gendisk = blk_mq_alloc_disk(&bdev->tag_set, scmdev);
+	if (IS_ERR(bdev->gendisk)) {
+		ret = PTR_ERR(bdev->gendisk);
 		goto out_tag;
 	}
-	bdev->rq = rq;
+	rq = bdev->rq = bdev->gendisk->queue;
 	nr_max_blk = min(scmdev->nr_max_block,
 			 (unsigned int) (PAGE_SIZE / sizeof(struct aidaw)));
 
@@ -477,17 +477,11 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, rq);
 	blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, rq);
 
-	bdev->gendisk = alloc_disk(SCM_NR_PARTS);
-	if (!bdev->gendisk) {
-		ret = -ENOMEM;
-		goto out_queue;
-	}
-	rq->queuedata = scmdev;
 	bdev->gendisk->private_data = scmdev;
 	bdev->gendisk->fops = &scm_blk_devops;
-	bdev->gendisk->queue = rq;
 	bdev->gendisk->major = scm_major;
 	bdev->gendisk->first_minor = devindex * SCM_NR_PARTS;
+	bdev->gendisk->minors = SCM_NR_PARTS;
 
 	len = snprintf(bdev->gendisk->disk_name, DISK_NAME_LEN, "scm");
 	if (devindex > 25) {
@@ -504,8 +498,6 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 	device_add_disk(&scmdev->dev, bdev->gendisk, NULL);
 	return 0;
 
-out_queue:
-	blk_cleanup_queue(rq);
 out_tag:
 	blk_mq_free_tag_set(&bdev->tag_set);
 out:
@@ -516,9 +508,8 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 void scm_blk_dev_cleanup(struct scm_blk_dev *bdev)
 {
 	del_gendisk(bdev->gendisk);
-	blk_cleanup_queue(bdev->gendisk->queue);
+	blk_cleanup_disk(bdev->gendisk);
 	blk_mq_free_tag_set(&bdev->tag_set);
-	put_disk(bdev->gendisk);
 }
 
 void scm_blk_set_available(struct scm_blk_dev *bdev)
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 28/30] amiflop: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (26 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 27/30] scm_blk: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 29/30] ataflop: " Christoph Hellwig
                   ` (3 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/amiflop.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c
index 9e2d0c6a3877..8b1714021498 100644
--- a/drivers/block/amiflop.c
+++ b/drivers/block/amiflop.c
@@ -1781,15 +1781,13 @@ static int fd_alloc_disk(int drive, int system)
 {
 	struct gendisk *disk;
 
-	disk = alloc_disk(1);
-	if (!disk)
-		goto out;
-	disk->queue = blk_mq_init_queue(&unit[drive].tag_set);
-	if (IS_ERR(disk->queue))
-		goto out_put_disk;
+	disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL);
+	if (IS_ERR(disk))
+		return PTR_ERR(disk);
 
 	disk->major = FLOPPY_MAJOR;
 	disk->first_minor = drive + system;
+	disk->minors = 1;
 	disk->fops = &floppy_fops;
 	disk->events = DISK_EVENT_MEDIA_CHANGE;
 	if (system)
@@ -1802,12 +1800,6 @@ static int fd_alloc_disk(int drive, int system)
 	unit[drive].gendisk[system] = disk;
 	add_disk(disk);
 	return 0;
-
-out_put_disk:
-	disk->queue = NULL;
-	put_disk(disk);
-out:
-	return -ENOMEM;
 }
 
 static int fd_alloc_drive(int drive)
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 29/30] ataflop: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (27 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 28/30] amiflop: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-02  6:53 ` [dm-devel] [PATCH 30/30] z2ram: " Christoph Hellwig
                   ` (2 subsequent siblings)
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/ataflop.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index d601e49f80e0..a093644ac39f 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -1968,22 +1968,14 @@ static const struct blk_mq_ops ataflop_mq_ops = {
 static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
 {
 	struct gendisk *disk;
-	int ret;
-
-	disk = alloc_disk(1);
-	if (!disk)
-		return -ENOMEM;
 
-	disk->queue = blk_mq_init_queue(&unit[drive].tag_set);
-	if (IS_ERR(disk->queue)) {
-		ret = PTR_ERR(disk->queue);
-		disk->queue = NULL;
-		put_disk(disk);
-		return ret;
-	}
+	disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL);
+	if (IS_ERR(disk))
+		return PTR_ERR(disk);
 
 	disk->major = FLOPPY_MAJOR;
 	disk->first_minor = drive + (type << 2);
+	disk->minors = 1;
 	sprintf(disk->disk_name, "fd%d", drive);
 	disk->fops = &floppy_fops;
 	disk->events = DISK_EVENT_MEDIA_CHANGE;
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* [dm-devel] [PATCH 30/30] z2ram: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (28 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 29/30] ataflop: " Christoph Hellwig
@ 2021-06-02  6:53 ` Christoph Hellwig
  2021-06-04 15:58 ` [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Konrad Rzeszutek Wilk
  2021-06-11 17:55 ` Jens Axboe
  31 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-02  6:53 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/z2ram.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index c1d20818e649..a8968d9e759b 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -323,27 +323,20 @@ static const struct blk_mq_ops z2_mq_ops = {
 
 static int z2ram_register_disk(int minor)
 {
-	struct request_queue *q;
 	struct gendisk *disk;
 
-	disk = alloc_disk(1);
-	if (!disk)
-		return -ENOMEM;
-
-	q = blk_mq_init_queue(&tag_set);
-	if (IS_ERR(q)) {
-		put_disk(disk);
-		return PTR_ERR(q);
-	}
+	disk = blk_mq_alloc_disk(&tag_set, NULL);
+	if (IS_ERR(disk))
+		return PTR_ERR(disk);
 
 	disk->major = Z2RAM_MAJOR;
 	disk->first_minor = minor;
+	disk->minors = 1;
 	disk->fops = &z2_fops;
 	if (minor)
 		sprintf(disk->disk_name, "z2ram%d", minor);
 	else
 		sprintf(disk->disk_name, "z2ram");
-	disk->queue = q;
 
 	z2ram_gendisk[minor] = disk;
 	add_disk(disk);
-- 
2.30.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 23/30] rnbd: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 23/30] rnbd: " Christoph Hellwig
@ 2021-06-02  7:49   ` Jinpu Wang
  0 siblings, 0 replies; 47+ messages in thread
From: Jinpu Wang @ 2021-06-02  7:49 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization,
	device-mapper development, Md. Haris Iqbal, Miquel Raynal,
	Tim Waugh, linux-s390, Maxim Levitsky, Richard Weinberger,
	Christian Borntraeger, xen-devel, Ilya Dryomov, Vasily Gorbik,
	Alex Dubov, Konrad Rzeszutek Wilk, Heiko Carstens, Josef Bacik,
	Denis Efremov, nbd, linux-block, Ceph Development, Jens Axboe,
	Geoff Levand, linux-mmc, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On Wed, Jun 2, 2021 at 8:55 AM Christoph Hellwig <hch@lst.de> wrote:
>
> Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
> request_queue allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  drivers/block/rnbd/rnbd-clt.c | 35 ++++++++---------------------------
>  1 file changed, 8 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
> index c604a402cd5c..f4fa45d24c0b 100644
> --- a/drivers/block/rnbd/rnbd-clt.c
> +++ b/drivers/block/rnbd/rnbd-clt.c
> @@ -1353,18 +1353,6 @@ static void rnbd_init_mq_hw_queues(struct rnbd_clt_dev *dev)
>         }
>  }
>
> -static int setup_mq_dev(struct rnbd_clt_dev *dev)
> -{
> -       dev->queue = blk_mq_init_queue(&dev->sess->tag_set);
> -       if (IS_ERR(dev->queue)) {
> -               rnbd_clt_err(dev, "Initializing multiqueue queue failed, err: %ld\n",
> -                             PTR_ERR(dev->queue));
> -               return PTR_ERR(dev->queue);
> -       }
> -       rnbd_init_mq_hw_queues(dev);
> -       return 0;
> -}
> -
>  static void setup_request_queue(struct rnbd_clt_dev *dev)
>  {
>         blk_queue_logical_block_size(dev->queue, dev->logical_block_size);
> @@ -1393,13 +1381,13 @@ static void setup_request_queue(struct rnbd_clt_dev *dev)
>         blk_queue_io_opt(dev->queue, dev->sess->max_io_size);
>         blk_queue_virt_boundary(dev->queue, SZ_4K - 1);
>         blk_queue_write_cache(dev->queue, dev->wc, dev->fua);
> -       dev->queue->queuedata = dev;
>  }
>
>  static void rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
>  {
>         dev->gd->major          = rnbd_client_major;
>         dev->gd->first_minor    = idx << RNBD_PART_BITS;
> +       dev->gd->minors         = 1 << RNBD_PART_BITS;
>         dev->gd->fops           = &rnbd_client_ops;
>         dev->gd->queue          = dev->queue;
>         dev->gd->private_data   = dev;
> @@ -1426,24 +1414,18 @@ static void rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
>
>  static int rnbd_client_setup_device(struct rnbd_clt_dev *dev)
>  {
> -       int err, idx = dev->clt_device_id;
> +       int idx = dev->clt_device_id;
>
>         dev->size = dev->nsectors * dev->logical_block_size;
>
> -       err = setup_mq_dev(dev);
> -       if (err)
> -               return err;
> +       dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev);
> +       if (IS_ERR(dev->gd))
> +               return PTR_ERR(dev->gd);
> +       dev->queue = dev->gd->queue;
> +       rnbd_init_mq_hw_queues(dev);
>
>         setup_request_queue(dev);
> -
> -       dev->gd = alloc_disk_node(1 << RNBD_PART_BITS,  NUMA_NO_NODE);
> -       if (!dev->gd) {
> -               blk_cleanup_queue(dev->queue);
> -               return -ENOMEM;
> -       }
> -
>         rnbd_clt_setup_gen_disk(dev, idx);
> -
>         return 0;
>  }
>
> @@ -1650,8 +1632,7 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
>  static void destroy_gen_disk(struct rnbd_clt_dev *dev)
>  {
>         del_gendisk(dev->gd);
> -       blk_cleanup_queue(dev->queue);
> -       put_disk(dev->gd);
> +       blk_cleanup_disk(dev->gd);
>  }
>
>  static void destroy_sysfs(struct rnbd_clt_dev *dev,
> --
> 2.30.2

Looks good to me, thx!
Reviewed-by: Jack Wang <jinpu.wang@ionos.com>
>

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 27/30] scm_blk: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 27/30] scm_blk: " Christoph Hellwig
@ 2021-06-02 12:02   ` Niklas Schnelle
  0 siblings, 0 replies; 47+ messages in thread
From: Niklas Schnelle @ 2021-06-02 12:02 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, Md. Haris Iqbal,
	Miquel Raynal, Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Weinberger, Borntraeger, xen-devel, Ilya Dryomov, Vasily Gorbik,
	Alex Dubov, Konrad Rzeszutek Wilk, Carstens, Josef Bacik,
	Denis Efremov, nbd, linux-block, ceph-devel, Levand, linux-mmc,
	dm-devel, linux-mtd, linuxppc-dev, Monné

On Wed, 2021-06-02 at 09:53 +0300, Christoph Hellwig wrote:
> Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
> request_queue allocation.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  drivers/s390/block/scm_blk.c | 21 ++++++---------------
>  1 file changed, 6 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/s390/block/scm_blk.c b/drivers/s390/block/scm_blk.c
> index a4f6f2e62b1d..88cba6212ee2 100644
> --- a/drivers/s390/block/scm_blk.c
> +++ b/drivers/s390/block/scm_blk.c
> @@ -462,12 +462,12 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
>  	if (ret)
>  		goto out;
>  
> -	rq = blk_mq_init_queue(&bdev->tag_set);
> -	if (IS_ERR(rq)) {
> -		ret = PTR_ERR(rq);
> +	bdev->gendisk = blk_mq_alloc_disk(&bdev->tag_set, scmdev);
> +	if (IS_ERR(bdev->gendisk)) {
> +		ret = PTR_ERR(bdev->gendisk);
>  		goto out_tag;
>  	}
> -	bdev->rq = rq;
> +	rq = bdev->rq = bdev->gendisk->queue;
>  	nr_max_blk = min(scmdev->nr_max_block,
>  			 (unsigned int) (PAGE_SIZE / sizeof(struct aidaw)));
>  
> @@ -477,17 +477,11 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
>  	blk_queue_flag_set(QUEUE_FLAG_NONROT, rq);
>  	blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, rq);
>  
> -	bdev->gendisk = alloc_disk(SCM_NR_PARTS);
> -	if (!bdev->gendisk) {
> -		ret = -ENOMEM;
> -		goto out_queue;
> -	}
> -	rq->queuedata = scmdev;
>  	bdev->gendisk->private_data = scmdev;
>  	bdev->gendisk->fops = &scm_blk_devops;
> -	bdev->gendisk->queue = rq;
>  	bdev->gendisk->major = scm_major;
>  	bdev->gendisk->first_minor = devindex * SCM_NR_PARTS;
> +	bdev->gendisk->minors = SCM_NR_PARTS;
>  
>  	len = snprintf(bdev->gendisk->disk_name, DISK_NAME_LEN, "scm");
>  	if (devindex > 25) {
> @@ -504,8 +498,6 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
>  	device_add_disk(&scmdev->dev, bdev->gendisk, NULL);
>  	return 0;
>  
> -out_queue:
> -	blk_cleanup_queue(rq);
>  out_tag:
>  	blk_mq_free_tag_set(&bdev->tag_set);
>  out:
> @@ -516,9 +508,8 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
>  void scm_blk_dev_cleanup(struct scm_blk_dev *bdev)
>  {
>  	del_gendisk(bdev->gendisk);
> -	blk_cleanup_queue(bdev->gendisk->queue);
> +	blk_cleanup_disk(bdev->gendisk);
>  	blk_mq_free_tag_set(&bdev->tag_set);
> -	put_disk(bdev->gendisk);
>  }
>  
>  void scm_blk_set_available(struct scm_blk_dev *bdev)

Not an expert on SCM or this code but I gave this a quick test and it
seems to work fine.

Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>



--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 03/30] blk-mq: add the blk_mq_alloc_disk APIs
  2021-06-02  6:53 ` [dm-devel] [PATCH 03/30] blk-mq: add the blk_mq_alloc_disk APIs Christoph Hellwig
@ 2021-06-03  0:03   ` Chaitanya Kulkarni
  0 siblings, 0 replies; 47+ messages in thread
From: Chaitanya Kulkarni @ 2021-06-03  0:03 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe
  Cc: Justin Sanders, Raghavendra, Mike Snitzer, Michael S. Tsirkin,
	Jason Wang, virtualization, Md. Haris Iqbal, Miquel Raynal,
	Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Gorbik, Alex Dubov, Wilk, Heiko Carstens,
	Josef Bacik, Denis Efremov, nbd, linux-block, ceph-devel, Levand,
	linux-mmc, dm-devel, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On 6/1/21 23:54, Christoph Hellwig wrote:
> Add a new API to allocate a gendisk including the request_queue for use
> with blk-mq based drivers.  This is to avoid boilerplate code in drivers.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

This would be a nice API to get rid of the couple initialization
calls and respective error handling in each blk-mq based drivers.

Looks good.

Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>





--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 15/30] blk-mq: remove blk_mq_init_sq_queue
  2021-06-02  6:53 ` [dm-devel] [PATCH 15/30] blk-mq: remove blk_mq_init_sq_queue Christoph Hellwig
@ 2021-06-03  0:04   ` Chaitanya Kulkarni
  0 siblings, 0 replies; 47+ messages in thread
From: Chaitanya Kulkarni @ 2021-06-03  0:04 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe
  Cc: Justin Sanders, Raghavendra, Mike Snitzer, Michael S. Tsirkin,
	Jason Wang, virtualization, Md. Haris Iqbal, Miquel Raynal,
	Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Gorbik, Alex Dubov, Wilk, Heiko Carstens,
	Josef Bacik, Denis Efremov, nbd, linux-block, ceph-devel, Levand,
	linux-mmc, dm-devel, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On 6/1/21 23:55, Christoph Hellwig wrote:
> All users are gone now.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Looks good.

Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>






--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 18/30] loop: use blk_mq_alloc_disk and blk_cleanup_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 18/30] loop: " Christoph Hellwig
@ 2021-06-03  0:05   ` Chaitanya Kulkarni
  0 siblings, 0 replies; 47+ messages in thread
From: Chaitanya Kulkarni @ 2021-06-03  0:05 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe
  Cc: Justin Sanders, Raghavendra, Mike Snitzer, Michael S. Tsirkin,
	Jason Wang, virtualization, Md. Haris Iqbal, Miquel Raynal,
	Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Gorbik, Alex Dubov, Wilk, Heiko Carstens,
	Josef Bacik, Denis Efremov, nbd, linux-block, ceph-devel, Levand,
	linux-mmc, dm-devel, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On 6/1/21 23:56, Christoph Hellwig wrote:
> Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
> request_queue allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Looks good.

Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>






--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk Christoph Hellwig
@ 2021-06-03  0:10   ` Chaitanya Kulkarni
  2021-06-08  5:39     ` Christoph Hellwig
  0 siblings, 1 reply; 47+ messages in thread
From: Chaitanya Kulkarni @ 2021-06-03  0:10 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Miquel Raynal, Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Weinberger, Borntraeger, xen-devel, Ilya Dryomov, Vasily Gorbik,
	Alex Dubov, Konrad Rzeszutek Wilk, Carstens, Josef Bacik,
	Efremov, nbd, linux-block, linux-mtd, ceph-devel, Jens Axboe,
	Geoff Levand, linux-mmc, Md. Haris Iqbal, linuxppc-dev,
	Roger Pau Monné

On 6/1/21 23:56, Christoph Hellwig wrote:
> Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
> request_queue allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  drivers/block/null_blk/main.c | 11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c
> index d8e098f1e5b5..74fb2ec63219 100644
> --- a/drivers/block/null_blk/main.c
> +++ b/drivers/block/null_blk/main.c
> @@ -1851,13 +1851,12 @@ static int null_add_dev(struct nullb_device *dev)
>  
>  		rv = -ENOMEM;

Is above initialization needed ?

>  		nullb->tag_set->timeout = 5 * HZ;
> -		nullb->q = blk_mq_init_queue_data(nullb->tag_set, nullb);
> -		if (IS_ERR(nullb->q))
> -			goto out_cleanup_tags;
> -		nullb->disk = alloc_disk_node(1, nullb->dev->home_node);
> -		if (!nullb->disk)
> +		nullb->disk = blk_mq_alloc_disk(nullb->tag_set, nullb);
> +		if (IS_ERR(nullb->disk)) {
> +			rv = PTR_ERR(nullb->disk);
>  			goto out_cleanup_disk;
> -		nullb->disk->queue = nullb->q;
> +		}
> +		nullb->q = nullb->disk->queue;
>  	} else if (dev->queue_mode == NULL_Q_BIO) {
>  		rv = -ENOMEM;
>  		nullb->disk = blk_alloc_disk(nullb->dev->home_node);




--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 07/30] ms_block: use blk_mq_alloc_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 07/30] ms_block: " Christoph Hellwig
@ 2021-06-03 15:36   ` Ulf Hansson
  0 siblings, 0 replies; 47+ messages in thread
From: Ulf Hansson @ 2021-06-03 15:36 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Maxim Levitsky, Richard Weinberger, Christian Borntraeger,
	xen-devel, Ilya Dryomov, Vasily Gorbik, Alex Dubov,
	Konrad Rzeszutek Wilk, Heiko Carstens, Josef Bacik,
	Denis Efremov, nbd, linux-block, ceph-devel, Jens Axboe,
	Geoff Levand, linux-mmc, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On Wed, 2 Jun 2021 at 08:54, Christoph Hellwig <hch@lst.de> wrote:
>
> Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
> allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Acked-by: Ulf Hansson <ulf.hansson@linaro.org>

Kind regards
Uffe


> ---
>  drivers/memstick/core/ms_block.c | 25 ++++++++++---------------
>  1 file changed, 10 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c
> index 0bacf4268f83..dac258d12aca 100644
> --- a/drivers/memstick/core/ms_block.c
> +++ b/drivers/memstick/core/ms_block.c
> @@ -2110,21 +2110,17 @@ static int msb_init_disk(struct memstick_dev *card)
>         if (msb->disk_id  < 0)
>                 return msb->disk_id;
>
> -       msb->disk = alloc_disk(0);
> -       if (!msb->disk) {
> -               rc = -ENOMEM;
> +       rc = blk_mq_alloc_sq_tag_set(&msb->tag_set, &msb_mq_ops, 2,
> +                                    BLK_MQ_F_SHOULD_MERGE);
> +       if (rc)
>                 goto out_release_id;
> -       }
>
> -       msb->queue = blk_mq_init_sq_queue(&msb->tag_set, &msb_mq_ops, 2,
> -                                               BLK_MQ_F_SHOULD_MERGE);
> -       if (IS_ERR(msb->queue)) {
> -               rc = PTR_ERR(msb->queue);
> -               msb->queue = NULL;
> -               goto out_put_disk;
> +       msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
> +       if (IS_ERR(msb->disk)) {
> +               rc = PTR_ERR(msb->disk);
> +               goto out_free_tag_set;
>         }
> -
> -       msb->queue->queuedata = card;
> +       msb->queue = msb->disk->queue;
>
>         blk_queue_max_hw_sectors(msb->queue, MS_BLOCK_MAX_PAGES);
>         blk_queue_max_segments(msb->queue, MS_BLOCK_MAX_SEGS);
> @@ -2135,7 +2131,6 @@ static int msb_init_disk(struct memstick_dev *card)
>         sprintf(msb->disk->disk_name, "msblk%d", msb->disk_id);
>         msb->disk->fops = &msb_bdops;
>         msb->disk->private_data = msb;
> -       msb->disk->queue = msb->queue;
>
>         capacity = msb->pages_in_block * msb->logical_block_count;
>         capacity *= (msb->page_size / 512);
> @@ -2155,8 +2150,8 @@ static int msb_init_disk(struct memstick_dev *card)
>         dbg("Disk added");
>         return 0;
>
> -out_put_disk:
> -       put_disk(msb->disk);
> +out_free_tag_set:
> +       blk_mq_free_tag_set(&msb->tag_set);
>  out_release_id:
>         mutex_lock(&msb_disk_lock);
>         idr_remove(&msb_disk_idr, msb->disk_id);
> --
> 2.30.2
>

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 08/30] mspro: use blk_mq_alloc_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 08/30] mspro: " Christoph Hellwig
@ 2021-06-03 15:36   ` Ulf Hansson
  0 siblings, 0 replies; 47+ messages in thread
From: Ulf Hansson @ 2021-06-03 15:36 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Maxim Levitsky, Richard Weinberger, Christian Borntraeger,
	xen-devel, Ilya Dryomov, Vasily Gorbik, Alex Dubov,
	Konrad Rzeszutek Wilk, Heiko Carstens, Josef Bacik,
	Denis Efremov, nbd, linux-block, ceph-devel, Jens Axboe,
	Geoff Levand, linux-mmc, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On Wed, 2 Jun 2021 at 08:54, Christoph Hellwig <hch@lst.de> wrote:
>
> Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
> allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Acked-by: Ulf Hansson <ulf.hansson@linaro.org>

Kind regards
Uffe


> ---
>  drivers/memstick/core/mspro_block.c | 26 +++++++++++---------------
>  1 file changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
> index cf7fe0d58ee7..22778d0e24f5 100644
> --- a/drivers/memstick/core/mspro_block.c
> +++ b/drivers/memstick/core/mspro_block.c
> @@ -1205,21 +1205,17 @@ static int mspro_block_init_disk(struct memstick_dev *card)
>         if (disk_id < 0)
>                 return disk_id;
>
> -       msb->disk = alloc_disk(1 << MSPRO_BLOCK_PART_SHIFT);
> -       if (!msb->disk) {
> -               rc = -ENOMEM;
> +       rc = blk_mq_alloc_sq_tag_set(&msb->tag_set, &mspro_mq_ops, 2,
> +                                    BLK_MQ_F_SHOULD_MERGE);
> +       if (rc)
>                 goto out_release_id;
> -       }
>
> -       msb->queue = blk_mq_init_sq_queue(&msb->tag_set, &mspro_mq_ops, 2,
> -                                               BLK_MQ_F_SHOULD_MERGE);
> -       if (IS_ERR(msb->queue)) {
> -               rc = PTR_ERR(msb->queue);
> -               msb->queue = NULL;
> -               goto out_put_disk;
> +       msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
> +       if (IS_ERR(msb->disk)) {
> +               rc = PTR_ERR(msb->disk);
> +               goto out_free_tag_set;
>         }
> -
> -       msb->queue->queuedata = card;
> +       msb->queue = msb->disk->queue;
>
>         blk_queue_max_hw_sectors(msb->queue, MSPRO_BLOCK_MAX_PAGES);
>         blk_queue_max_segments(msb->queue, MSPRO_BLOCK_MAX_SEGS);
> @@ -1228,10 +1224,10 @@ static int mspro_block_init_disk(struct memstick_dev *card)
>
>         msb->disk->major = major;
>         msb->disk->first_minor = disk_id << MSPRO_BLOCK_PART_SHIFT;
> +       msb->disk->minors = 1 << MSPRO_BLOCK_PART_SHIFT;
>         msb->disk->fops = &ms_block_bdops;
>         msb->usage_count = 1;
>         msb->disk->private_data = msb;
> -       msb->disk->queue = msb->queue;
>
>         sprintf(msb->disk->disk_name, "mspblk%d", disk_id);
>
> @@ -1247,8 +1243,8 @@ static int mspro_block_init_disk(struct memstick_dev *card)
>         msb->active = 1;
>         return 0;
>
> -out_put_disk:
> -       put_disk(msb->disk);
> +out_free_tag_set:
> +       blk_mq_free_tag_set(&msb->tag_set);
>  out_release_id:
>         mutex_lock(&mspro_block_disk_lock);
>         idr_remove(&mspro_block_disk_idr, disk_id);
> --
> 2.30.2
>

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (29 preceding siblings ...)
  2021-06-02  6:53 ` [dm-devel] [PATCH 30/30] z2ram: " Christoph Hellwig
@ 2021-06-04 15:58 ` Konrad Rzeszutek Wilk
  2021-06-05 14:02   ` Christoph Hellwig
  2021-06-11 17:55 ` Jens Axboe
  31 siblings, 1 reply; 47+ messages in thread
From: Konrad Rzeszutek Wilk @ 2021-06-04 15:58 UTC (permalink / raw)
  To: Christoph Hellwig, Boris Ostrovsky, jgross
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Maxim Levitsky, Richard Weinberger, Christian Borntraeger,
	xen-devel, Ilya Dryomov, Vasily Gorbik, Alex Dubov,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Jens Axboe, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

On Wed, Jun 02, 2021 at 09:53:15AM +0300, Christoph Hellwig wrote:
> Hi all,

Hi!

You wouldn't have a nice git repo to pull so one can test it easily?

Thank you!

Cc-ing Boris/Juergen - pls see below xen.
> 
> this series is the scond part of cleaning up lifetimes and allocation of
> the gendisk and request_queue structure.  It adds a new interface to
> allocate the disk and queue together for blk based drivers, and uses that
> in all drivers that do not have any caveats in their gendisk and
> request_queue lifetime rules.
> 
> Diffstat:
>  block/blk-mq.c                      |   91 +++++++++++++++-------------------
>  block/blk.h                         |    1 
>  block/elevator.c                    |    2 
>  drivers/block/amiflop.c             |   16 +-----
>  drivers/block/aoe/aoeblk.c          |   33 ++++--------
>  drivers/block/aoe/aoedev.c          |    3 -
>  drivers/block/ataflop.c             |   16 +-----
>  drivers/block/floppy.c              |   20 +------
>  drivers/block/loop.c                |   19 ++-----
>  drivers/block/nbd.c                 |   53 +++++++------------
>  drivers/block/null_blk/main.c       |   11 +---
>  drivers/block/paride/pcd.c          |   19 +++----
>  drivers/block/paride/pd.c           |   30 ++++-------
>  drivers/block/paride/pf.c           |   18 ++----
>  drivers/block/ps3disk.c             |   36 +++++--------
>  drivers/block/rbd.c                 |   52 ++++++-------------
>  drivers/block/rnbd/rnbd-clt.c       |   35 +++----------
>  drivers/block/sunvdc.c              |   47 ++++-------------
>  drivers/block/swim.c                |   34 +++++-------
>  drivers/block/swim3.c               |   33 +++++-------
>  drivers/block/sx8.c                 |   23 ++------
>  drivers/block/virtio_blk.c          |   26 ++-------
>  drivers/block/xen-blkfront.c        |   96 ++++++++++++++----------------------
>  drivers/block/z2ram.c               |   15 +----
>  drivers/cdrom/gdrom.c               |   45 +++++++---------
>  drivers/md/dm-rq.c                  |    9 +--
>  drivers/memstick/core/ms_block.c    |   25 +++------
>  drivers/memstick/core/mspro_block.c |   26 ++++-----
>  drivers/mtd/mtd_blkdevs.c           |   48 ++++++++----------
>  drivers/mtd/ubi/block.c             |   68 ++++++++++---------------
>  drivers/s390/block/scm_blk.c        |   21 ++-----
>  include/linux/blk-mq.h              |   24 ++++++---
>  include/linux/elevator.h            |    1 
>  33 files changed, 386 insertions(+), 610 deletions(-)

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers
  2021-06-04 15:58 ` [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Konrad Rzeszutek Wilk
@ 2021-06-05 14:02   ` Christoph Hellwig
  0 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-05 14:02 UTC (permalink / raw)
  To: Konrad Rzeszutek Wilk
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Christoph Hellwig,
	Tim Waugh, linux-s390, Maxim Levitsky, Richard Weinberger,
	ceph-devel, Christian Borntraeger, xen-devel, Ilya Dryomov,
	Vasily Gorbik, Jens Axboe, Alex Dubov, Heiko Carstens,
	Josef Bacik, Denis Efremov, nbd, linux-block, Boris Ostrovsky,
	jgross, Geoff Levand, linux-mmc, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On Fri, Jun 04, 2021 at 11:58:34AM -0400, Konrad Rzeszutek Wilk wrote:
> On Wed, Jun 02, 2021 at 09:53:15AM +0300, Christoph Hellwig wrote:
> > Hi all,
> 
> Hi!
> 
> You wouldn't have a nice git repo to pull so one can test it easily?

git://git.infradead.org/users/hch/block.git alloc_disk-part2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 10/30] ps3disk: use blk_mq_alloc_disk
  2021-06-02  6:53 ` [dm-devel] [PATCH 10/30] ps3disk: " Christoph Hellwig
@ 2021-06-06 15:58   ` Geoff Levand
  0 siblings, 0 replies; 47+ messages in thread
From: Geoff Levand @ 2021-06-06 15:58 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, linux-mmc, linux-mtd, linuxppc-dev,
	Roger Pau Monné

Hi Christoph,

On 6/1/21 11:53 PM, Christoph Hellwig wrote:
> Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
> allocation.
> 
>  drivers/block/ps3disk.c | 36 ++++++++++++++----------------------
>  1 file changed, 14 insertions(+), 22 deletions(-)

I tested your alloc_disk-part2 branch on PS3, and it seemed to be working OK.

Tested-by: Geoff Levand <geoff@infradead.org>

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk
  2021-06-03  0:10   ` Chaitanya Kulkarni
@ 2021-06-08  5:39     ` Christoph Hellwig
  0 siblings, 0 replies; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-08  5:39 UTC (permalink / raw)
  To: Chaitanya Kulkarni
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Christoph Hellwig,
	Tim Waugh, linux-s390, Maxim Levitsky, Richard Weinberger,
	Christian Borntraeger, xen-devel, Ilya Dryomov, Vasily Gorbik,
	Alex Dubov, Konrad Rzeszutek Wilk, Heiko Carstens, Josef Bacik,
	Denis Efremov, nbd, linux-block, ceph-devel, Jens Axboe,
	Geoff Levand, linux-mmc, linux-mtd, linuxppc-dev,
	Roger Pau Monné

On Thu, Jun 03, 2021 at 12:10:09AM +0000, Chaitanya Kulkarni wrote:
> > diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c
> > index d8e098f1e5b5..74fb2ec63219 100644
> > --- a/drivers/block/null_blk/main.c
> > +++ b/drivers/block/null_blk/main.c
> > @@ -1851,13 +1851,12 @@ static int null_add_dev(struct nullb_device *dev)
> >  
> >  		rv = -ENOMEM;
> 
> Is above initialization needed ?

It isn't strictly required any more.

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers
  2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
                   ` (30 preceding siblings ...)
  2021-06-04 15:58 ` [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Konrad Rzeszutek Wilk
@ 2021-06-11 17:55 ` Jens Axboe
  31 siblings, 0 replies; 47+ messages in thread
From: Jens Axboe @ 2021-06-11 17:55 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Tim Waugh, linux-s390,
	Alex Dubov, Richard Weinberger, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Maxim Levitsky, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

On 6/2/21 12:53 AM, Christoph Hellwig wrote:
> Hi all,
> 
> this series is the scond part of cleaning up lifetimes and allocation of
> the gendisk and request_queue structure.  It adds a new interface to
> allocate the disk and queue together for blk based drivers, and uses that
> in all drivers that do not have any caveats in their gendisk and
> request_queue lifetime rules.

Applied, thanks.

-- 
Jens Axboe

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 09/30] mtd_blkdevs: use blk_mq_alloc_disk
       [not found]   ` <CGME20210615154746eucas1p1321b6f1cf38d21899632e132cf025e61@eucas1p1.samsung.com>
@ 2021-06-15 15:47     ` Marek Szyprowski
  2021-06-15 15:58       ` Christoph Hellwig
  0 siblings, 1 reply; 47+ messages in thread
From: Marek Szyprowski @ 2021-06-15 15:47 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe
  Cc: Justin Sanders, Raghavendra, Mike Snitzer, Michael S. Tsirkin,
	Jason Wang, virtualization, Md. Haris Iqbal, Miquel Raynal,
	Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Richard Weinberger, Bartlomiej Zolnierkiewicz,
	Christian Borntraeger, xen-devel, Ilya Dryomov, Gorbik,
	Alex Dubov, Rzeszutek Wilk, Heiko Carstens, Josef Bacik,
	Denis Efremov, nbd, linux-block, ceph-devel, Levand, linux-mmc,
	dm-devel, linux-mtd, linuxppc-dev, Roger Pau Monné

Hi,

On 02.06.2021 08:53, Christoph Hellwig wrote:
> Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
> allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

This patch landed in linux-next as commit 6966bb921def ("mtd_blkdevs: 
use blk_mq_alloc_disk"). It causes the following regression on my QEMU 
arm64 setup:

  Using buffer write method
  Concatenating MTD devices:
  (0): "0.flash"
  (1): "0.flash"
  into device "0.flash"
  Unable to handle kernel NULL pointer dereference at virtual address 
0000000000000068
  Mem abort info:
    ESR = 0x96000004
    EC = 0x25: DABT (current EL), IL = 32 bits
    SET = 0, FnV = 0
    EA = 0, S1PTW = 0
  Data abort info:
    ISV = 0, ISS = 0x00000004
    CM = 0, WnR = 0
  [0000000000000068] user address but active_mm is swapper
  Internal error: Oops: 96000004 [#1] PREEMPT SMP
  Modules linked in:
  CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.13.0-rc3+ #10492
  Hardware name: linux,dummy-virt (DT)
  pstate: 00000005 (nzcv daif -PAN -UAO -TCO BTYPE=--)
  pc : blk_finish_plug+0x5c/0x268
  lr : blk_queue_write_cache+0x28/0x70
...
  Call trace:
   blk_finish_plug+0x5c/0x268
   add_mtd_blktrans_dev+0x270/0x420
   mtdblock_add_mtd+0x68/0x98
   blktrans_notify_add+0x44/0x70
   add_mtd_device+0x41c/0x490
   mtd_device_parse_register+0xf4/0x1c8
   physmap_flash_probe+0x44c/0x780
   platform_probe+0x90/0xd8
   really_probe+0x108/0x3c0
   driver_probe_device+0x60/0xc0
   device_driver_attach+0x6c/0x78
   __driver_attach+0xc0/0x100
   bus_for_each_dev+0x68/0xc8
   driver_attach+0x20/0x28
   bus_add_driver+0x168/0x1f8
   driver_register+0x60/0x110
   __platform_driver_register+0x24/0x30
   physmap_init+0x18/0x20
   do_one_initcall+0x84/0x450
   kernel_init_freeable+0x2dc/0x334
   kernel_init+0x10/0x110
   ret_from_fork+0x10/0x18
  Code: 88027c01 35ffffa2 17fff079 f9800031 (c85f7c22)
  ---[ end trace b774518e0766cc92 ]---
  Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
  SMP: stopping secondary CPUs
  Kernel Offset: 0x594d1fa00000 from 0xffff800010000000
  PHYS_OFFSET: 0xffffea7300000000
  CPU features: 0x11000671,00000846
  Memory Limit: none
  ---[ end Kernel panic - not syncing: Attempted to kill init! 
exitcode=0x0000000b ]---

> ---
>   drivers/mtd/mtd_blkdevs.c | 48 ++++++++++++++++++---------------------
>   1 file changed, 22 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
> index fb8e12d590a1..5dc4c966ea73 100644
> --- a/drivers/mtd/mtd_blkdevs.c
> +++ b/drivers/mtd/mtd_blkdevs.c
> @@ -30,11 +30,9 @@ static void blktrans_dev_release(struct kref *kref)
>   	struct mtd_blktrans_dev *dev =
>   		container_of(kref, struct mtd_blktrans_dev, ref);
>   
> -	dev->disk->private_data = NULL;
> -	blk_cleanup_queue(dev->rq);
> +	blk_cleanup_disk(dev->disk);
>   	blk_mq_free_tag_set(dev->tag_set);
>   	kfree(dev->tag_set);
> -	put_disk(dev->disk);
>   	list_del(&dev->list);
>   	kfree(dev);
>   }
> @@ -354,7 +352,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
>   	if (new->devnum > (MINORMASK >> tr->part_bits) ||
>   	    (tr->part_bits && new->devnum >= 27 * 26)) {
>   		mutex_unlock(&blktrans_ref_mutex);
> -		goto error1;
> +		return ret;
>   	}
>   
>   	list_add_tail(&new->list, &tr->devs);
> @@ -366,17 +364,28 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
>   	if (!tr->writesect)
>   		new->readonly = 1;
>   
> -	/* Create gendisk */
>   	ret = -ENOMEM;
> -	gd = alloc_disk(1 << tr->part_bits);
> +	new->tag_set = kzalloc(sizeof(*new->tag_set), GFP_KERNEL);
> +	if (!new->tag_set)
> +		goto out_list_del;
>   
> -	if (!gd)
> -		goto error2;
> +	ret = blk_mq_alloc_sq_tag_set(new->tag_set, &mtd_mq_ops, 2,
> +			BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
> +	if (ret)
> +		goto out_kfree_tag_set;
> +
> +	/* Create gendisk */
> +	gd = blk_mq_alloc_disk(new->tag_set, new);
> +	if (IS_ERR(gd)) {
> +		ret = PTR_ERR(gd);
> +		goto out_free_tag_set;
> +	}
>   
>   	new->disk = gd;
>   	gd->private_data = new;
>   	gd->major = tr->major;
>   	gd->first_minor = (new->devnum) << tr->part_bits;
> +	gd->minors = 1 << tr->part_bits;
>   	gd->fops = &mtd_block_ops;
>   
>   	if (tr->part_bits)
> @@ -398,22 +407,9 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
>   	spin_lock_init(&new->queue_lock);
>   	INIT_LIST_HEAD(&new->rq_list);
>   
> -	new->tag_set = kzalloc(sizeof(*new->tag_set), GFP_KERNEL);
> -	if (!new->tag_set)
> -		goto error3;
> -
> -	new->rq = blk_mq_init_sq_queue(new->tag_set, &mtd_mq_ops, 2,
> -				BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
> -	if (IS_ERR(new->rq)) {
> -		ret = PTR_ERR(new->rq);
> -		new->rq = NULL;
> -		goto error4;
> -	}
> -
>   	if (tr->flush)
>   		blk_queue_write_cache(new->rq, true, false);
>   
> -	new->rq->queuedata = new;
>   	blk_queue_logical_block_size(new->rq, tr->blksize);
>   
>   	blk_queue_flag_set(QUEUE_FLAG_NONROT, new->rq);
> @@ -437,13 +433,13 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
>   		WARN_ON(ret);
>   	}
>   	return 0;
> -error4:
> +
> +out_free_tag_set:
> +	blk_mq_free_tag_set(new->tag_set);
> +out_kfree_tag_set:
>   	kfree(new->tag_set);
> -error3:
> -	put_disk(new->disk);
> -error2:
> +out_list_del:
>   	list_del(&new->list);
> -error1:
>   	return ret;
>   }
>   

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 09/30] mtd_blkdevs: use blk_mq_alloc_disk
  2021-06-15 15:47     ` Marek Szyprowski
@ 2021-06-15 15:58       ` Christoph Hellwig
  2021-06-15 16:28         ` Marek Szyprowski
  0 siblings, 1 reply; 47+ messages in thread
From: Christoph Hellwig @ 2021-06-15 15:58 UTC (permalink / raw)
  To: Marek Szyprowski
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Md. Haris Iqbal, Miquel Raynal, Jack Wang, Christoph Hellwig,
	Tim Waugh, linux-s390, Maxim Levitsky, Richard Weinberger,
	Bartlomiej Zolnierkiewicz, Christian Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Alex Dubov, Konrad Rzeszutek Wilk,
	Heiko Carstens, Josef Bacik, Denis Efremov, nbd, linux-block,
	ceph-devel, Jens Axboe, Geoff Levand, linux-mmc, linux-mtd,
	linuxppc-dev, Roger Pau Monné

On Tue, Jun 15, 2021 at 05:47:44PM +0200, Marek Szyprowski wrote:
> Hi,
> 
> On 02.06.2021 08:53, Christoph Hellwig wrote:
> > Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
> > allocation.
> >
> > Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> This patch landed in linux-next as commit 6966bb921def ("mtd_blkdevs: 
> use blk_mq_alloc_disk"). It causes the following regression on my QEMU 
> arm64 setup:

Please try the patch below:

diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index 5dc4c966ea73..6ce4bc57f919 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -382,6 +382,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
 	}
 
 	new->disk = gd;
+	new->rq = new->disk->queue;
 	gd->private_data = new;
 	gd->major = tr->major;
 	gd->first_minor = (new->devnum) << tr->part_bits;

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply related	[flat|nested] 47+ messages in thread

* Re: [dm-devel] [PATCH 09/30] mtd_blkdevs: use blk_mq_alloc_disk
  2021-06-15 15:58       ` Christoph Hellwig
@ 2021-06-15 16:28         ` Marek Szyprowski
  0 siblings, 0 replies; 47+ messages in thread
From: Marek Szyprowski @ 2021-06-15 16:28 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Justin Sanders, Vignesh Raghavendra, Mike Snitzer,
	Michael S. Tsirkin, Jason Wang, virtualization, dm-devel,
	Miquel Raynal, Jack Wang, Tim Waugh, linux-s390, Maxim Levitsky,
	Weinberger, Bartlomiej Zolnierkiewicz, Borntraeger, xen-devel,
	Ilya Dryomov, Vasily Gorbik, Alex Dubov, Konrad Rzeszutek Wilk,
	Carstens, Josef Bacik, Efremov, nbd, linux-block, linux-mtd,
	ceph-devel, Jens Axboe, Geoff Levand, linux-mmc, Md. Haris Iqbal,
	linuxppc-dev, Roger Pau Monné

Hi Christoph,

On 15.06.2021 17:58, Christoph Hellwig wrote:
> On Tue, Jun 15, 2021 at 05:47:44PM +0200, Marek Szyprowski wrote:
>> On 02.06.2021 08:53, Christoph Hellwig wrote:
>>> Use the blk_mq_alloc_disk API to simplify the gendisk and request_queue
>>> allocation.
>>>
>>> Signed-off-by: Christoph Hellwig <hch@lst.de>
>> This patch landed in linux-next as commit 6966bb921def ("mtd_blkdevs:
>> use blk_mq_alloc_disk"). It causes the following regression on my QEMU
>> arm64 setup:
> Please try the patch below:
>
> diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
> index 5dc4c966ea73..6ce4bc57f919 100644
> --- a/drivers/mtd/mtd_blkdevs.c
> +++ b/drivers/mtd/mtd_blkdevs.c
> @@ -382,6 +382,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
>   	}
>   
>   	new->disk = gd;
> +	new->rq = new->disk->queue;
>   	gd->private_data = new;
>   	gd->major = tr->major;
>   	gd->first_minor = (new->devnum) << tr->part_bits;

Right, this fixes the issue, thanks. Feel free to add:

Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>

Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2021-06-16  7:26 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-02  6:53 [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 01/30] blk-mq: factor out a blk_mq_alloc_sq_tag_set helper Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 02/30] blk-mq: improve the blk_mq_init_allocated_queue interface Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 03/30] blk-mq: add the blk_mq_alloc_disk APIs Christoph Hellwig
2021-06-03  0:03   ` Chaitanya Kulkarni
2021-06-02  6:53 ` [dm-devel] [PATCH 04/30] virtio-blk: use blk_mq_alloc_disk Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 05/30] pcd: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 06/30] pf: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 07/30] ms_block: " Christoph Hellwig
2021-06-03 15:36   ` Ulf Hansson
2021-06-02  6:53 ` [dm-devel] [PATCH 08/30] mspro: " Christoph Hellwig
2021-06-03 15:36   ` Ulf Hansson
2021-06-02  6:53 ` [dm-devel] [PATCH 09/30] mtd_blkdevs: " Christoph Hellwig
     [not found]   ` <CGME20210615154746eucas1p1321b6f1cf38d21899632e132cf025e61@eucas1p1.samsung.com>
2021-06-15 15:47     ` Marek Szyprowski
2021-06-15 15:58       ` Christoph Hellwig
2021-06-15 16:28         ` Marek Szyprowski
2021-06-02  6:53 ` [dm-devel] [PATCH 10/30] ps3disk: " Christoph Hellwig
2021-06-06 15:58   ` Geoff Levand
2021-06-02  6:53 ` [dm-devel] [PATCH 11/30] swim3: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 12/30] swim: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 13/30] sunvdc: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 14/30] gdrom: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 15/30] blk-mq: remove blk_mq_init_sq_queue Christoph Hellwig
2021-06-03  0:04   ` Chaitanya Kulkarni
2021-06-02  6:53 ` [dm-devel] [PATCH 16/30] aoe: use blk_mq_alloc_disk and blk_cleanup_disk Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 17/30] floppy: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 18/30] loop: " Christoph Hellwig
2021-06-03  0:05   ` Chaitanya Kulkarni
2021-06-02  6:53 ` [dm-devel] [PATCH 19/30] nbd: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 20/30] nullb: use blk_mq_alloc_disk Christoph Hellwig
2021-06-03  0:10   ` Chaitanya Kulkarni
2021-06-08  5:39     ` Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 21/30] pd: use blk_mq_alloc_disk and blk_cleanup_disk Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 22/30] rbd: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 23/30] rnbd: " Christoph Hellwig
2021-06-02  7:49   ` Jinpu Wang
2021-06-02  6:53 ` [dm-devel] [PATCH 24/30] sx8: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 25/30] xen-blkfront: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 26/30] ubi: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 27/30] scm_blk: " Christoph Hellwig
2021-06-02 12:02   ` Niklas Schnelle
2021-06-02  6:53 ` [dm-devel] [PATCH 28/30] amiflop: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 29/30] ataflop: " Christoph Hellwig
2021-06-02  6:53 ` [dm-devel] [PATCH 30/30] z2ram: " Christoph Hellwig
2021-06-04 15:58 ` [dm-devel] simplify gendisk and request_queue allocation for blk-mq based drivers Konrad Rzeszutek Wilk
2021-06-05 14:02   ` Christoph Hellwig
2021-06-11 17:55 ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).