• Damien Le Moal's avatar
    scsi: mpt3sas: Avoid IOMMU page faults on REPORT ZONES · 82dbb57a
    Damien Le Moal authored
    Some firmware versions of the 9600 series SAS HBA byte-swap the REPORT
    ZONES command reply buffer from ATA-ZAC devices by directly accessing the
    buffer in the host memory. This does not respect the default command DMA
    direction and causes IOMMU page faults on architectures with an IOMMU
    enforcing write-only mappings for DMA_FROM_DEVICE DMA driection (e.g. AMD
    hosts).
    
    scsi 18:0:0:0: Direct-Access-ZBC ATA      WDC  WSH722020AL W870 PQ: 0 ANSI: 6
    scsi 18:0:0:0: SATA: handle(0x0027), sas_addr(0x300062b2083e7c40), phy(0), device_name(0x5000cca29dc35e11)
    scsi 18:0:0:0: enclosure logical id (0x300062b208097c40), slot(0)
    scsi 18:0:0:0: enclosure level(0x0000), connector name( C0.0)
    scsi 18:0:0:0: atapi(n), ncq(y), asyn_notify(n), smart(y), fua(y), sw_preserve(y)
    scsi 18:0:0:0: qdepth(32), tagged(1), scsi_level(7), cmd_que(1)
    sd 18:0:0:0: Attached scsi generic sg2 type 20
    sd 18:0:0:0: [sdc] Host-managed zoned block device
    mpt3sas 0000:41:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0021 address=0xfff9b200 flags=0x0050]
    mpt3sas 0000:41:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0021 address=0xfff9b300 flags=0x0050]
    mpt3sas_cm0: mpt3sas_ctl_pre_reset_handler: Releasing the trace buffer due to adapter reset.
    mpt3sas_cm0 fault info from func: mpt3sas_base_make_ioc_ready
    mpt3sas_cm0: fault_state(0x2666)!
    mpt3sas_cm0: sending diag reset !!
    mpt3sas_cm0: diag reset: SUCCESS
    sd 18:0:0:0: [sdc] REPORT ZONES start lba 0 failed
    sd 18:0:0:0: [sdc] REPORT ZONES: Result: hostbyte=DID_RESET driverbyte=DRIVER_OK
    sd 18:0:0:0: [sdc] 0 4096-byte logical blocks: (0 B/0 B)
    
    Avoid such issue by always mapping the buffer of REPORT ZONES commands
    using DMA_BIDIRECTIONAL (read+write IOMMU mapping). This is done by
    introducing the helper function _base_scsi_dma_map() and using this helper
    in _base_build_sg_scmd() and _base_build_sg_scmd_ieee() instead of calling
    directly scsi_dma_map().
    
    Fixes: 471ef9d4 ("mpt3sas: Build MPI SGL LIST on GEN2 HBAs and IEEE SGL LIST on GEN3 HBAs")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Link: https://lore.kernel.org/r/20240719073913.179559-3-dlemoal@kernel.orgReviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    82dbb57a
mpt3sas_base.c 254 KB