Skip to content

Commit c68f4f4

Browse files
Christoph Hellwigaxboe
authored andcommitted
s390/dasd: use blk_mq_alloc_disk
As far as I can tell there is no need for the staged setup in dasd, so allocate the tagset and the disk with the queue in dasd_gendisk_alloc. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Stefan Haberland <[email protected]> Signed-off-by: Stefan Haberland <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 5765033 commit c68f4f4

File tree

7 files changed

+39
-88
lines changed

7 files changed

+39
-88
lines changed

drivers/s390/block/dasd.c

Lines changed: 9 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,6 @@
4141

4242
#define DASD_DIAG_MOD "dasd_diag_mod"
4343

44-
static unsigned int queue_depth = 32;
45-
static unsigned int nr_hw_queues = 4;
46-
47-
module_param(queue_depth, uint, 0444);
48-
MODULE_PARM_DESC(queue_depth, "Default queue depth for new DASD devices");
49-
50-
module_param(nr_hw_queues, uint, 0444);
51-
MODULE_PARM_DESC(nr_hw_queues, "Default number of hardware queues for new DASD devices");
52-
5344
/*
5445
* SECTION: exported variables of dasd.c
5546
*/
@@ -68,8 +59,6 @@ MODULE_LICENSE("GPL");
6859
/*
6960
* SECTION: prototypes for static functions of dasd.c
7061
*/
71-
static int dasd_alloc_queue(struct dasd_block *);
72-
static void dasd_free_queue(struct dasd_block *);
7362
static int dasd_flush_block_queue(struct dasd_block *);
7463
static void dasd_device_tasklet(unsigned long);
7564
static void dasd_block_tasklet(unsigned long);
@@ -198,21 +187,11 @@ EXPORT_SYMBOL_GPL(dasd_free_block);
198187
*/
199188
static int dasd_state_new_to_known(struct dasd_device *device)
200189
{
201-
int rc;
202-
203190
/*
204191
* As long as the device is not in state DASD_STATE_NEW we want to
205192
* keep the reference count > 0.
206193
*/
207194
dasd_get_device(device);
208-
209-
if (device->block) {
210-
rc = dasd_alloc_queue(device->block);
211-
if (rc) {
212-
dasd_put_device(device);
213-
return rc;
214-
}
215-
}
216195
device->state = DASD_STATE_KNOWN;
217196
return 0;
218197
}
@@ -226,9 +205,6 @@ static int dasd_state_known_to_new(struct dasd_device *device)
226205
dasd_eer_disable(device);
227206
device->state = DASD_STATE_NEW;
228207

229-
if (device->block)
230-
dasd_free_queue(device->block);
231-
232208
/* Give up reference we took in dasd_state_new_to_known. */
233209
dasd_put_device(device);
234210
return 0;
@@ -1591,9 +1567,8 @@ void dasd_generic_handle_state_change(struct dasd_device *device)
15911567
dasd_schedule_device_bh(device);
15921568
if (device->block) {
15931569
dasd_schedule_block_bh(device->block);
1594-
if (device->block->request_queue)
1595-
blk_mq_run_hw_queues(device->block->request_queue,
1596-
true);
1570+
if (device->block->gdp)
1571+
blk_mq_run_hw_queues(device->block->gdp->queue, true);
15971572
}
15981573
}
15991574
EXPORT_SYMBOL_GPL(dasd_generic_handle_state_change);
@@ -2691,7 +2666,7 @@ static void dasd_block_timeout(struct timer_list *t)
26912666
dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING);
26922667
spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags);
26932668
dasd_schedule_block_bh(block);
2694-
blk_mq_run_hw_queues(block->request_queue, true);
2669+
blk_mq_run_hw_queues(block->gdp->queue, true);
26952670
}
26962671

