* [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status @ 2016-03-05 7:07 Nicholas A. Bellinger 2016-03-05 7:07 ` [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL Nicholas A. Bellinger 2016-03-05 21:01 ` [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status Christoph Hellwig 0 siblings, 2 replies; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-05 7:07 UTC (permalink / raw) To: target-devel, linux-scsi Cc: Hannes Reinecke, Christoph Hellwig, Mike Christie, Sagi Grimberg, Andy Grover, Nicholas Bellinger, Sagi Grimberg, Mike Christie From: Nicholas Bellinger <nab@linux-iscsi.org> This patch modifies existing transport_complete_*() code to avoid invoking target_core_fabric_ops->queue_data_in() driver callbacks for I/O READs with non-GOOD SAM status. Some initiators expect GOOD status when a DATA-IN payload transfer is involved, so to be safe go ahead and always invoke target_core_fabric_ops->queue_status() to generate fabric responses instead. Note this is a prerequisite for IBLOCK supporting retriable status, so SAM_STAT_BUSY + SAM_STAT_TASK_SET_FULL always generates fabric driver responses instead of initiating DataIN payload transfer when non-GOOD status is present Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Andy Grover <agrover@redhat.com> Cc: Mike Christie <mchristi@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> --- drivers/target/target_core_transport.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index f5ad9e0..784dd22 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -1997,6 +1997,9 @@ static void transport_complete_qf(struct se_cmd *cmd) switch (cmd->data_direction) { case DMA_FROM_DEVICE: + if (cmd->scsi_status) + goto queue_status; + trace_target_cmd_complete(cmd); ret = cmd->se_tfo->queue_data_in(cmd); break; @@ -2007,6 +2010,7 @@ static void transport_complete_qf(struct se_cmd *cmd) } /* Fall through for DMA_TO_DEVICE */ case DMA_NONE: +queue_status: trace_target_cmd_complete(cmd); ret = cmd->se_tfo->queue_status(cmd); break; @@ -2128,6 +2132,9 @@ static void target_complete_ok_work(struct work_struct *work) queue_rsp: switch (cmd->data_direction) { case DMA_FROM_DEVICE: + if (cmd->scsi_status) + goto queue_status; + atomic_long_add(cmd->data_length, &cmd->se_lun->lun_stats.tx_data_octets); /* @@ -2167,6 +2174,7 @@ queue_rsp: } /* Fall through for DMA_TO_DEVICE */ case DMA_NONE: +queue_status: trace_target_cmd_complete(cmd); ret = cmd->se_tfo->queue_status(cmd); if (ret == -EAGAIN || ret == -ENOMEM) -- 1.9.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-05 7:07 [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status Nicholas A. Bellinger @ 2016-03-05 7:07 ` Nicholas A. Bellinger 2016-03-05 21:01 ` Christoph Hellwig 2016-03-05 21:01 ` [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status Christoph Hellwig 1 sibling, 1 reply; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-05 7:07 UTC (permalink / raw) To: target-devel, linux-scsi Cc: Hannes Reinecke, Christoph Hellwig, Mike Christie, Sagi Grimberg, Andy Grover, Nicholas Bellinger, Sagi Grimberg, Mike Christie From: Nicholas Bellinger <nab@linux-iscsi.org> This patch updates target/iblock backend driver code to check for bio completion status of -EAGAIN / -ENOMEM provided by raw block drivers and scsi devices, in order to generate the following SCSI status to initiators: - SAM_STAT_BUSY - SAM_STAT_TASK_SET_FULL Note these two SAM status codes are useful to signal to Linux SCSI host side that se_cmd should be retried again, or with TASK_SET_FULL case to attempt to lower our internal host LLD queue_depth and scsi_cmnd retry. It also updates target_complete_cmd() to parse status when signalling success to target_completion_wq. Reviewed-by: Hannes Reinecke <hare@suse.de> Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Andy Grover <agrover@redhat.com> Cc: Mike Christie <mchristi@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> --- drivers/target/target_core_iblock.c | 38 +++++++++++++++++++++++++++------- drivers/target/target_core_iblock.h | 1 + drivers/target/target_core_transport.c | 13 ++++++++++-- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 026a758..ce754f1 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -282,11 +282,28 @@ static void iblock_complete_cmd(struct se_cmd *cmd) if (!atomic_dec_and_test(&ibr->pending)) return; - - if (atomic_read(&ibr->ib_bio_err_cnt)) - status = SAM_STAT_CHECK_CONDITION; - else + /* + * Propigate use these two bio completion values from raw block + * drivers to signal up BUSY and TASK_SET_FULL status to the + * host side initiator. The latter for Linux/iSCSI initiators + * means the Linux/SCSI LLD will begin to reduce it's internal + * per session queue_depth. + */ + if (atomic_read(&ibr->ib_bio_err_cnt)) { + switch (ibr->ib_bio_retry) { + case -EAGAIN: + status = SAM_STAT_BUSY; + break; + case -ENOMEM: + status = SAM_STAT_TASK_SET_FULL; + break; + default: + status = SAM_STAT_CHECK_CONDITION; + break; + } + } else { status = SAM_STAT_GOOD; + } target_complete_cmd(cmd, status); kfree(ibr); @@ -298,7 +315,15 @@ static void iblock_bio_done(struct bio *bio) struct iblock_req *ibr = cmd->priv; if (bio->bi_error) { - pr_err("bio error: %p, err: %d\n", bio, bio->bi_error); + pr_debug_ratelimited("test_bit(BIO_UPTODATE) failed for bio: %p," + " err: %d\n", bio, bio->bi_error); + /* + * Save the retryable status provided and translate into + * SAM status in iblock_complete_cmd(). + */ + if (bio->bi_error == -EAGAIN || bio->bi_error == -ENOMEM) { + ibr->ib_bio_retry = bio->bi_error; + } /* * Bump the ib_bio_err_cnt and release bio. */ @@ -677,8 +702,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, struct scatterlist *sg; u32 sg_num = sgl_nents; unsigned bio_cnt; - int rw = 0; - int i; + int i, rw = 0; if (data_direction == DMA_TO_DEVICE) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); diff --git a/drivers/target/target_core_iblock.h b/drivers/target/target_core_iblock.h index 01c2afd..ff3cfdd 100644 --- a/drivers/target/target_core_iblock.h +++ b/drivers/target/target_core_iblock.h @@ -9,6 +9,7 @@ struct iblock_req { atomic_t pending; atomic_t ib_bio_err_cnt; + int ib_bio_retry; } ____cacheline_aligned; #define IBDF_HAS_UDEV_PATH 0x01 diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 784dd22..df01997 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -731,11 +731,20 @@ static unsigned char *transport_get_sense_buffer(struct se_cmd *cmd) void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) { struct se_device *dev = cmd->se_dev; - int success = scsi_status == GOOD; + int success; unsigned long flags; cmd->scsi_status = scsi_status; - + switch (cmd->scsi_status) { + case SAM_STAT_GOOD: + case SAM_STAT_BUSY: + case SAM_STAT_TASK_SET_FULL: + success = 1; + break; + default: + success = 0; + break; + } spin_lock_irqsave(&cmd->t_state_lock, flags); cmd->transport_state &= ~CMD_T_BUSY; -- 1.9.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-05 7:07 ` [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL Nicholas A. Bellinger @ 2016-03-05 21:01 ` Christoph Hellwig 2016-03-05 22:51 ` Nicholas A. Bellinger 0 siblings, 1 reply; 14+ messages in thread From: Christoph Hellwig @ 2016-03-05 21:01 UTC (permalink / raw) To: Nicholas A. Bellinger Cc: target-devel, linux-scsi, Hannes Reinecke, Christoph Hellwig, Mike Christie, Sagi Grimberg, Andy Grover, Nicholas Bellinger, Sagi Grimberg, Mike Christie > - if (atomic_read(&ibr->ib_bio_err_cnt)) > - status = SAM_STAT_CHECK_CONDITION; > - else > + /* > + * Propigate use these two bio completion values from raw block > + * drivers to signal up BUSY and TASK_SET_FULL status to the > + * host side initiator. The latter for Linux/iSCSI initiators > + * means the Linux/SCSI LLD will begin to reduce it's internal > + * per session queue_depth. > + */ > + if (atomic_read(&ibr->ib_bio_err_cnt)) { > + switch (ibr->ib_bio_retry) { > + case -EAGAIN: > + status = SAM_STAT_BUSY; > + break; > + case -ENOMEM: > + status = SAM_STAT_TASK_SET_FULL; > + break; > + default: > + status = SAM_STAT_CHECK_CONDITION; > + break; > + } > + } else { > status = SAM_STAT_GOOD; > + } I think you;d be much better off killing ib_bio_err_cnt and having an ib_error that gets set to the last / most server error. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-05 21:01 ` Christoph Hellwig @ 2016-03-05 22:51 ` Nicholas A. Bellinger 2016-03-06 6:19 ` Christoph Hellwig 0 siblings, 1 reply; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-05 22:51 UTC (permalink / raw) To: Christoph Hellwig Cc: Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Sat, 2016-03-05 at 22:01 +0100, Christoph Hellwig wrote: > > - if (atomic_read(&ibr->ib_bio_err_cnt)) > > - status = SAM_STAT_CHECK_CONDITION; > > - else > > + /* > > + * Propigate use these two bio completion values from raw block > > + * drivers to signal up BUSY and TASK_SET_FULL status to the > > + * host side initiator. The latter for Linux/iSCSI initiators > > + * means the Linux/SCSI LLD will begin to reduce it's internal > > + * per session queue_depth. > > + */ > > + if (atomic_read(&ibr->ib_bio_err_cnt)) { > > + switch (ibr->ib_bio_retry) { > > + case -EAGAIN: > > + status = SAM_STAT_BUSY; > > + break; > > + case -ENOMEM: > > + status = SAM_STAT_TASK_SET_FULL; > > + break; > > + default: > > + status = SAM_STAT_CHECK_CONDITION; > > + break; > > + } > > + } else { > > status = SAM_STAT_GOOD; > > + } > > I think you;d be much better off killing ib_bio_err_cnt and having > an ib_error that gets set to the last / most server error. That's what I was originally thinking too.. However, that means if one bio completed successfully and another got -EAGAIN / -ENOMEM for the same se_cmd, IBLOCK would still complete se_cmd with GOOD status. I don't see how completing se_cmd with GOOD status, when one bio in the set requested retry depending on completion order is a good idea. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-05 22:51 ` Nicholas A. Bellinger @ 2016-03-06 6:19 ` Christoph Hellwig 2016-03-06 21:55 ` Nicholas A. Bellinger 0 siblings, 1 reply; 14+ messages in thread From: Christoph Hellwig @ 2016-03-06 6:19 UTC (permalink / raw) To: Nicholas A. Bellinger Cc: Christoph Hellwig, Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Sat, Mar 05, 2016 at 02:51:27PM -0800, Nicholas A. Bellinger wrote: > > I think you;d be much better off killing ib_bio_err_cnt and having > > an ib_error that gets set to the last / most server error. > > That's what I was originally thinking too.. > > However, that means if one bio completed successfully and another got > -EAGAIN / -ENOMEM for the same se_cmd, IBLOCK would still complete > se_cmd with GOOD status. > > I don't see how completing se_cmd with GOOD status, when one bio in the > set requested retry depending on completion order is a good idea. Oh, I took a look at the patch again and it looks bogus - block drivers should never return EAGAIN or ENOMEM from ->bi_end_io. Those are errors that should happen before submission if at all. Which driver ever returns these? ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-06 6:19 ` Christoph Hellwig @ 2016-03-06 21:55 ` Nicholas A. Bellinger 2016-03-07 7:55 ` Christoph Hellwig 0 siblings, 1 reply; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-06 21:55 UTC (permalink / raw) To: Christoph Hellwig Cc: Christoph Hellwig, Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Sat, 2016-03-05 at 22:19 -0800, Christoph Hellwig wrote: > On Sat, Mar 05, 2016 at 02:51:27PM -0800, Nicholas A. Bellinger wrote: > > > I think you;d be much better off killing ib_bio_err_cnt and having > > > an ib_error that gets set to the last / most server error. > > > > That's what I was originally thinking too.. > > > > However, that means if one bio completed successfully and another got > > -EAGAIN / -ENOMEM for the same se_cmd, IBLOCK would still complete > > se_cmd with GOOD status. > > > > I don't see how completing se_cmd with GOOD status, when one bio in the > > set requested retry depending on completion order is a good idea. > > Oh, I took a look at the patch again and it looks bogus - block drivers > should never return EAGAIN or ENOMEM from ->bi_end_io. Those are errors > that should happen before submission if at all. Which driver ever returns > these? The intended use is for any make_request_fn() based driver that invokes bio_endio() completion directly, and sets bi_error != 0 to signal non GOOD status to target/iblock. This is helpful when a block drivers knows it won't be able to complete I/O before host dependent SCSI timeouts kick in, and it needs to signal retry with BUSY status or in the case of Linux/SCSI with TASK_SET_FULL, to reduce host queue_depth. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-06 21:55 ` Nicholas A. Bellinger @ 2016-03-07 7:55 ` Christoph Hellwig 2016-03-07 8:03 ` Nicholas A. Bellinger 0 siblings, 1 reply; 14+ messages in thread From: Christoph Hellwig @ 2016-03-07 7:55 UTC (permalink / raw) To: Nicholas A. Bellinger Cc: Christoph Hellwig, Christoph Hellwig, Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Sun, Mar 06, 2016 at 01:55:15PM -0800, Nicholas A. Bellinger wrote: > The intended use is for any make_request_fn() based driver that invokes > bio_endio() completion directly, and sets bi_error != 0 to signal > non GOOD status to target/iblock. But -EAGAIN and -ENOMEM are not valid drivers for bio_endio, and as far as I can tell no driver every returns them. So as-is this might be well intended but either useless or broken. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-07 7:55 ` Christoph Hellwig @ 2016-03-07 8:03 ` Nicholas A. Bellinger 2016-03-07 16:18 ` -EAGAIN and -ENOMEM from ->bi_end_io, was " Christoph Hellwig 2016-03-07 16:40 ` James Bottomley 0 siblings, 2 replies; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-07 8:03 UTC (permalink / raw) To: Christoph Hellwig Cc: Christoph Hellwig, Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Mon, 2016-03-07 at 08:55 +0100, Christoph Hellwig wrote: > On Sun, Mar 06, 2016 at 01:55:15PM -0800, Nicholas A. Bellinger wrote: > > The intended use is for any make_request_fn() based driver that invokes > > bio_endio() completion directly, and sets bi_error != 0 to signal > > non GOOD status to target/iblock. > > But -EAGAIN and -ENOMEM are not valid drivers for bio_endio, Why..? > and as far as I can tell no driver every returns them. Correct, it's a new capability for make_request_fn() based drivers using target/iblock export. > So as-is this might be well intended but either useless or broken. > -- No, it useful for hosts that have an aggressive SCSI timeout, and it works as expected with Linux/SCSI hosts that either retry on BUSY status, or retry + reduce queue_depth on TASK_SET_FULL status. ^ permalink raw reply [flat|nested] 14+ messages in thread
* -EAGAIN and -ENOMEM from ->bi_end_io, was Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-07 8:03 ` Nicholas A. Bellinger @ 2016-03-07 16:18 ` Christoph Hellwig 2016-03-07 22:39 ` Nicholas A. Bellinger 2016-03-07 16:40 ` James Bottomley 1 sibling, 1 reply; 14+ messages in thread From: Christoph Hellwig @ 2016-03-07 16:18 UTC (permalink / raw) To: Nicholas A. Bellinger Cc: Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie, axboe, linux-block, linux-fsdevel On Mon, Mar 07, 2016 at 12:03:56AM -0800, Nicholas A. Bellinger wrote: > > On Sun, Mar 06, 2016 at 01:55:15PM -0800, Nicholas A. Bellinger wrote: > > > The intended use is for any make_request_fn() based driver that invokes > > > bio_endio() completion directly, and sets bi_error != 0 to signal > > > non GOOD status to target/iblock. > > > > But -EAGAIN and -ENOMEM are not valid drivers for bio_endio, > > Why..? > > > and as far as I can tell no driver every returns them. > > Correct, it's a new capability for make_request_fn() based drivers using > target/iblock export. Please only use it once drivers, filesystem and the block layer can deal with it. Right now -EAGAIN and -ENOMEM are treated as an unknown error by all consumers of bios, so you will get a hard error and file system shutdown. What is your driver that is going to return this, and how does it know it's ѕafe to do so? > > So as-is this might be well intended but either useless or broken. > > -- > > No, it useful for hosts that have an aggressive SCSI timeout, and it > works as expected with Linux/SCSI hosts that either retry on BUSY > status, or retry + reduce queue_depth on TASK_SET_FULL status. I explicitly wrote "as-is". We need a way to opt into this behavior, and we also somehow need to communicate the timeout. I think allowing timeouts for bios is useful, but it needs a lot more work than this quick hack, which seems to still be missing a driver to actually generate these errors. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: -EAGAIN and -ENOMEM from ->bi_end_io, was Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-07 16:18 ` -EAGAIN and -ENOMEM from ->bi_end_io, was " Christoph Hellwig @ 2016-03-07 22:39 ` Nicholas A. Bellinger 2016-03-08 7:04 ` Christoph Hellwig 0 siblings, 1 reply; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-07 22:39 UTC (permalink / raw) To: Christoph Hellwig Cc: Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie, axboe, linux-block, linux-fsdevel On Mon, 2016-03-07 at 17:18 +0100, Christoph Hellwig wrote: > On Mon, Mar 07, 2016 at 12:03:56AM -0800, Nicholas A. Bellinger wrote: > > > On Sun, Mar 06, 2016 at 01:55:15PM -0800, Nicholas A. Bellinger wrote: > > > > The intended use is for any make_request_fn() based driver that invokes > > > > bio_endio() completion directly, and sets bi_error != 0 to signal > > > > non GOOD status to target/iblock. > > > > > > But -EAGAIN and -ENOMEM are not valid drivers for bio_endio, > > > > Why..? > > > > > and as far as I can tell no driver every returns them. > > > > Correct, it's a new capability for make_request_fn() based drivers using > > target/iblock export. > > Please only use it once drivers, filesystem and the block layer > can deal with it. > > Right now -EAGAIN and -ENOMEM are treated as an unknown error by all > consumers of bios, so you will get a hard error and file system shutdown. > Yes, the driver needs a way to determine when a bio was submitted via target/iblock, and it's completion consumer is capable of processing a non-zero bi_error as retryable. > What is your driver that is going to return this, and how does it know > it's ѕafe to do so? I've been using this with an out-of-tree driver for a while now, but the most obvious upstream candidate who can benefit from this is RBD. > > > > So as-is this might be well intended but either useless or broken. > > > -- > > > > No, it useful for hosts that have an aggressive SCSI timeout, and it > > works as expected with Linux/SCSI hosts that either retry on BUSY > > status, or retry + reduce queue_depth on TASK_SET_FULL status. > > I explicitly wrote "as-is". We need a way to opt into this behavior, > and we also somehow need to communicate the timeout. What did you have in mind..? > I think allowing > timeouts for bios is useful, but it needs a lot more work than this > quick hack, From the target side, it's not a quick hack. These initial target/iblock changes for processing non-zero bi_error + propagating up to target-core won't change regardless of how the underlying driver determines if a completion consumer supports retryable bio status, or not. > which seems to still be missing a driver to actually > generate these errors. I'll include the BRD patch I've been using as the first user of this code. -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: -EAGAIN and -ENOMEM from ->bi_end_io, was Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-07 22:39 ` Nicholas A. Bellinger @ 2016-03-08 7:04 ` Christoph Hellwig 0 siblings, 0 replies; 14+ messages in thread From: Christoph Hellwig @ 2016-03-08 7:04 UTC (permalink / raw) To: Nicholas A. Bellinger Cc: Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie, axboe, linux-block, linux-fsdevel On Mon, Mar 07, 2016 at 02:39:29PM -0800, Nicholas A. Bellinger wrote: > > I explicitly wrote "as-is". We need a way to opt into this behavior, > > and we also somehow need to communicate the timeout. > > What did you have in mind..? You need an interface to tell the driver that it can return a timeout status, and preferably also set the actual timeout. The obvious candidate would be a new method on the queue to set a user timeout, and if one is set we could get these errors back. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-07 8:03 ` Nicholas A. Bellinger 2016-03-07 16:18 ` -EAGAIN and -ENOMEM from ->bi_end_io, was " Christoph Hellwig @ 2016-03-07 16:40 ` James Bottomley 2016-03-07 22:44 ` Nicholas A. Bellinger 1 sibling, 1 reply; 14+ messages in thread From: James Bottomley @ 2016-03-07 16:40 UTC (permalink / raw) To: Nicholas A. Bellinger, Christoph Hellwig Cc: Christoph Hellwig, Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Mon, 2016-03-07 at 00:03 -0800, Nicholas A. Bellinger wrote: > On Mon, 2016-03-07 at 08:55 +0100, Christoph Hellwig wrote: > > On Sun, Mar 06, 2016 at 01:55:15PM -0800, Nicholas A. Bellinger > > So as-is this might be well intended but either useless or broken. > > -- > > No, it useful for hosts that have an aggressive SCSI timeout, and it > works as expected with Linux/SCSI hosts that either retry on BUSY > status, or retry + reduce queue_depth on TASK_SET_FULL status. I'm with Christoph on this: BUSY and QUEUE_FULL are already handled generically in SCSI. All drivers should use the generics: to handle separately, the driver has to intercept the error code, which I thought I checked that none did (although it was a while ago). Additionally, the timeout on these operations is retries * command timeout. So for the default 5 retries and 30 seconds, you actually get to tolerate BUSY/QUEUE_FULL for 2.5 minutes before you get an error. If this is a problem, you can bump up the timer in /sys/class/scsi_device/<id>/device/timeout James ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL 2016-03-07 16:40 ` James Bottomley @ 2016-03-07 22:44 ` Nicholas A. Bellinger 0 siblings, 0 replies; 14+ messages in thread From: Nicholas A. Bellinger @ 2016-03-07 22:44 UTC (permalink / raw) To: James Bottomley Cc: Christoph Hellwig, Christoph Hellwig, Nicholas A. Bellinger, target-devel, linux-scsi, Hannes Reinecke, Mike Christie, Sagi Grimberg, Andy Grover, Sagi Grimberg, Mike Christie On Mon, 2016-03-07 at 11:40 -0500, James Bottomley wrote: > On Mon, 2016-03-07 at 00:03 -0800, Nicholas A. Bellinger wrote: > > On Mon, 2016-03-07 at 08:55 +0100, Christoph Hellwig wrote: > > > On Sun, Mar 06, 2016 at 01:55:15PM -0800, Nicholas A. Bellinger > > > > So as-is this might be well intended but either useless or broken. > > > -- > > > > No, it useful for hosts that have an aggressive SCSI timeout, and it > > works as expected with Linux/SCSI hosts that either retry on BUSY > > status, or retry + reduce queue_depth on TASK_SET_FULL status. > > I'm with Christoph on this: BUSY and QUEUE_FULL are already handled > generically in SCSI. All drivers should use the generics: to handle > separately, the driver has to intercept the error code, which I thought > I checked that none did (although it was a while ago). Additionally, > the timeout on these operations is retries * command timeout. So for > the default 5 retries and 30 seconds, you actually get to tolerate > BUSY/QUEUE_FULL for 2.5 minutes before you get an error. If this is a > problem, you can bump up the timer in > > /sys/class/scsi_device/<id>/device/timeout > Yes, Linux/SCSI hosts have a sane default timeout + retries, and aren't the ones who really need SAM_STAT_BUSY + SAM_STAT_TASK_SET_FULL responses intermittently to avoid going nuts. It's for ESX 5+ hosts, that with iscsi use a hard-coded (non user configurable) timeout of 5 seconds, before attempting ABORT_TASK and friends. For FC, it's LLD dependent, and IIRC the default for qla2xxx is 20 seconds. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status 2016-03-05 7:07 [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status Nicholas A. Bellinger 2016-03-05 7:07 ` [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL Nicholas A. Bellinger @ 2016-03-05 21:01 ` Christoph Hellwig 1 sibling, 0 replies; 14+ messages in thread From: Christoph Hellwig @ 2016-03-05 21:01 UTC (permalink / raw) To: Nicholas A. Bellinger Cc: target-devel, linux-scsi, Hannes Reinecke, Christoph Hellwig, Mike Christie, Sagi Grimberg, Andy Grover, Nicholas Bellinger, Sagi Grimberg, Mike Christie Looks fine, Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2016-03-08 7:04 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-03-05 7:07 [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status Nicholas A. Bellinger 2016-03-05 7:07 ` [PATCH-v2 2/2] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL Nicholas A. Bellinger 2016-03-05 21:01 ` Christoph Hellwig 2016-03-05 22:51 ` Nicholas A. Bellinger 2016-03-06 6:19 ` Christoph Hellwig 2016-03-06 21:55 ` Nicholas A. Bellinger 2016-03-07 7:55 ` Christoph Hellwig 2016-03-07 8:03 ` Nicholas A. Bellinger 2016-03-07 16:18 ` -EAGAIN and -ENOMEM from ->bi_end_io, was " Christoph Hellwig 2016-03-07 22:39 ` Nicholas A. Bellinger 2016-03-08 7:04 ` Christoph Hellwig 2016-03-07 16:40 ` James Bottomley 2016-03-07 22:44 ` Nicholas A. Bellinger 2016-03-05 21:01 ` [PATCH-v2 1/2] target: Avoid DataIN transfers for non-GOOD SAM status Christoph Hellwig
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).