[PATCH v1 0/2] dma: fix dma_opt_mapping_size() returning bogus value when no backend hint exists
John Garry
john.g.garry at oracle.com
Tue Mar 17 02:11:59 PDT 2026
On 16/03/2026 20:39, Ionut Nechita (Wind River) wrote:
> dma_opt_mapping_size() currently returns min(dma_max_mapping_size(),
> SIZE_MAX) when neither an IOMMU nor a DMA ops opt_mapping_size callback
> is present. That value is the DMA maximum, not an optimal transfer
> size, yet callers treat it as a genuine optimization hint.
>
> The concrete problem shows up on SAS controllers (e.g. mpt3sas) running
> with IOMMU in passthrough mode. The bogus value propagates through
> scsi_transport_sas into Scsi_Host.opt_sectors and then into the block
> device's optimal_io_size. mkfs.xfs picks it up, computes
> swidth=4095 / sunit=2, and fails with:
>
> XFS: SB stripe unit sanity check failed
>
> making it impossible to create filesystems during system bootstrap.
For SAS controllers, don't we limit shost->opt_sectors at
shost->max_sectors, and then in sd_revalidate_disk() this value is
ignored as sdkp->opt_xfer_blocks would be smaller, right?
What value are you seeing for max_sectors and opt_sectors? That mpt3sas
driver seems to have many methods to set max_sectors.
Thanks,
John
>
> Patch 1 changes dma_opt_mapping_size() to return 0 ("no preference")
> when no backend provides a real hint.
>
> Patch 2 adjusts the only other in-tree caller (nvme-pci) to handle the
> new 0 return value, falling back to its existing default instead of
> setting max_hw_sectors to 0.
>
> Note: the scsi_transport_sas caller (the one that triggers the XFS
> issue) already handles 0 safely. It passes the return value through
> min_t() into shost->opt_sectors, which becomes 0; sd.c then feeds that
> into min_not_zero() when computing io_opt, so a zero opt_sectors is
> correctly treated as "no preference" and ignored.
>
> Based on linux-next (next-20260316).
>
> Ionut Nechita (2):
> dma: return 0 from dma_opt_mapping_size() when no real hint exists
> nvme-pci: handle dma_opt_mapping_size() returning 0
>
> drivers/nvme/host/pci.c | 15 ++++++++++-----
> kernel/dma/mapping.c | 13 ++++++++-----
> 2 files changed, 18 insertions(+), 10 deletions(-)
>
More information about the Linux-nvme
mailing list