Re: [PATCH] target/qla2xxx: Honor max_data_sg_nents I/O transfer limit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 10 Sep 2015, 11:36pm -0700, Nicholas A. Bellinger wrote:

On Thu, 2015-09-10 at 22:16 +0000, Himanshu Madhani wrote:
Hi Nic,

Sorry about the delay in response.

I have tested with RHEL 6.5 and noticed that IO were not able to complete
with 16M and 32M read/write. IO¹s were getting error due to Mid-layer
underflow

With initiator running upstream kernel version 4.2 as well I was seeing
error with Mid-layer reporting under-run.

I made change in the driver to report DID_OK to Mid-layer with residual
count and I was able to see IO completed without any error.
Basically, overriding driver¹s logic of failing an I/O, when residual
makes it an error with scsi_cmnd->underflow set.
In reality, though, with scsi_cmnd->underflow being set, Linux Qlogic
initiator will always see this as an error.
Maybe this is useful in other OSes. We have verified both read and write
data on FC trace and it looks good.


Great.  Thanks for the update.

Here¹s diff that was done in qla2xxx driver to report response to
mid-layer as DID_OK.


# git diff
diff --git a/drivers/scsi/qla2xxx/qla_isr.c
b/drivers/scsi/qla2xxx/qla_isr.c
index ccf6a7f..fc7b6a2 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -2257,7 +2257,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct
rsp_que *rsp, void *pkt)
                                    "detected (0x%x of 0x%x bytes).\n",
                                    resid, scsi_bufflen(cp));

-                               res = DID_ERROR << 16;
+                               res = DID_OK << 16;
                                break;
                        }
                } else if (lscsi_status != SAM_STAT_TASK_SET_FULL &&
(END)


Please go ahead and add patch to mainline kernel.


This missed the last linux-next build by a day, but with your Tested-by
+ Signed-off-by on this patch, I think it's still safe enough to queue
for v4.3-rc1 code.  (Adding JEJB CC')

qla2xxx: Allow DID_OK status for residual under/overflow completion
https://git.kernel.org/cgit/linux/kernel/git/nab/target-pending.git/commit/?h=for-next&id=46376bdc1e8a77c6d2cc65b77a1e340d4b4c9f1c

The target-pending/for-next PULL request will be going out in the next
48 hours.

Please let me know ASAP if you hit any regressions.


With existing scsi_cmnd->underflow semantics, LLDs are required (I believe) to treat the I/O as error if data transferred is less than underflow. "underflow", I think, is set to scsi_bufflen() today making any non-zero residual cases an error. So the above patch would break that semantic. We were not planning to push that change when we made that internally for testing.

From scsi_cmnd.h:
--8<-- struct scsi_cmnd --
        unsigned underflow;     /* Return error if less than
                                   this amount is transferred */
--8<--

That said, I think moving the check (of scsi_cmnd->underflow) to upper layers make more sense to me. LLDs would continue to set residual, if there is a residual. SCSI M/L or sd/st can do the enforcement of "scsi_cmnd->underflow" requirement.

Regards,
-Arun

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux