From: Bart Van Assche <bvanassche@acm.org>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org, linux-scsi@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>,
Ming Lei <ming.lei@redhat.com>,
"James E.J. Bottomley" <jejb@linux.ibm.com>
Subject: [PATCH v9 07/17] scsi: core: Retry unaligned zoned writes
Date: Wed, 16 Aug 2023 12:53:19 -0700 [thread overview]
Message-ID: <20230816195447.3703954-8-bvanassche@acm.org> (raw)
In-Reply-To: <20230816195447.3703954-1-bvanassche@acm.org>
If zoned writes (REQ_OP_WRITE) for a sequential write required zone have
a starting LBA that differs from the write pointer, e.g. because zoned
writes have been reordered, then the storage device will respond with an
UNALIGNED WRITE COMMAND error. Send commands that failed with an
unaligned write error to the SCSI error handler if zone write locking is
disabled. The SCSI error handler will sort SCSI commands per LBA before
resubmitting these.
If zone write locking is disabled, increase the number of retries for
write commands sent to a sequential zone to the maximum number of
outstanding commands because in the worst case the number of times
reordered zoned writes have to be retried is (number of outstanding
writes per sequential zone) - 1.
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Damien Le Moal <dlemoal@kernel.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
drivers/scsi/scsi_error.c | 16 ++++++++++++++++
drivers/scsi/scsi_lib.c | 1 +
drivers/scsi/sd.c | 6 ++++++
include/scsi/scsi.h | 1 +
4 files changed, 24 insertions(+)
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 4393a7fd8a07..69510e99ccfd 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -699,6 +699,22 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
fallthrough;
case ILLEGAL_REQUEST:
+ /*
+ * Unaligned write command. This may indicate that zoned writes
+ * have been received by the device in the wrong order. If zone
+ * write locking is disabled, retry after all pending commands
+ * have completed.
+ */
+ if (sshdr.asc == 0x21 && sshdr.ascq == 0x04 &&
+ !req->q->limits.use_zone_write_lock &&
+ blk_rq_is_seq_zoned_write(req)) {
+ SCSI_LOG_ERROR_RECOVERY(3,
+ sdev_printk(KERN_INFO, scmd->device,
+ "Retrying unaligned write at LBA %#llx.\n",
+ scsi_get_lba(scmd)));
+ return NEEDS_DELAYED_RETRY;
+ }
+
if (sshdr.asc == 0x20 || /* Invalid command operation code */
sshdr.asc == 0x21 || /* Logical block address out of range */
sshdr.asc == 0x22 || /* Invalid function */
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 59176946ab56..69da8aee13df 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1443,6 +1443,7 @@ static void scsi_complete(struct request *rq)
case ADD_TO_MLQUEUE:
scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
break;
+ case NEEDS_DELAYED_RETRY:
default:
scsi_eh_scmd_add(cmd);
break;
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 8a4b0874e7fe..05baf5d1c24c 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1238,6 +1238,12 @@ static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *cmd)
cmd->transfersize = sdp->sector_size;
cmd->underflow = nr_blocks << 9;
cmd->allowed = sdkp->max_retries;
+ /*
+ * Increase the number of allowed retries for zoned writes if zone
+ * write locking is disabled.
+ */
+ if (!rq->q->limits.use_zone_write_lock && blk_rq_is_seq_zoned_write(rq))
+ cmd->allowed += rq->q->nr_requests;
cmd->sdb.length = nr_blocks * sdp->sector_size;
SCSI_LOG_HLQUEUE(1,
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
index ec093594ba53..6600db046227 100644
--- a/include/scsi/scsi.h
+++ b/include/scsi/scsi.h
@@ -93,6 +93,7 @@ static inline int scsi_status_is_check_condition(int status)
* Internal return values.
*/
enum scsi_disposition {
+ NEEDS_DELAYED_RETRY = 0x2000,
NEEDS_RETRY = 0x2001,
SUCCESS = 0x2002,
FAILED = 0x2003,
next prev parent reply other threads:[~2023-08-16 19:55 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-16 19:53 [PATCH v9 00/17] Improve performance for zoned UFS devices Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 01/17] block: Introduce more member variables related to zone write locking Bart Van Assche
2023-08-17 11:00 ` Damien Le Moal
2023-08-16 19:53 ` [PATCH v9 02/17] block: Only use write locking if necessary Bart Van Assche
2023-08-17 11:01 ` Damien Le Moal
2023-08-17 14:21 ` Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 03/17] block/mq-deadline: Only use zone " Bart Van Assche
2023-08-17 11:02 ` Damien Le Moal
2023-08-16 19:53 ` [PATCH v9 04/17] scsi: core: Call .eh_prepare_resubmit() before resubmitting Bart Van Assche
2023-08-17 11:10 ` Damien Le Moal
2023-08-17 14:26 ` Bart Van Assche
2023-08-18 2:38 ` Damien Le Moal
2023-08-16 19:53 ` [PATCH v9 05/17] scsi: core: Add unit tests for scsi_call_prepare_resubmit() Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 06/17] scsi: sd: Sort commands by LBA before resubmitting Bart Van Assche
2023-08-17 11:13 ` Damien Le Moal
2023-08-17 14:34 ` Bart Van Assche
2023-08-18 2:41 ` Damien Le Moal
2023-08-16 19:53 ` Bart Van Assche [this message]
2023-08-17 11:21 ` [PATCH v9 07/17] scsi: core: Retry unaligned zoned writes Damien Le Moal
2023-08-16 19:53 ` [PATCH v9 08/17] scsi: sd_zbc: Only require an I/O scheduler if needed Bart Van Assche
2023-08-17 11:21 ` Damien Le Moal
2023-08-16 19:53 ` [PATCH v9 09/17] scsi: scsi_debug: Support disabling zone write locking Bart Van Assche
2023-08-17 11:25 ` Damien Le Moal
2023-08-17 14:35 ` Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 10/17] scsi: scsi_debug: Support injecting unaligned write errors Bart Van Assche
2023-08-17 11:29 ` Damien Le Moal
2023-08-16 19:53 ` [PATCH v9 11/17] scsi: ufs: hisi: Rework the code that disables auto-hibernation Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 12/17] scsi: ufs: mediatek: Rework the code for disabling auto-hibernation Bart Van Assche
2023-08-17 18:40 ` Bao D. Nguyen
2023-08-17 19:13 ` Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 13/17] scsi: ufs: sprd: " Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 14/17] scsi: ufs: Rename ufshcd_auto_hibern8_enable() and make it static Bart Van Assche
2023-08-17 18:49 ` Bao D. Nguyen
2023-08-17 19:16 ` Bart Van Assche
2023-08-17 21:48 ` Bao D. Nguyen
2023-08-16 19:53 ` [PATCH v9 15/17] scsi: ufs: Simplify ufshcd_auto_hibern8_update() Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 16/17] scsi: ufs: Forbid auto-hibernation without I/O scheduler Bart Van Assche
2023-08-17 18:50 ` Bao D. Nguyen
2023-08-17 19:18 ` Bart Van Assche
2023-08-16 19:53 ` [PATCH v9 17/17] scsi: ufs: Inform the block layer about write ordering Bart Van Assche
2023-08-17 19:00 ` Bao D. Nguyen
2023-08-17 19:34 ` Bart Van Assche
2023-08-17 21:47 ` Bao D. Nguyen
2023-08-17 22:05 ` Bart Van Assche
2023-08-18 0:19 ` Bao D. Nguyen
2023-08-18 17:56 ` Bart Van Assche
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=20230816195447.3703954-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-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=ming.lei@redhat.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