mpt3sas: Limit NVMe request size to 2 MiB
Subsystems (3)
Ranjan Kumar
maintainerPATCH v4 1/1 mpt3sas: Limit NVMe request size to 2 MiB
The HBA firmware reports NVMe MDTS values based on the underlying drive capability. However, because the driver allocates a fixed 4K buffer for the PRP list, accommodating at most 512 entries, the driver supports a maximum I/O transfer size of 2 MiB.
Limit max_hw_sectors to the smaller of the reported MDTS and the 2 MiB driver limit to prevent issuing oversized I/O that may lead to a kernel oops.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +13 -1
@@ -2738,8 +2738,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim) pcie_device->enclosure_level, pcie_device->connector_name); +/* +* The HBA firmware passes the NVMe drive's MDTS +* (Maximum Data Transfer Size) up to the driver. However, +* the driver hardcodes a 4K buffer size for the PRP list, +* accommodating at most 512 entries. This strictly limits +* the maximum supported NVMe I/O transfer to 2 MiB. +* +* Cap max_hw_sectors to the smaller of the drive's reported +* MDTS or the 2 MiB driver limit to prevent kernel oopses. +*/ + lim->max_hw_sectors =SZ_2M >>SECTOR_SHIFT ;if (pcie_device->nvme_mdts) - lim->max_hw_sectors = pcie_device->nvme_mdts /512 ; + lim->max_hw_sectors =min (lim->max_hw_sectors, + pcie_device->nvme_mdts >>SECTOR_SHIFT );pcie_device_put (pcie_device);spin_unlock_irqrestore (&ioc->pcie_device_lock, flags);
Signature · 1 line
2.47.3
Quoted 36 lines · Ranjan Kumar
The HBA firmware reports NVMe MDTS values based on the underlying drive capability. However, because the driver allocates a fixed 4K buffer for the PRP list, accommodating at most 512 entries, the driver supports a maximum I/O transfer size of 2 MiB.
Limit
max_hw_sectorsto the smaller of the reported MDTS and the 2 MiB driver limit to prevent issuing oversized I/O that may lead to a kernel oops.Fixes 9b8b84879d4a ("block: Increase BLK_DEF_MAX_SECTORS_CAP")Reported-by Mira Limbeck <[email protected]>Suggested-by Keith Busch <[email protected]>Signed-off-by Ranjan Kumar <[email protected]>--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)drivers/scsi/mpt3sas/mpt3sas_scsih.c +8
-0@@ -2738,8 +2738,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim) pcie_device->enclosure_level, pcie_device->connector_name); +/* +* The HBA firmware passes the NVMe drive's MDTS +* (Maximum Data Transfer Size) up to the driver. However, +* the driver hardcodes a 4K buffer size for the PRP list, +* accommodating at most 512 entries. This strictly limits +* the maximum supported NVMe I/O transfer to 2 MiB. +* +* Cap max_hw_sectors to the smaller of the drive's reported
drivers/scsi/mpt3sas/mpt3sas_scsih.c scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim) · line 2757
Quoted 10 lines
drivers/scsi/mpt3sas/mpt3sas_scsih.c +5
-1+* MDTS or the 2 MiB driver limit to prevent kernel oopses. +*/ + lim->max_hw_sectors =SZ_2M >>SECTOR_SHIFT ;if (pcie_device->nvme_mdts) - lim->max_hw_sectors = pcie_device->nvme_mdts /512 ; + lim->max_hw_sectors =min (lim->max_hw_sectors, + pcie_device->nvme_mdts >>SECTOR_SHIFT );pcie_device_put (pcie_device);spin_unlock_irqrestore (&ioc->pcie_device_lock, flags);
Thank you for providing this patch.
We tested it on our test machine on top of 7.0-rc7.
Without the patch, we saw the same call traces as before. With this patch applied no such call traces were logged. So looks like it fixes the issue in our case.
I can't say much to the patch itself, but I can provide a tested-by.
Martin K. Petersen
AppliedRanjan,
Quoted 8 lines
The HBA firmware reports NVMe MDTS values based on the underlying drive capability. However, because the driver allocates a fixed 4K buffer for the PRP list, accommodating at most 512 entries, the driver supports a maximum I/O transfer size of 2 MiB.
Limit
max_hw_sectorsto the smaller of the reported MDTS and the 2 MiB driver limit to prevent issuing oversized I/O that may lead to a kernel oops.
Applied to 7.1/scsi-staging, thanks!
Signature · 1 line
Martin K. Petersen