Commit c68f4f4e authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarStefan Haberland <sth@linux.ibm.com>
Signed-off-by: default avatarStefan Haberland <sth@linux.ibm.com>
Link: https://lore.kernel.org/r/20220928143945.1687114-2-sth@linux.ibm.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 5765033c
Loading
Loading
Loading
Loading
+9 −74
Original line number Original line Diff line number Diff line
@@ -41,15 +41,6 @@


#define DASD_DIAG_MOD		"dasd_diag_mod"
#define DASD_DIAG_MOD		"dasd_diag_mod"


static unsigned int queue_depth = 32;
static unsigned int nr_hw_queues = 4;

module_param(queue_depth, uint, 0444);
MODULE_PARM_DESC(queue_depth, "Default queue depth for new DASD devices");

module_param(nr_hw_queues, uint, 0444);
MODULE_PARM_DESC(nr_hw_queues, "Default number of hardware queues for new DASD devices");

/*
/*
 * SECTION: exported variables of dasd.c
 * SECTION: exported variables of dasd.c
 */
 */
@@ -68,8 +59,6 @@ MODULE_LICENSE("GPL");
/*
/*
 * SECTION: prototypes for static functions of dasd.c
 * SECTION: prototypes for static functions of dasd.c
 */
 */
static int  dasd_alloc_queue(struct dasd_block *);
static void dasd_free_queue(struct dasd_block *);
static int dasd_flush_block_queue(struct dasd_block *);
static int dasd_flush_block_queue(struct dasd_block *);
static void dasd_device_tasklet(unsigned long);
static void dasd_device_tasklet(unsigned long);
static void dasd_block_tasklet(unsigned long);
static void dasd_block_tasklet(unsigned long);
@@ -198,21 +187,11 @@ EXPORT_SYMBOL_GPL(dasd_free_block);
 */
 */
static int dasd_state_new_to_known(struct dasd_device *device)
static int dasd_state_new_to_known(struct dasd_device *device)
{
{
	int rc;

	/*
	/*
	 * As long as the device is not in state DASD_STATE_NEW we want to
	 * As long as the device is not in state DASD_STATE_NEW we want to
	 * keep the reference count > 0.
	 * keep the reference count > 0.
	 */
	 */
	dasd_get_device(device);
	dasd_get_device(device);

	if (device->block) {
		rc = dasd_alloc_queue(device->block);
		if (rc) {
			dasd_put_device(device);
			return rc;
		}
	}
	device->state = DASD_STATE_KNOWN;
	device->state = DASD_STATE_KNOWN;
	return 0;
	return 0;
}
}
@@ -226,9 +205,6 @@ static int dasd_state_known_to_new(struct dasd_device *device)
	dasd_eer_disable(device);
	dasd_eer_disable(device);
	device->state = DASD_STATE_NEW;
	device->state = DASD_STATE_NEW;


	if (device->block)
		dasd_free_queue(device->block);

	/* Give up reference we took in dasd_state_new_to_known. */
	/* Give up reference we took in dasd_state_new_to_known. */
	dasd_put_device(device);
	dasd_put_device(device);
	return 0;
	return 0;
@@ -1591,9 +1567,8 @@ void dasd_generic_handle_state_change(struct dasd_device *device)
	dasd_schedule_device_bh(device);
	dasd_schedule_device_bh(device);
	if (device->block) {
	if (device->block) {
		dasd_schedule_block_bh(device->block);
		dasd_schedule_block_bh(device->block);
		if (device->block->request_queue)
		if (device->block->gdp)
			blk_mq_run_hw_queues(device->block->request_queue,
			blk_mq_run_hw_queues(device->block->gdp->queue, true);
					     true);
	}
	}
}
}
EXPORT_SYMBOL_GPL(dasd_generic_handle_state_change);
EXPORT_SYMBOL_GPL(dasd_generic_handle_state_change);
@@ -2691,7 +2666,7 @@ static void dasd_block_timeout(struct timer_list *t)
	dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING);
	dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING);
	spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags);
	spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags);
	dasd_schedule_block_bh(block);
	dasd_schedule_block_bh(block);
	blk_mq_run_hw_queues(block->request_queue, true);
	blk_mq_run_hw_queues(block->gdp->queue, true);
}
}


/*
/*
@@ -3239,7 +3214,7 @@ static void dasd_request_done(struct request *req)
	blk_mq_run_hw_queues(req->q, true);
	blk_mq_run_hw_queues(req->q, true);
}
}


static struct blk_mq_ops dasd_mq_ops = {
struct blk_mq_ops dasd_mq_ops = {
	.queue_rq = do_dasd_request,
	.queue_rq = do_dasd_request,
	.complete = dasd_request_done,
	.complete = dasd_request_done,
	.timeout = dasd_times_out,
	.timeout = dasd_times_out,
@@ -3247,45 +3222,6 @@ static struct blk_mq_ops dasd_mq_ops = {
	.exit_hctx = dasd_exit_hctx,
	.exit_hctx = dasd_exit_hctx,
};
};


/*
 * Allocate and initialize request queue and default I/O scheduler.
 */
