| From 324a0ffc5140c4ece5b720708da2c673a8d1b9cc Mon Sep 17 00:00:00 2001 |
| From: Thomas Huth <thuth@redhat.com> |
| Date: Tue, 1 Oct 2019 06:02:58 +0100 |
| Subject: [PATCH 12/22] s390: PCI: fix IOMMU region init |
| |
| RH-Author: Thomas Huth <thuth@redhat.com> |
| Message-id: <20191001060258.28206-2-thuth@redhat.com> |
| Patchwork-id: 90929 |
| O-Subject: [RHEL-8.2.0/RHEL-8.1.z qemu-kvm PATCH 1/1] s390: PCI: fix IOMMU region init |
| Bugzilla: 1754643 |
| RH-Acked-by: Jens Freimann <jfreimann@redhat.com> |
| RH-Acked-by: David Hildenbrand <david@redhat.com> |
| RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com> |
| |
| From: Matthew Rosato <mjrosato@linux.ibm.com> |
| |
| The fix in dbe9cf606c shrinks the IOMMU memory region to a size |
| that seems reasonable on the surface, however is actually too |
| small as it is based against a 0-mapped address space. This |
| causes breakage with small guests as they can overrun the IOMMU window. |
| |
| Let's go back to the prior method of initializing iommu for now. |
| |
| Fixes: dbe9cf606c ("s390x/pci: Set the iommu region size mpcifc request") |
| Reviewed-by: Pierre Morel <pmorel@linux.ibm.com> |
| Reported-by: Boris Fiuczynski <fiuczy@linux.ibm.com> |
| Tested-by: Boris Fiuczynski <fiuczy@linux.ibm.com> |
| Reported-by: Stefan Zimmerman <stzi@linux.ibm.com> |
| Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com> |
| Message-Id: <1569507036-15314-1-git-send-email-mjrosato@linux.ibm.com> |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| (cherry picked from commit 7df1dac5f1c85312474df9cb3a8fcae72303da62) |
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> |
| |
| hw/s390x/s390-pci-bus.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c |
| index 383b3e7..069e152 100644 |
| |
| |
| @@ -691,10 +691,15 @@ static const MemoryRegionOps s390_msi_ctrl_ops = { |
| |
| void s390_pci_iommu_enable(S390PCIIOMMU *iommu) |
| { |
| + /* |
| + * The iommu region is initialized against a 0-mapped address space, |
| + * so the smallest IOMMU region we can define runs from 0 to the end |
| + * of the PCI address space. |
| + */ |
| char *name = g_strdup_printf("iommu-s390-%04x", iommu->pbdev->uid); |
| memory_region_init_iommu(&iommu->iommu_mr, sizeof(iommu->iommu_mr), |
| TYPE_S390_IOMMU_MEMORY_REGION, OBJECT(&iommu->mr), |
| - name, iommu->pal - iommu->pba + 1); |
| + name, iommu->pal + 1); |
| iommu->enabled = true; |
| memory_region_add_subregion(&iommu->mr, 0, MEMORY_REGION(&iommu->iommu_mr)); |
| g_free(name); |
| -- |
| 1.8.3.1 |
| |