• Gerald Schaefer's avatar
    s390/pci_dma: fix DMA table corruption with > 4 TB main memory · 69eea95c
    Gerald Schaefer authored
    DMA addresses returned from map_page() are calculated by using an iommu
    bitmap plus a start_dma offset. The size of this bitmap is based on the main
    memory size. If we have more than (4 TB - start_dma) main memory, the DMA
    address calculation will also produce addresses > 4 TB. Such addresses
    cannot be inserted in the 3-level DMA page table, instead the entries
    modulo 4 TB will be overwritten.
    
    Fix this by restricting the iommu bitmap size to (4 TB - start_dma).
    Also set zdev->end_dma to the actual end address of the usable
    range, instead of the theoretical maximum as reported by the hardware,
    which fixes a sanity check in dma_map() and also the IOMMU API domain
    geometry aperture calculation.
    Signed-off-by: default avatarGerald Schaefer <gerald.schaefer@de.ibm.com>
    Reviewed-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    69eea95c
pci_dma.c 13.7 KB