26972672
/*
@@ -3239,53 +3214,14 @@ static void dasd_request_done(struct request *req)
32393214
blk_mq_run_hw_queues(req->q, true);
32403215
}
32413216

3242-
static struct blk_mq_ops dasd_mq_ops = {
3217+
struct blk_mq_ops dasd_mq_ops = {
32433218
.queue_rq = do_dasd_request,
32443219
.complete = dasd_request_done,
32453220
.timeout = dasd_times_out,
32463221
.init_hctx = dasd_init_hctx,
32473222
.exit_hctx = dasd_exit_hctx,
32483223
};
32493224

3250-
/*
3251-
* Allocate and initialize request queue and default I/O scheduler.
3252-
*/
3253-
static int dasd_alloc_queue(struct dasd_block *block)
3254-
{
3255-
int rc;
3256-
3257-
block->tag_set.ops = &dasd_mq_ops;
3258-
block->tag_set.cmd_size = sizeof(struct dasd_ccw_req);
3259-
block->tag_set.nr_hw_queues = nr_hw_queues;
3260-
block->tag_set.queue_depth = queue_depth;
3261-
block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
3262-
block->tag_set.numa_node = NUMA_NO_NODE;
3263-
3264-
rc = blk_mq_alloc_tag_set(&block->tag_set);
3265-
if (rc)
3266-
return rc;
3267-
3268-
block->request_queue = blk_mq_init_queue(&block->tag_set);
3269-
if (IS_ERR(block->request_queue))
3270-
return PTR_ERR(block->request_queue);
3271-
3272-
block->request_queue->queuedata = block;
3273-
3274-
return 0;
3275-
}
3276-
3277-
/*
3278-
* Deactivate and free request queue.
3279-
*/
3280-
static void dasd_free_queue(struct dasd_block *block)
3281-
{
3282-
if (block->request_queue) {
3283-
blk_mq_destroy_queue(block->request_queue);
3284-
blk_mq_free_tag_set(&block->tag_set);
3285-
block->request_queue = NULL;
3286-
}
3287-
}
3288-
32893225
static int dasd_open(struct block_device *bdev, fmode_t mode)
32903226
{
32913227
struct dasd_device *base;
@@ -3762,10 +3698,9 @@ int dasd_generic_path_operational(struct dasd_device *device)
37623698
dasd_schedule_device_bh(device);
37633699
if (device->block) {
37643700
dasd_schedule_block_bh(device->block);
3765-
if (device->block->request_queue)
3766-
blk_mq_run_hw_queues(device->block->request_queue,
3767-
true);
3768-
}
3701+
if (device->block->gdp)
3702+
blk_mq_run_hw_queues(device->block->gdp->queue, true);
3703+
}
37693704

37703705
if (!device->stopped)
37713706
wake_up(&generic_waitq);
@@ -3916,8 +3851,8 @@ void dasd_generic_space_avail(struct dasd_device *device)
39163851

39173852
if (device->block) {
39183853
dasd_schedule_block_bh(device->block);
3919-
if (device->block->request_queue)
3920-
blk_mq_run_hw_queues(device->block->request_queue, true);
3854+
if (device->block->gdp)
3855+
blk_mq_run_hw_queues(device->block->gdp->queue, true);
39213856
}
39223857
if (!device->stopped)
39233858
wake_up(&generic_waitq);

