From: Bart Van Assche <bvanassche@acm.org>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-fsdevel@vger.kernel.org,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Christoph Hellwig <hch@lst.de>,
Bart Van Assche <bvanassche@acm.org>,
Damien Le Moal <dlemoal@kernel.org>,
"James E.J. Bottomley" <jejb@linux.ibm.com>
Subject: [PATCH 07/13] sd: Translate data lifetime information
Date: Wed, 20 Sep 2023 12:14:32 -0700 [thread overview]
Message-ID: <20230920191442.3701673-8-bvanassche@acm.org> (raw)
In-Reply-To: <20230920191442.3701673-1-bvanassche@acm.org>
Recently T10 standardized SBC constrained streams. This mechanism enables
passing data lifetime information to SCSI devices in the group number
field. Add support for translating write hint information into a
permanent stream number in the sd driver.
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
drivers/scsi/sd.c | 65 ++++++++++++++++++++++++++++++++++++++++++++---
drivers/scsi/sd.h | 1 +
2 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 879edbc1a065..7bbc58cd99d1 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1001,12 +1001,38 @@ static blk_status_t sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
return BLK_STS_OK;
}
+/**
+ * sd_group_number() - Compute the GROUP NUMBER field
+ * @cmd: SCSI command for which to compute the value of the six-bit GROUP NUMBER
+ * field.
+ *
+ * From "SBC-5 Constrained Streams with Data Lifetimes"
+ * (https://www.t10.org/cgi-bin/ac.pl?t=d&f=23-024r3.pdf):
+ * 0: no relative lifetime.
+ * 1: shortest relative lifetime.
+ * 2: second shortest relative lifetime.
+ * 3 - 0x3d: intermediate relative lifetimes.
+ * 0x3e: second longest relative lifetime.
+ * 0x3f: longest relative lifetime.
+ */
+static u8 sd_group_number(struct scsi_cmnd *cmd)
+{
+ const struct request *rq = scsi_cmd_to_rq(cmd);
+ struct scsi_disk *sdkp = scsi_disk(rq->q->disk);
+ const int max_gn = min_t(u16, sdkp->permanent_stream_count, 0x3f);
+
+ if (!sdkp->rscs || rq->write_hint == WRITE_LIFE_NOT_SET)
+ return 0;
+ return min(rq->write_hint - WRITE_LIFE_NONE, max_gn);
+}
+
static blk_status_t sd_setup_rw32_cmnd(struct scsi_cmnd *cmd, bool write,
sector_t lba, unsigned int nr_blocks,
unsigned char flags, unsigned int dld)
{
cmd->cmd_len = SD_EXT_CDB_SIZE;
cmd->cmnd[0] = VARIABLE_LENGTH_CMD;
+ cmd->cmnd[6] = sd_group_number(cmd);
cmd->cmnd[7] = 0x18; /* Additional CDB len */
cmd->cmnd[9] = write ? WRITE_32 : READ_32;
cmd->cmnd[10] = flags;
@@ -1025,7 +1051,7 @@ static blk_status_t sd_setup_rw16_cmnd(struct scsi_cmnd *cmd, bool write,
cmd->cmd_len = 16;
cmd->cmnd[0] = write ? WRITE_16 : READ_16;
cmd->cmnd[1] = flags | ((dld >> 2) & 0x01);
- cmd->cmnd[14] = (dld & 0x03) << 6;
+ cmd->cmnd[14] = ((dld & 0x03) << 6) | sd_group_number(cmd);
cmd->cmnd[15] = 0;
put_unaligned_be64(lba, &cmd->cmnd[2]);
put_unaligned_be32(nr_blocks, &cmd->cmnd[10]);
@@ -1040,7 +1066,7 @@ static blk_status_t sd_setup_rw10_cmnd(struct scsi_cmnd *cmd, bool write,
cmd->cmd_len = 10;
cmd->cmnd[0] = write ? WRITE_10 : READ_10;
cmd->cmnd[1] = flags;
- cmd->cmnd[6] = 0;
+ cmd->cmnd[6] = sd_group_number(cmd);
cmd->cmnd[9] = 0;
put_unaligned_be32(lba, &cmd->cmnd[2]);
put_unaligned_be16(nr_blocks, &cmd->cmnd[7]);
@@ -1177,7 +1203,8 @@ static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *cmd)
ret = sd_setup_rw16_cmnd(cmd, write, lba, nr_blocks,
protect | fua, dld);
} else if ((nr_blocks > 0xff) || (lba > 0x1fffff) ||
- sdp->use_10_for_rw || protect) {
+ sdp->use_10_for_rw || protect ||
+ rq->write_hint != WRITE_LIFE_NOT_SET) {
ret = sd_setup_rw10_cmnd(cmd, write, lba, nr_blocks,
protect | fua);
} else {
@@ -2912,6 +2939,37 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
sdkp->DPOFUA = 0;
}
+static void sd_read_io_hints(struct scsi_disk *sdkp, unsigned char *buffer)
+{
+ struct scsi_device *sdp = sdkp->device;
+ const struct scsi_io_group_descriptor *desc, *start, *end;
+ struct scsi_sense_hdr sshdr;
+ struct scsi_mode_data data;
+ int res;
+
+ res = scsi_mode_sense(sdp, /*dbd=*/0x8, /*modepage=*/0x0a,
+ /*subpage=*/0x05, buffer, SD_BUF_SIZE,
+ SD_TIMEOUT, sdkp->max_retries, &data, &sshdr);
+ if (res < 0)
+ return;
+ start = (void *)buffer + data.header_length + 16;
+ end = (void *)buffer + ((data.header_length + data.length)
+ & ~(sizeof(*end) - 1));
+ /*
+ * From "SBC-5 Constrained Streams with Data Lifetimes": Device severs
+ * should assign the lowest numbered stream identifiers to permanent
+ * streams.
+ */
+ for (desc = start; desc < end; desc++)
+ if (!desc->st_enble)
+ break;
+ sdkp->permanent_stream_count = desc - start;
+ if (sdkp->rscs && sdkp->permanent_stream_count < 2)
+ sdev_printk(KERN_INFO, sdp,
+ "Unexpected: RSCS has been set and the permanent stream count is %u\n",
+ sdkp->permanent_stream_count);
+}
+
/*
* The ATO bit indicates whether the DIF application tag is available
* for use by the operating system.
@@ -3395,6 +3453,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
sd_read_write_protect_flag(sdkp, buffer);
sd_read_cache_type(sdkp, buffer);
+ sd_read_io_hints(sdkp, buffer);
sd_read_app_tag_own(sdkp, buffer);
sd_read_write_same(sdkp, buffer);
sd_read_security(sdkp, buffer);
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index 84685168b6e0..1863de5ebae4 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -125,6 +125,7 @@ struct scsi_disk {
unsigned int physical_block_size;
unsigned int max_medium_access_timeouts;
unsigned int medium_access_timed_out;
+ u16 permanent_stream_count; /* maximum number of streams */
u8 media_present;
u8 write_prot;
u8 protection_type;/* Data Integrity Field */
next prev parent reply other threads:[~2023-09-20 19:15 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-20 19:14 [PATCH 00/13] Pass data temperature information to zoned UFS devices Bart Van Assche
2023-09-20 19:14 ` [PATCH 01/13] fs/f2fs: Restore the whint_mode mount option Bart Van Assche
2023-10-02 10:32 ` Avri Altman
2023-10-03 19:33 ` Bean Huo
2023-09-20 19:14 ` [PATCH 02/13] fs: Restore support for F_GET_FILE_RW_HINT and F_SET_FILE_RW_HINT Bart Van Assche
2023-10-02 10:35 ` Avri Altman
2023-10-03 19:42 ` Bean Huo
2023-09-20 19:14 ` [PATCH 03/13] fs: Restore kiocb.ki_hint Bart Van Assche
2023-10-02 10:45 ` Avri Altman
2023-10-02 16:39 ` Bart Van Assche
2023-09-20 19:14 ` [PATCH 04/13] block: Restore write hint support Bart Van Assche
2023-10-02 11:23 ` Avri Altman
2023-10-02 17:02 ` Bart Van Assche
2023-10-02 18:08 ` Avri Altman
2023-10-03 19:52 ` Bean Huo
2023-09-20 19:14 ` [PATCH 05/13] scsi: core: Query the Block Limits Extension VPD page Bart Van Assche
2023-10-02 11:29 ` Avri Altman
2023-09-20 19:14 ` [PATCH 06/13] scsi_proto: Add struct io_group_descriptor Bart Van Assche
2023-10-02 11:41 ` Avri Altman
2023-10-02 17:16 ` Bart Van Assche
2023-10-02 18:16 ` Avri Altman
2023-09-20 19:14 ` Bart Van Assche [this message]
2023-10-02 13:11 ` [PATCH 07/13] sd: Translate data lifetime information Avri Altman
2023-10-02 17:42 ` Bart Van Assche
2023-10-03 5:48 ` Avri Altman
2023-10-03 16:58 ` Bart Van Assche
2023-10-03 16:59 ` Bart Van Assche
2023-09-20 19:14 ` [PATCH 08/13] scsi_debug: Reduce code duplication Bart Van Assche
2023-10-03 6:49 ` Avri Altman
2023-09-20 19:14 ` [PATCH 09/13] scsi_debug: Support the block limits extension VPD page Bart Van Assche
2023-09-20 19:14 ` [PATCH 10/13] scsi_debug: Rework page code error handling Bart Van Assche
2023-09-20 19:14 ` [PATCH 11/13] scsi_debug: Rework subpage " Bart Van Assche
2023-09-20 19:14 ` [PATCH 12/13] scsi_debug: Implement the IO Advice Hints Grouping mode page Bart Van Assche
2023-09-20 19:14 ` [PATCH 13/13] scsi_debug: Maintain write statistics per group number Bart Van Assche
2023-09-20 19:28 ` [PATCH 00/13] Pass data temperature information to zoned UFS devices Matthew Wilcox
2023-09-20 20:46 ` Bart Van Assche
2023-09-21 7:46 ` Niklas Cassel
2023-09-21 14:27 ` Bart Van Assche
2023-09-21 15:34 ` Niklas Cassel
2023-09-21 17:00 ` Bart Van Assche
2023-09-21 19:27 ` Matthew Wilcox
2023-09-21 19:39 ` Bart Van Assche
2023-09-21 19:46 ` Matthew Wilcox
2023-09-21 20:11 ` Bart Van Assche
2023-09-21 20:47 ` Jaegeuk Kim
2023-09-27 19:14 ` Martin K. Petersen
2023-09-27 20:49 ` Bart Van Assche
2023-10-02 11:38 ` Niklas Cassel
2023-10-02 11:53 ` Niklas Cassel
2023-10-02 16:33 ` Bart Van Assche
2023-10-02 19:19 ` Niklas Cassel
2023-10-02 17:20 ` Bart Van Assche
2023-10-03 1:40 ` Martin K. Petersen
2023-10-03 17:26 ` Bart Van Assche
2023-10-03 18:45 ` Niklas Cassel
2023-10-04 3:17 ` Martin K. Petersen
[not found] ` <CGME20230920191557epcas2p34a114957acf221c0d8f60acbb3107c77@epcms2p6>
2023-10-05 11:41 ` [PATCH 01/13] fs/f2fs: Restore the whint_mode mount option Daejun Park
[not found] ` <CGME20230920191549epcas2p35174687f1bebe87c42a658fa6aa57bff@epcms2p7>
2023-10-05 11:43 ` [PATCH 02/13] fs: Restore support for F_GET_FILE_RW_HINT and F_SET_FILE_RW_HINT Daejun Park
[not found] ` <CGME20230920191556epcas2p39b150e6715248b625588a50b333e82e2@epcms2p1>
2023-10-05 11:46 ` [PATCH 04/13] block: Restore write hint support Daejun Park
[not found] ` <CGME20230920191816epcas2p1b30d19aa41e51ffaf7c95f9100ee6311@epcms2p3>
2023-10-05 11:58 ` [PATCH 05/13] scsi: core: Query the Block Limits Extension VPD page Daejun Park
[not found] ` <CGME20230920191554epcas2p2280a25d6b2a7fa81563bd6cf1e75549d@epcms2p8>
2023-10-05 11:59 ` [PATCH 06/13] scsi_proto: Add struct io_group_descriptor Daejun Park
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230920191442.3701673-8-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=dlemoal@kernel.org \
--cc=hch@lst.de \
--cc=jejb@linux.ibm.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).