Skip to content

Commit 804e498

Browse files
Christoph Hellwigaxboe
authored andcommitted
sd: convert to the atomic queue limits API
Assign all queue limits through a local queue_limits variable and queue_limits_commit_update so that we can't race updating them from multiple places, and freeze the queue when updating them so that in-progress I/O submissions don't see half-updated limits. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Damien Le Moal <[email protected]> Reviewed-by: John Garry <[email protected]> Reviewed-by: Martin K. Petersen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 9c1d339 commit 804e498

File tree

3 files changed

+85
-66
lines changed

3 files changed

+85
-66
lines changed

drivers/scsi/sd.c

Lines changed: 73 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,13 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_ZBC);
101101

102102
#define SD_MINORS 16
103103

104-
static void sd_config_discard(struct scsi_disk *, unsigned int);
105-
static void sd_config_write_same(struct scsi_disk *);
104+
static void sd_config_discard(struct scsi_disk *sdkp, struct queue_limits *lim,
105+
unsigned int mode);
106+
static void sd_config_write_same(struct scsi_disk *sdkp,
107+
struct queue_limits *lim);
106108
static int sd_revalidate_disk(struct gendisk *);
107109
static void sd_unlock_native_capacity(struct gendisk *disk);
108110
static void sd_shutdown(struct device *);
109-
static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer);
110111
static void scsi_disk_release(struct device *cdev);
111112

112113
static DEFINE_IDA(sd_index_ida);
@@ -456,7 +457,8 @@ provisioning_mode_store(struct device *dev, struct device_attribute *attr,
456457
{
457458
struct scsi_disk *sdkp = to_scsi_disk(dev);
458459
struct scsi_device *sdp = sdkp->device;
459-
int mode;
460+
struct queue_limits lim;
461+
int mode, err;
460462

461463
if (!capable(CAP_SYS_ADMIN))
462464
return -EACCES;
@@ -472,8 +474,13 @@ provisioning_mode_store(struct device *dev, struct device_attribute *attr,
472474
if (mode < 0)
473475
return -EINVAL;
474476

475-
sd_config_discard(sdkp, mode);
476-
477+
lim = queue_limits_start_update(sdkp->disk->queue);
478+
sd_config_discard(sdkp, &lim, mode);
479+
blk_mq_freeze_queue(sdkp->disk->queue);
480+
err = queue_limits_commit_update(sdkp->disk->queue, &lim);
481+
blk_mq_unfreeze_queue(sdkp->disk->queue);
482+
if (err)
483+
return err;
477484
return count;
478485
}
479486
static DEVICE_ATTR_RW(provisioning_mode);
@@ -556,6 +563,7 @@ max_write_same_blocks_store(struct device *dev, struct device_attribute *attr,
556563
{
557564
struct scsi_disk *sdkp = to_scsi_disk(dev);
558565
struct scsi_device *sdp = sdkp->device;
566+
struct queue_limits lim;
559567
unsigned long max;
560568
int err;
561569

@@ -577,8 +585,13 @@ max_write_same_blocks_store(struct device *dev, struct device_attribute *attr,
577585
sdkp->max_ws_blocks = max;
578586
}
579587

580-
sd_config_write_same(sdkp);
581-
588+
lim = queue_limits_start_update(sdkp->disk->queue);
589+
sd_config_write_same(sdkp, &lim);
590+
blk_mq_freeze_queue(sdkp->disk->queue);
591+
err = queue_limits_commit_update(sdkp->disk->queue, &lim);
592+
blk_mq_unfreeze_queue(sdkp->disk->queue);
593+
if (err)
594+
return err;
582595
return count;
583596
}
584597
static DEVICE_ATTR_RW(max_write_same_blocks);
@@ -827,17 +840,15 @@ static void sd_disable_discard(struct scsi_disk *sdkp)
827840
blk_queue_max_discard_sectors(sdkp->disk->queue, 0);
828841
}
829842

830-
static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
843+
static void sd_config_discard(struct scsi_disk *sdkp, struct queue_limits *lim,
844+
unsigned int mode)
831845
{
832-
struct request_queue *q = sdkp->disk->queue;
833846
unsigned int logical_block_size = sdkp->device->sector_size;
834847
unsigned int max_blocks = 0;
835848

836-
q->limits.discard_alignment =
837-
sdkp->unmap_alignment * logical_block_size;
838-
q->limits.discard_granularity =
839-
max(sdkp->physical_block_size,
840-
sdkp->unmap_granularity * logical_block_size);
849+
lim->discard_alignment = sdkp->unmap_alignment * logical_block_size;
850+
lim->discard_granularity = max(sdkp->physical_block_size,
851+
sdkp->unmap_granularity * logical_block_size);
841852
sdkp->provisioning_mode = mode;
842853

843854
switch (mode) {
@@ -875,7 +886,8 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
875886
break;
876887
}
877888

878-
blk_queue_max_discard_sectors(q, max_blocks * (logical_block_size >> 9));
889+
lim->max_hw_discard_sectors = max_blocks *
890+
(logical_block_size >> SECTOR_SHIFT);
879891
}
880892

881893
static void *sd_set_special_bvec(struct request *rq, unsigned int data_len)
@@ -1010,9 +1022,9 @@ static void sd_disable_write_same(struct scsi_disk *sdkp)
10101022
blk_queue_max_write_zeroes_sectors(sdkp->disk->queue, 0);
10111023
}
10121024

1013-
static void sd_config_write_same(struct scsi_disk *sdkp)
1025+
static void sd_config_write_same(struct scsi_disk *sdkp,
1026+
struct queue_limits *lim)
10141027
{
1015-
struct request_queue *q = sdkp->disk->queue;
10161028
unsigned int logical_block_size = sdkp->device->sector_size;
10171029

10181030
if (sdkp->device->no_write_same) {
@@ -1066,8 +1078,8 @@ static void sd_config_write_same(struct scsi_disk *sdkp)
10661078
}
10671079

10681080
out:
1069-
blk_queue_max_write_zeroes_sectors(q, sdkp->max_ws_blocks *
1070-
(logical_block_size >> 9));
1081+
lim->max_write_zeroes_sectors =
1082+
sdkp->max_ws_blocks * (logical_block_size >> SECTOR_SHIFT);
10711083
}
10721084

10731085
static blk_status_t sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
@@ -2523,7 +2535,7 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
25232535
#define READ_CAPACITY_RETRIES_ON_RESET 10
25242536

25252537
static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
2526-
unsigned char *buffer)
2538+
struct queue_limits *lim, unsigned char *buffer)
25272539
{
25282540
unsigned char cmd[16];
25292541
struct scsi_sense_hdr sshdr;
@@ -2597,7 +2609,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
25972609

25982610
/* Lowest aligned logical block */
25992611
alignment = ((buffer[14] & 0x3f) << 8 | buffer[15]) * sector_size;
2600-
blk_queue_alignment_offset(sdp->request_queue, alignment);
2612+
lim->alignment_offset = alignment;
26012613
if (alignment && sdkp->first_scan)
26022614
sd_printk(KERN_NOTICE, sdkp,
26032615
"physical block alignment offset: %u\n", alignment);
@@ -2608,7 +2620,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
26082620
if (buffer[14] & 0x40) /* LBPRZ */
26092621
sdkp->lbprz = 1;
26102622

2611-
sd_config_discard(sdkp, SD_LBP_WS16);
2623+
sd_config_discard(sdkp, lim, SD_LBP_WS16);
26122624
}
26132625