drivers/s390/block/dasd_devmap.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1578,7 +1578,6 @@ dasd_timeout_store(struct device *dev, struct device_attribute *attr,
15781578
const char *buf, size_t count)
15791579
{
15801580
struct dasd_device *device;
1581-
struct request_queue *q;
15821581
unsigned long val;
15831582

15841583
device = dasd_device_from_cdev(to_ccwdev(dev));
@@ -1590,15 +1589,13 @@ dasd_timeout_store(struct device *dev, struct device_attribute *attr,
15901589
dasd_put_device(device);
15911590
return -EINVAL;
15921591
}
1593-
q = device->block->request_queue;
1594-
if (!q) {
1592+
if (!device->block->gdp) {
15951593
dasd_put_device(device);
15961594
return -ENODEV;
15971595
}
15981596

15991597
device->blk_timeout = val;
1600-
1601-
blk_queue_rq_timeout(q, device->blk_timeout * HZ);
1598+
blk_queue_rq_timeout(device->block->gdp->queue, val * HZ);
16021599

16031600
dasd_put_device(device);
16041601
return count;

drivers/s390/block/dasd_diag.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ dasd_diag_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
627627
static void dasd_diag_setup_blk_queue(struct dasd_block *block)
628628
{
629629
unsigned int logical_block_size = block->bp_block;
630-
struct request_queue *q = block->request_queue;
630+
struct request_queue *q = block->gdp->queue;
631631
int max;
632632

633633
max = DIAG_MAX_BLOCKS << block->s2b_shift;

drivers/s390/block/dasd_eckd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6844,7 +6844,7 @@ static void dasd_eckd_handle_hpf_error(struct dasd_device *device,
68446844
static void dasd_eckd_setup_blk_queue(struct dasd_block *block)
68456845
{
68466846
unsigned int logical_block_size = block->bp_block;
6847-
struct request_queue *q = block->request_queue;
6847+
struct request_queue *q = block->gdp->queue;
68486848
struct dasd_device *device = block->base;
68496849
int max;
68506850

drivers/s390/block/dasd_fba.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
767767
static void dasd_fba_setup_blk_queue(struct dasd_block *block)
768768
{
769769
unsigned int logical_block_size = block->bp_block;
770-
struct request_queue *q = block->request_queue;
770+
struct request_queue *q = block->gdp->queue;
771771
unsigned int max_bytes, max_discard_sectors;
772772
int max;
773773

drivers/s390/block/dasd_genhd.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@
2525

2626
#include "dasd_int.h"
2727

28-
static struct lock_class_key dasd_bio_compl_lkclass;
28+
static unsigned int queue_depth = 32;
29+
static unsigned int nr_hw_queues = 4;
30+
31+
module_param(queue_depth, uint, 0444);
32+
MODULE_PARM_DESC(queue_depth, "Default queue depth for new DASD devices");
33+
34+
module_param(nr_hw_queues, uint, 0444);
35+
MODULE_PARM_DESC(nr_hw_queues, "Default number of hardware queues for new DASD devices");
2936

3037
/*
3138
* Allocate and register gendisk structure for device.
@@ -41,10 +48,21 @@ int dasd_gendisk_alloc(struct dasd_block *block)
4148
if (base->devindex >= DASD_PER_MAJOR)
4249
return -EBUSY;
4350

44-
gdp = blk_mq_alloc_disk_for_queue(block->request_queue,
45-
&dasd_bio_compl_lkclass);
46-
if (!gdp)
47-
return -ENOMEM;
51+
block->tag_set.ops = &dasd_mq_ops;
52+
block->tag_set.cmd_size = sizeof(struct dasd_ccw_req);
53+
block->tag_set.nr_hw_queues = nr_hw_queues;
54+
block->tag_set.queue_depth = queue_depth;
55+
block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
56+
block->tag_set.numa_node = NUMA_NO_NODE;
57+
rc = blk_mq_alloc_tag_set(&block->tag_set);
58+
if (rc)
59+
return rc;
60+
61+
gdp = blk_mq_alloc_disk(&block->tag_set, block);
62+
if (IS_ERR(gdp)) {
63+
blk_mq_free_tag_set(&block->tag_set);
64+
return PTR_ERR(gdp);
65+
}
4866

4967
/* Initialize gendisk structure. */
5068
gdp->major = DASD_MAJOR;
@@ -100,6 +118,7 @@ void dasd_gendisk_free(struct dasd_block *block)
100118
block->gdp->private_data = NULL;
101119
put_disk(block->gdp);
102120
block->gdp = NULL;
121+
blk_mq_free_tag_set(&block->tag_set);
103122
}
104123
}
105124

drivers/s390/block/dasd_int.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,6 @@ struct dasd_device {
642642
struct dasd_block {
643643
/* Block device stuff. */
644644
struct gendisk *gdp;
645-
struct request_queue *request_queue;
646645
spinlock_t request_queue_lock;
647646
struct blk_mq_tag_set tag_set;
648647
struct block_device *bdev;
@@ -850,6 +849,7 @@ extern debug_info_t *dasd_debug_area;
850849
extern struct dasd_profile dasd_global_profile;
851850
extern unsigned int dasd_global_profile_level;
852851
extern const struct block_device_operations dasd_device_operations;
852+
extern struct blk_mq_ops dasd_mq_ops;
853853

854854
extern struct kmem_cache *dasd_page_cache;
855855

0 commit comments

Comments
 (0)