static int dasd_alloc_queue(struct dasd_block *block)
{
	int rc;

	block->tag_set.ops = &dasd_mq_ops;
	block->tag_set.cmd_size = sizeof(struct dasd_ccw_req);
	block->tag_set.nr_hw_queues = nr_hw_queues;
	block->tag_set.queue_depth = queue_depth;
	block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
	block->tag_set.numa_node = NUMA_NO_NODE;

	rc = blk_mq_alloc_tag_set(&block->tag_set);
	if (rc)
		return rc;

	block->request_queue = blk_mq_init_queue(&block->tag_set);
	if (IS_ERR(block->request_queue))
		return PTR_ERR(block->request_queue);

	block->request_queue->queuedata = block;

	return 0;
}

/*
 * Deactivate and free request queue.
 */
static void dasd_free_queue(struct dasd_block *block)
{
	if (block->request_queue) {
		blk_mq_destroy_queue(block->request_queue);
		blk_mq_free_tag_set(&block->tag_set);
		block->request_queue = NULL;
	}
}

static int dasd_open(struct block_device *bdev, fmode_t mode)
static int dasd_open(struct block_device *bdev, fmode_t mode)
{
{
	struct dasd_device *base;
	struct dasd_device *base;
@@ -3762,9 +3698,8 @@ int dasd_generic_path_operational(struct dasd_device *device)
	dasd_schedule_device_bh(device);
	dasd_schedule_device_bh(device);
	if (device->block) {
	if (device->block) {
		dasd_schedule_block_bh(device->block);
		dasd_schedule_block_bh(device->block);
		if (device->block->request_queue)
		if (device->block->gdp)
			blk_mq_run_hw_queues(device->block->request_queue,
			blk_mq_run_hw_queues(device->block->gdp->queue, true);
					     true);
	}
	}


	if (!device->stopped)
	if (!device->stopped)
@@ -3916,8 +3851,8 @@ void dasd_generic_space_avail(struct dasd_device *device)


	if (device->block) {
	if (device->block) {
		dasd_schedule_block_bh(device->block);
		dasd_schedule_block_bh(device->block);
		if (device->block->request_queue)
		if (device->block->gdp)
			blk_mq_run_hw_queues(device->block->request_queue, true);
			blk_mq_run_hw_queues(device->block->gdp->queue, true);
	}
	}
	if (!device->stopped)
	if (!device->stopped)
		wake_up(&generic_waitq);
		wake_up(&generic_waitq);
+2 −5
Original line number Original line Diff line number Diff line
@@ -1578,7 +1578,6 @@ dasd_timeout_store(struct device *dev, struct device_attribute *attr,
		   const char *buf, size_t count)
		   const char *buf, size_t count)
{
{
	struct dasd_device *device;
	struct dasd_device *device;
	struct request_queue *q;
	unsigned long val;
	unsigned long val;


	device = dasd_device_from_cdev(to_ccwdev(dev));
	device = dasd_device_from_cdev(to_ccwdev(dev));
@@ -1590,15 +1589,13 @@ dasd_timeout_store(struct device *dev, struct device_attribute *attr,
		dasd_put_device(device);
		dasd_put_device(device);
		return -EINVAL;
		return -EINVAL;
	}
	}
	q = device->block->request_queue;
	if (!device->block->gdp) {
	if (!q) {
		dasd_put_device(device);
		dasd_put_device(device);
		return -ENODEV;
		return -ENODEV;
	}
	}


	device->blk_timeout = val;
	device->blk_timeout = val;

	blk_queue_rq_timeout(device->block->gdp->queue, val * HZ);
	blk_queue_rq_timeout(q, device->blk_timeout * HZ);


	dasd_put_device(device);
	dasd_put_device(device);
	return count;
	return count;
+1 −1
Original line number Original line Diff line number Diff line
@@ -627,7 +627,7 @@ dasd_diag_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
static void dasd_diag_setup_blk_queue(struct dasd_block *block)
static void dasd_diag_setup_blk_queue(struct dasd_block *block)
{
{
	unsigned int logical_block_size = block->bp_block;
	unsigned int logical_block_size = block->bp_block;
	struct request_queue *q = block->request_queue;
	struct request_queue *q = block->gdp->queue;
	int max;
	int max;


	max = DIAG_MAX_BLOCKS << block->s2b_shift;
	max = DIAG_MAX_BLOCKS << block->s2b_shift;
+1 −1
Original line number Original line Diff line number Diff line
@@ -6844,7 +6844,7 @@ static void dasd_eckd_handle_hpf_error(struct dasd_device *device,
static void dasd_eckd_setup_blk_queue(struct dasd_block *block)
static void dasd_eckd_setup_blk_queue(struct dasd_block *block)
{
{
	unsigned int logical_block_size = block->bp_block;
	unsigned int logical_block_size = block->bp_block;
	struct request_queue *q = block->request_queue;
	struct request_queue *q = block->gdp->queue;
	struct dasd_device *device = block->base;
	struct dasd_device *device = block->base;
	int max;
	int max;


+1 −1
Original line number Original line Diff line number Diff line
@@ -767,7 +767,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
static void dasd_fba_setup_blk_queue(struct dasd_block *block)
static void dasd_fba_setup_blk_queue(struct dasd_block *block)
{
{
	unsigned int logical_block_size = block->bp_block;
	unsigned int logical_block_size = block->bp_block;
	struct request_queue *q = block->request_queue;
	struct request_queue *q = block->gdp->queue;
	unsigned int max_bytes, max_discard_sectors;
	unsigned int max_bytes, max_discard_sectors;
	int max;
	int max;


Loading