]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
smmu: Clear SMMUPciBus pointer cache when system reset
authorZhenzhong Duan <zhenzhong.duan@intel.com>
Thu, 25 Jan 2024 07:37:06 +0000 (15:37 +0800)
committerMichael Tokarev <mjt@tls.msk.ru>
Thu, 15 Feb 2024 08:13:33 +0000 (11:13 +0300)
s->smmu_pcibus_by_bus_num is a SMMUPciBus pointer cache indexed
by bus number, bus number may not always be a fixed value,
i.e., guest reboot to different kernel which set bus number with
different algorithm.

This could lead to smmu_iommu_mr() providing the wrong iommu MR.

Suggested-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Message-Id: <20240125073706.339369-3-zhenzhong.duan@intel.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
(cherry picked from commit 8a6b3f4dc95a064e88adaca86374108da0ecb38d)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
hw/arm/smmu-common.c

index bbca3a8db3ce8995be5355e6979d2680d8bce1b7..7abc166eb349ebe68db7e7c0280a80c80f0da97e 100644 (file)
@@ -529,6 +529,8 @@ static void smmu_base_reset(DeviceState *dev)
 {
     SMMUState *s = ARM_SMMU(dev);
 
+    memset(s->smmu_pcibus_by_bus_num, 0, sizeof(s->smmu_pcibus_by_bus_num));
+
     g_hash_table_remove_all(s->configs);
     g_hash_table_remove_all(s->iotlb);
 }