Patch: lpfc: Modify Emulex lpfc LPFC_DEFAULT_SG_SEG_CNT to 128 for default larger sg_io capability
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
We have been seeing issues with qemu_kvm virtual guests where if they issue I/O to direct attached SCSI passthrough LUNS with large I/O sizes such as 512K the sg_io will fail with -EINVAL.
Simple reproducer is here.
strace -e ioctl sg_dd if=/dev/zero of=/dev/sdae bpt=0x400 count=0x400 blk_sgio=1
Assume default 'bs' (block size) of 512 bytes
ioctl(4, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[6]=[12, 00, 00, 00, 24, 00], mx_sb_len=64, iovec_count=0, dxfer_len=36, timeout=60000, flags=0, data[36]=["\0\0\5\2\37\270\0\2LIO-ORG block-15 "...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(4, SG_IO, {'S', SG_DXFER_TO_DEV, cmd[10]=[2a, 00, 00, 00, 00, 00, 00, 04, 00, 00], mx_sb_len=64, iovec_count=0, dxfer_len=524288, timeout=60000, flags=0, data[524288]=["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...]}) = -1 EINVAL (Invalid argument) writing (SG_IO) on sg device, error: Invalid argumentsg_write failed, seek=0
Some error occurred, remaining block count=1024
1024+0 records in
0+0 records out
Qlogic defaults to 128 so has not been seeing this but lpfc does not. Would like to avoid having to set this in the module parameters to 128.
Quoted 1 line
From
23996dcbdd9b505d18d59ecde961c87f76fc9c2eMon Sep 17 00:00:00 2001
From: Laurence Oberman <[email protected]>
Date: Wed, 8 Feb 2017 14:49:05 -0500
Subject: [PATCH] Modified LPFC_DEFAULT_SG_SEG_CNT to 128 to match Qlogic. This
will allow larger sg_io passthrough for qemu_kvm guests that expect the larger setting for I/O large rthen 512k.
--- drivers/scsi/lpfc/lpfc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc.h +1 -1
@@ -42,7 +42,7 @@#define LPFC_MAX_NS_RETRY 3/* Number of retry attempts to contact the NameServer before giving up. */ #define LPFC_CMD_PER_LUN 3/* max outstanding cmds per lun */ -#define LPFC_DEFAULT_SG_SEG_CNT 64/* sg element count per scsi cmnd */ +#define LPFC_DEFAULT_SG_SEG_CNT 128/* sg element count per scsi cmnd */ #define LPFC_DEFAULT_MENLO_SG_SEG_CNT 128/* sg element count per scsi cmnd for menlo needs nearly twice as for firmware downloads using bsg */
Signature · 1 line
1.8.3.1
----- Original Message -----
Quoted 63 lines
From: "Laurence Oberman" <[email protected]>
To: "Linux SCSI List" <[email protected]>
Sent: Wednesday, February 8, 2017 3:07:12 PM
Subject: Patch: lpfc: Modify Emulex lpfcLPFC_DEFAULT_SG_SEG_CNTto 128 for default largersg_iocapabilityWe have been seeing issues with
qemu_kvmvirtual guests where if they issue I/O to direct attached SCSI passthrough LUNS with large I/O sizes such as 512K
thesg_iowill fail with-EINVAL.Simple reproducer is here.
strace -e ioctl
sg_ddif=/dev/zero of=/dev/sdae bpt=0x400 count=0x400 blk_sgio=1
Assume default 'bs' (block size) of 512 bytes
ioctl(4,SG_IO, {'S',SG_DXFER_FROM_DEV, cmd[6]=[12, 00, 00, 00, 24, 00], mx_sb_len=64, iovec_count=0, dxfer_len=36, timeout=60000, flags=0,
data[36]=["\0\0\5\2\37\270\0\2LIO-ORG block-15 "...], status=00,
masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(4,SG_IO, {'S',SG_DXFER_TO_DEV, cmd[10]=[2a, 00, 00, 00, 00, 00, 00, 04, 00, 00], mx_sb_len=64, iovec_count=0, dxfer_len=524288, timeout=60000, flags=0, data[524288]=["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...]}) = -1 EINVAL (Invalid argument)
writing (SG_IO) on sg device, error: Invalid argumentsg_writefailed, seek=0
Some error occurred, remaining block count=1024
1024+0 records in
0+0 records outQlogic defaults to 128 so has not been seeing this but lpfc does not. Would like to avoid having to set this in the module parameters to 128.
Tested-by Laurence Oberman <[email protected]>Signed-off-by Laurence Oberman <[email protected]>From
23996dcbdd9b505d18d59ecde961c87f76fc9c2eMon Sep 17 00:00:00 2001
From: Laurence Oberman <[email protected]>
Date: Wed, 8 Feb 2017 14:49:05 -0500
Subject: [PATCH] ModifiedLPFC_DEFAULT_SG_SEG_CNTto 128 to match Qlogic. This
will allow largersg_iopassthrough forqemu_kvmguests that expect the larger setting for I/O large rthen 512k.--- drivers/scsi/lpfc/lpfc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/scsi/lpfc/lpfc.h +1
-2@@ -42,7 +42,7 @@#define LPFC_MAX_NS_RETRY 3/* Number of retry attempts to contact the NameServer before giving up. */ #define LPFC_CMD_PER_LUN 3/* max outstanding cmds per lun */ -#define LPFC_DEFAULT_SG_SEG_CNT 64/* sg element count per scsi cmnd */ +#define LPFC_DEFAULT_SG_SEG_CNT 128/* sg element count per scsi cmnd */ #define LPFC_DEFAULT_MENLO_SG_SEG_CNT 128/* sg element count per scsi cmnd for menlo needs nearly twice as for firmware downloads using bsg */ --
Quoted 6 lines
1.8.3.1
Replying to my own email
I was wondering if we could set it to 256 as the default. This seems to pass sg_io all the way to 0x800
bpt=0x200
Assume default 'bs' (block size) of 512 bytes
ioctl(4, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[6]=[12, 00, 00, 00, 24, 00], mx_sb_len=64, iovec_count=0, dxfer_len=36, timeout=60000, flags=0, data[36]=["\0\0\5\2\37\270\0\2LIO-ORG block-21 "...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(4, SG_IO, {'S', SG_DXFER_TO_DEV, cmd[10]=[2a, 00, 00, 00, 00, 00, 00, 02, 00, 00], mx_sb_len=64, iovec_count=0, dxfer_len=262144, timeout=60000, flags=0, data[262144]=["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=30, info=0}) = 0 512+0 records in
512+0 records out
+++ exited with 0 +++
bpt=0x400
Assume default 'bs' (block size) of 512 bytes
ioctl(4, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[6]=[12, 00, 00, 00, 24, 00], mx_sb_len=64, iovec_count=0, dxfer_len=36, timeout=60000, flags=0, data[36]=["\0\0\5\2\37\270\0\2LIO-ORG block-21 "...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(4, SG_IO, {'S', SG_DXFER_TO_DEV, cmd[10]=[2a, 00, 00, 00, 00, 00, 00, 04, 00, 00], mx_sb_len=64, iovec_count=0, dxfer_len=524288, timeout=60000, flags=0, data[524288]=["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=43, info=0}) = 0 1024+0 records in
1024+0 records out
+++ exited with 0 +++
bpt=0x800
Assume default 'bs' (block size) of 512 bytes
ioctl(4, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[6]=[12, 00, 00, 00, 24, 00], mx_sb_len=64, iovec_count=0, dxfer_len=36, timeout=60000, flags=0, data[36]=["\0\0\5\2\37\270\0\2LIO-ORG block-21 "...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(4, SG_IO, {'S', SG_DXFER_TO_DEV, cmd[10]=[2a, 00, 00, 00, 00, 00, 00, 08, 00, 00], mx_sb_len=64, iovec_count=0, dxfer_len=1048576, timeout=60000, flags=0, data[1048576]=["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=34, info=0}) = 0 2048+0 records in
2048+0 records out
+++ exited with 0 +++
Thanks
Laurence