26142626
sdkp->capacity = lba + 1;
@@ -2711,13 +2723,14 @@ static int sd_try_rc16_first(struct scsi_device *sdp)
27112723
* read disk capacity
27122724
*/
27132725
static void
2714-
sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer)
2726+
sd_read_capacity(struct scsi_disk *sdkp, struct queue_limits *lim,
2727+
unsigned char *buffer)
27152728
{
27162729
int sector_size;
27172730
struct scsi_device *sdp = sdkp->device;
27182731

27192732
if (sd_try_rc16_first(sdp)) {
2720-
sector_size = read_capacity_16(sdkp, sdp, buffer);
2733+
sector_size = read_capacity_16(sdkp, sdp, lim, buffer);
27212734
if (sector_size == -EOVERFLOW)
27222735
goto got_data;
27232736
if (sector_size == -ENODEV)
@@ -2737,7 +2750,7 @@ sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer)
27372750
int old_sector_size = sector_size;
27382751
sd_printk(KERN_NOTICE, sdkp, "Very big device. "
27392752
"Trying to use READ CAPACITY(16).\n");
2740-
sector_size = read_capacity_16(sdkp, sdp, buffer);
2753+
sector_size = read_capacity_16(sdkp, sdp, lim, buffer);
27412754
if (sector_size < 0) {
27422755
sd_printk(KERN_NOTICE, sdkp,
27432756
"Using 0xffffffff as device size\n");
@@ -2796,9 +2809,8 @@ sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer)
27962809
*/
27972810
sector_size = 512;
27982811
}
2799-
blk_queue_logical_block_size(sdp->request_queue, sector_size);
2800-
blk_queue_physical_block_size(sdp->request_queue,
2801-
sdkp->physical_block_size);
2812+
lim->logical_block_size = sector_size;
2813+
lim->physical_block_size = sdkp->physical_block_size;
28022814
sdkp->device->sector_size = sector_size;
28032815

