simplify gendisk and request_queue allocation for blk-mq based drivers
36 messages,
4 authors,
2021-06-11 · open the first message on its own page
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(-)
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
On Wed, 2 Jun 2021 at 08:54, Christoph Hellwig [off-list ref] 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 <redacted>
Kind regards
Uffe
quoted hunk ---
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 _______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
On Wed, 2 Jun 2021 at 08:54, Christoph Hellwig [off-list ref] 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 <redacted>
Kind regards
Uffe
quoted hunk ---
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 _______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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(-) _______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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: quoted 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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
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
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization