Skip to content

Commit 0127a47

Browse files
Christoph Hellwigaxboe
authored andcommitted
dasd: move queue setup to common code
Most of the code in setup_blk_queue is shared between all disciplines. Move it to common code and leave a method to query the maximum number of transferable blocks, and a flag to indicate discard support. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Stefan Haberland <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 41463f2 commit 0127a47

File tree

5 files changed

+42
-77
lines changed

5 files changed

+42
-77
lines changed

drivers/s390/block/dasd.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ static int dasd_state_basic_to_known(struct dasd_device *device)
308308
static int dasd_state_basic_to_ready(struct dasd_device *device)
309309
{
310310
struct dasd_block *block = device->block;
311+
struct request_queue *q;
311312
int rc = 0;
312313

313314
/* make disk known with correct capacity */
@@ -327,8 +328,32 @@ static int dasd_state_basic_to_ready(struct dasd_device *device)
327328
goto out;
328329
}
329330

330-
if (device->discipline->setup_blk_queue)
331-
device->discipline->setup_blk_queue(block);
331+
q = block->gdp->queue;
332+
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
333+
q->limits.max_dev_sectors = device->discipline->max_sectors(block);
334+
blk_queue_max_hw_sectors(q, q->limits.max_dev_sectors);
335+
blk_queue_logical_block_size(q, block->bp_block);
336+
blk_queue_max_segments(q, USHRT_MAX);
337+
338+
/* With page sized segments each segment can be translated into one idaw/tidaw */
339+
blk_queue_max_segment_size(q, PAGE_SIZE);
340+
blk_queue_segment_boundary(q, PAGE_SIZE - 1);
341+
blk_queue_dma_alignment(q, PAGE_SIZE - 1);
342+
343+
if (device->discipline->has_discard) {
344+
unsigned int max_bytes, max_discard_sectors;
345+
346+
q->limits.discard_granularity = block->bp_block;
347+
348+
/* Calculate max_discard_sectors and make it PAGE aligned */
349+
max_bytes = USHRT_MAX * block->bp_block;
350+
max_bytes = ALIGN_DOWN(max_bytes, PAGE_SIZE);
351+
max_discard_sectors = max_bytes / block->bp_block;
352+
353+
blk_queue_max_discard_sectors(q, max_discard_sectors);
354+
blk_queue_max_write_zeroes_sectors(q, max_discard_sectors);
355+
}
356+
332357
set_capacity(block->gdp, block->blocks << block->s2b_shift);
333358
device->state = DASD_STATE_READY;
334359

drivers/s390/block/dasd_diag.c

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -617,25 +617,9 @@ dasd_diag_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
617617
"dump sense not available for DIAG data");
618618
}
619619

620-
/*
621-
* Initialize block layer request queue.
622-
*/
623-
static void dasd_diag_setup_blk_queue(struct dasd_block *block)
620+
static unsigned int dasd_diag_max_sectors(struct dasd_block *block)
624621
{
625-
unsigned int logical_block_size = block->bp_block;
626-
struct request_queue *q = block->gdp->queue;
627-
int max;
628-
629-
max = DIAG_MAX_BLOCKS << block->s2b_shift;
630-
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
631-
q->limits.max_dev_sectors = max;
632-
blk_queue_logical_block_size(q, logical_block_size);
633-
blk_queue_max_hw_sectors(q, max);
634-
blk_queue_max_segments(q, USHRT_MAX);
635-
/* With page sized segments each segment can be translated into one idaw/tidaw */
636-
blk_queue_max_segment_size(q, PAGE_SIZE);
637-
blk_queue_segment_boundary(q, PAGE_SIZE - 1);
638-
blk_queue_dma_alignment(q, PAGE_SIZE - 1);
622+
return DIAG_MAX_BLOCKS << block->s2b_shift;
639623
}
640624

641625
static int dasd_diag_pe_handler(struct dasd_device *device,
@@ -648,10 +632,10 @@ static struct dasd_discipline dasd_diag_discipline = {
648632
.owner = THIS_MODULE,
649633
.name = "DIAG",
650634
.ebcname = "DIAG",
635+
.max_sectors = dasd_diag_max_sectors,
651636
.check_device = dasd_diag_check_device,
652637
.pe_handler = dasd_diag_pe_handler,
653638
.fill_geometry = dasd_diag_fill_geometry,
654-
.setup_blk_queue = dasd_diag_setup_blk_queue,
655639
.start_IO = dasd_start_diag,
656640
.term_IO = dasd_diag_term_IO,
657641
.handle_terminated_request = dasd_diag_handle_terminated_request,

drivers/s390/block/dasd_eckd.c

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6826,37 +6826,20 @@ static void dasd_eckd_handle_hpf_error(struct dasd_device *device,
68266826
dasd_schedule_requeue(device);
68276827
}
68286828

6829-
/*
6830-
* Initialize block layer request queue.
6831-
*/
6832-
static void dasd_eckd_setup_blk_queue(struct dasd_block *block)
6829+
static unsigned int dasd_eckd_max_sectors(struct dasd_block *block)
68336830
{
6834-
unsigned int logical_block_size = block->bp_block;
6835-
struct request_queue *q = block->gdp->queue;
6836-
struct dasd_device *device = block->base;
6837-
int max;
6838-
6839-
if (device->features & DASD_FEATURE_USERAW) {
6831+
if (block->base->features & DASD_FEATURE_USERAW) {
68406832
/*
68416833
* the max_blocks value for raw_track access is 256
68426834
* it is higher than the native ECKD value because we
68436835
* only need one ccw per track
68446836
* so the max_hw_sectors are
68456837
* 2048 x 512B = 1024kB = 16 tracks
68466838
*/
6847-
max = DASD_ECKD_MAX_BLOCKS_RAW << block->s2b_shift;
6848-
} else {
6849-
max = DASD_ECKD_MAX_BLOCKS << block->s2b_shift;
6839+
return DASD_ECKD_MAX_BLOCKS_RAW << block->s2b_shift;
68506840
}
6851-
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
6852-
q->limits.max_dev_sectors = max;
6853-
blk_queue_logical_block_size(q, logical_block_size);
6854-
blk_queue_max_hw_sectors(q, max);
6855-
blk_queue_max_segments(q, USHRT_MAX);
6856-
/* With page sized segments each segment can be translated into one idaw/tidaw */
6857-
blk_queue_max_segment_size(q, PAGE_SIZE);
6858-
blk_queue_segment_boundary(q, PAGE_SIZE - 1);
6859-
blk_queue_dma_alignment(q, PAGE_SIZE - 1);
6841+
6842+
return DASD_ECKD_MAX_BLOCKS << block->s2b_shift;
68606843
}
68616844

68626845
static struct ccw_driver dasd_eckd_driver = {
@@ -6888,7 +6871,7 @@ static struct dasd_discipline dasd_eckd_discipline = {
68886871
.basic_to_ready = dasd_eckd_basic_to_ready,
68896872
.online_to_ready = dasd_eckd_online_to_ready,
68906873
.basic_to_known = dasd_eckd_basic_to_known,
6891-
.setup_blk_queue = dasd_eckd_setup_blk_queue,
6874+
.max_sectors = dasd_eckd_max_sectors,
68926875
.fill_geometry = dasd_eckd_fill_geometry,
68936876
.start_IO = dasd_start_IO,
68946877
.term_IO = dasd_term_IO,

drivers/s390/block/dasd_fba.c

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -748,35 +748,9 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
748748
free_page((unsigned long) page);
749749
}
750750

751-
/*
752-
* Initialize block layer request queue.
753-
*/
754-
static void dasd_fba_setup_blk_queue(struct dasd_block *block)
751+
static unsigned int dasd_fba_max_sectors(struct dasd_block *block)
755752
{
756-
unsigned int logical_block_size = block->bp_block;
757-
struct request_queue *q = block->gdp->queue;
758-
unsigned int max_bytes, max_discard_sectors;
759-
int max;
760-
761-
max = DASD_FBA_MAX_BLOCKS << block->s2b_shift;
762-
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
763-
q->limits.max_dev_sectors = max;
764-
blk_queue_logical_block_size(q, logical_block_size);
765-
blk_queue_max_hw_sectors(q, max);
766-
blk_queue_max_segments(q, USHRT_MAX);
767-
/* With page sized segments each segment can be translated into one idaw/tidaw */
768-
blk_queue_max_segment_size(q, PAGE_SIZE);
769-
blk_queue_segment_boundary(q, PAGE_SIZE - 1);
770-
771-
q->limits.discard_granularity = logical_block_size;
772-
773-
/* Calculate max_discard_sectors and make it PAGE aligned */
774-
max_bytes = USHRT_MAX * logical_block_size;
775-
max_bytes = ALIGN_DOWN(max_bytes, PAGE_SIZE);
776-
max_discard_sectors = max_bytes / logical_block_size;
777-
778-
blk_queue_max_discard_sectors(q, max_discard_sectors);
779-
blk_queue_max_write_zeroes_sectors(q, max_discard_sectors);
753+
return DASD_FBA_MAX_BLOCKS << block->s2b_shift;
780754
}
781755

782756
static int dasd_fba_pe_handler(struct dasd_device *device,
@@ -789,10 +763,11 @@ static struct dasd_discipline dasd_fba_discipline = {
789763
.owner = THIS_MODULE,
790764
.name = "FBA ",
791765
.ebcname = "FBA ",
766+
.has_discard = true,
792767
.check_device = dasd_fba_check_characteristics,
793768
.do_analysis = dasd_fba_do_analysis,
794769
.pe_handler = dasd_fba_pe_handler,
795-
.setup_blk_queue = dasd_fba_setup_blk_queue,
770+
.max_sectors = dasd_fba_max_sectors,
796771
.fill_geometry = dasd_fba_fill_geometry,
797772
.start_IO = dasd_start_IO,
798773
.term_IO = dasd_term_IO,

drivers/s390/block/dasd_int.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ struct dasd_discipline {
293293
struct module *owner;
294294
char ebcname[8]; /* a name used for tagging and printks */
295295
char name[8]; /* a name used for tagging and printks */
296+
bool has_discard;
296297

297298
struct list_head list; /* used for list of disciplines */
298299

@@ -331,10 +332,7 @@ struct dasd_discipline {
331332
int (*online_to_ready) (struct dasd_device *);
332333
int (*basic_to_known)(struct dasd_device *);
333334

334-
/*
335-
* Initialize block layer request queue.
336-
*/
337-
void (*setup_blk_queue)(struct dasd_block *);
335+
unsigned int (*max_sectors)(struct dasd_block *);
338336
/* (struct dasd_device *);
339337
* Device operation functions. build_cp creates a ccw chain for
340338
* a block device request, start_io starts the request and

0 commit comments

Comments
 (0)