28042816
if (sdkp->capacity > 0xffffffff)
@@ -3220,11 +3232,11 @@ static unsigned int sd_discard_mode(struct scsi_disk *sdkp)
32203232
return SD_LBP_DISABLE;
32213233
}
32223234

3223-
/**
3224-
* sd_read_block_limits - Query disk device for preferred I/O sizes.
3225-
* @sdkp: disk to query
3235+
/*
3236+
* Query disk device for preferred I/O sizes.
32263237
*/
3227-
static void sd_read_block_limits(struct scsi_disk *sdkp)
3238+
static void sd_read_block_limits(struct scsi_disk *sdkp,
3239+
struct queue_limits *lim)
32283240
{
32293241
struct scsi_vpd *vpd;
32303242

@@ -3258,7 +3270,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
32583270
sdkp->unmap_alignment =
32593271
get_unaligned_be32(&vpd->data[32]) & ~(1 << 31);
32603272

3261-
sd_config_discard(sdkp, sd_discard_mode(sdkp));
3273+
sd_config_discard(sdkp, lim, sd_discard_mode(sdkp));
32623274
}
32633275

32643276
out:
@@ -3277,11 +3289,9 @@ static void sd_read_block_limits_ext(struct scsi_disk *sdkp)
32773289
rcu_read_unlock();
32783290
}
32793291

3280-
/**
3281-
* sd_read_block_characteristics - Query block dev. characteristics
3282-
* @sdkp: disk to query
3283-
*/
3284-
static void sd_read_block_characteristics(struct scsi_disk *sdkp)
3292+
/* Query block device characteristics */
3293+
static void sd_read_block_characteristics(struct scsi_disk *sdkp,
3294+
struct queue_limits *lim)
32853295
{
32863296
struct request_queue *q = sdkp->disk->queue;
32873297
struct scsi_vpd *vpd;
@@ -3307,29 +3317,26 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
33073317

33083318
#ifdef CONFIG_BLK_DEV_ZONED /* sd_probe rejects ZBD devices early otherwise */
33093319
if (sdkp->device->type == TYPE_ZBC) {
3310-
/*
3311-
* Host-managed.
3312-
*/
3313-
disk_set_zoned(sdkp->disk);
3320+
lim->zoned = true;
33143321

33153322
/*
33163323
* Per ZBC and ZAC specifications, writes in sequential write
33173324
* required zones of host-managed devices must be aligned to
33183325
* the device physical block size.
33193326
*/
3320-
blk_queue_zone_write_granularity(q, sdkp->physical_block_size);
3327+
lim->zone_write_granularity = sdkp->physical_block_size;
33213328
} else {
33223329
/*
33233330
* Host-aware devices are treated as conventional.
33243331
*/
3325-
WARN_ON_ONCE(blk_queue_is_zoned(q));
3332+
lim->zoned = false;
33263333
}
33273334
#endif /* CONFIG_BLK_DEV_ZONED */
33283335

33293336
if (!sdkp->first_scan)
33303337
return;
33313338

3332-
if (blk_queue_is_zoned(q))
3339+
if (lim->zoned)
33333340
sd_printk(KERN_NOTICE, sdkp, "Host-managed zoned block device\n");
33343341
else if (sdkp->zoned == 1)
33353342
sd_printk(KERN_NOTICE, sdkp, "Host-aware SMR disk used as regular disk\n");
@@ -3605,8 +3612,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
36053612
struct scsi_device *sdp = sdkp->device;
36063613
struct request_queue *q = sdkp->disk->queue;
36073614
sector_t old_capacity = sdkp->capacity;
3615+
struct queue_limits lim;
36083616
unsigned char *buffer;
36093617
unsigned int dev_max;
3618+
int err;
36103619

36113620
SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp,
36123621
"sd_revalidate_disk\n"));
@@ -3627,12 +3636,14 @@ static int sd_revalidate_disk(struct gendisk *disk)
36273636

36283637
sd_spinup_disk(sdkp);
36293638

3639+
lim = queue_limits_start_update(sdkp->disk->queue);
3640+
36303641
/*
36313642
* Without media there is no reason to ask; moreover, some devices
36323643
* react badly if we do.
36333644
*/
36343645
if (sdkp->media_present) {
3635-
sd_read_capacity(sdkp, buffer);
3646+
sd_read_capacity(sdkp, &lim, buffer);
36363647
/*
36373648
* Some USB/UAS devices return generic values for mode pages
36383649
* until the media has been accessed. Trigger a READ operation
@@ -3651,10 +3662,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
36513662

36523663
if (scsi_device_supports_vpd(sdp)) {
36533664
sd_read_block_provisioning(sdkp);
3654-
sd_read_block_limits(sdkp);
3665+
sd_read_block_limits(sdkp, &lim);
36553666
sd_read_block_limits_ext(sdkp);
3656-
sd_read_block_characteristics(sdkp);
3657-
sd_zbc_read_zones(sdkp, buffer);
3667+
sd_read_block_characteristics(sdkp, &lim);
3668+
sd_zbc_read_zones(sdkp, &lim, buffer);
36583669
sd_read_cpr(sdkp);
36593670
}
36603671

@@ -3680,31 +3691,36 @@ static int sd_revalidate_disk(struct gendisk *disk)
36803691

36813692
/* Some devices report a maximum block count for READ/WRITE requests. */
36823693
dev_max = min_not_zero(dev_max, sdkp->max_xfer_blocks);
3683-
q->limits.max_dev_sectors = logical_to_sectors(sdp, dev_max);
3694+
lim.max_dev_sectors = logical_to_sectors(sdp, dev_max);
36843695

36853696
if (sd_validate_min_xfer_size(sdkp))
3686-
blk_queue_io_min(sdkp->disk->queue,
3687-
logical_to_bytes(sdp, sdkp->min_xfer_blocks));
3697+
lim.io_min = logical_to_bytes(sdp, sdkp->min_xfer_blocks);
36883698
else
3689-
blk_queue_io_min(sdkp->disk->queue, 0);
3699+
lim.io_min = 0;
36903700

36913701
/*
36923702
* Limit default to SCSI host optimal sector limit if set. There may be
36933703
* an impact on performance for when the size of a request exceeds this
36943704
* host limit.
36953705
*/
3696-
q->limits.io_opt = sdp->host->opt_sectors << SECTOR_SHIFT;
3706+
lim.io_opt = sdp->host->opt_sectors << SECTOR_SHIFT;
36973707
if (sd_validate_opt_xfer_size(sdkp, dev_max)) {
3698-
q->limits.io_opt = min_not_zero(q->limits.io_opt,
3708+
lim.io_opt = min_not_zero(lim.io_opt,
36993709
logical_to_bytes(sdp, sdkp->opt_xfer_blocks));
37003710
}
37013711

37023712
sdkp->first_scan = 0;
37033713

37043714
set_capacity_and_notify(disk, logical_to_sectors(sdp, sdkp->capacity));
3705-
sd_config_write_same(sdkp);
3715+
sd_config_write_same(sdkp, &lim);
37063716
kfree(buffer);
37073717

3718+
blk_mq_freeze_queue(sdkp->disk->queue);
3719+
err = queue_limits_commit_update(sdkp->disk->queue, &lim);
3720+
blk_mq_unfreeze_queue(sdkp->disk->queue);
3721+
if (err)
3722+
return err;
3723+
37083724
/*
37093725
* For a zoned drive, revalidating the zones can be done only once
37103726
* the gendisk capacity is set. So if this fails, set back the gendisk

drivers/scsi/sd.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,8 @@ static inline int sd_is_zoned(struct scsi_disk *sdkp)
239239

240240
#ifdef CONFIG_BLK_DEV_ZONED
241241

242-
int sd_zbc_read_zones(struct scsi_disk *sdkp, u8 buf[SD_BUF_SIZE]);
242+
int sd_zbc_read_zones(struct scsi_disk *sdkp, struct queue_limits *lim,
243+
u8 buf[SD_BUF_SIZE]);
243244
int sd_zbc_revalidate_zones(struct scsi_disk *sdkp);
244245
blk_status_t sd_zbc_setup_zone_mgmt_cmnd(struct scsi_cmnd *cmd,
245246
unsigned char op, bool all);
@@ -250,7 +251,8 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
250251

251252
#else /* CONFIG_BLK_DEV_ZONED */
252253

253-
static inline int sd_zbc_read_zones(struct scsi_disk *sdkp, u8 buf[SD_BUF_SIZE])
254+
static inline int sd_zbc_read_zones(struct scsi_disk *sdkp,
255+
struct queue_limits *lim, u8 buf[SD_BUF_SIZE])
254256
{
255257
return 0;
256258
}

0 commit comments

Comments
 (0)