On 2025/8/28 17:17, Duan, Zhenzhong wrote:


-----Original Message-----
From: Liu, Yi L <[email protected]>
Subject: Re: [PATCH v5 07/21] intel_iommu: Introduce a new structure
VTDHostIOMMUDevice

On 2025/8/22 14:40, Zhenzhong Duan wrote:
Introduce a new structure VTDHostIOMMUDevice which replaces
HostIOMMUDevice to be stored in hash table.

It includes a reference to HostIOMMUDevice and IntelIOMMUState,
also includes BDF information which will be used in future
patches.

Signed-off-by: Zhenzhong Duan <[email protected]>
Reviewed-by: Eric Auger <[email protected]>
---
   hw/i386/intel_iommu_internal.h |  7 +++++++
   include/hw/i386/intel_iommu.h  |  2 +-
   hw/i386/intel_iommu.c          | 15 +++++++++++++--
   3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/hw/i386/intel_iommu_internal.h
b/hw/i386/intel_iommu_internal.h
index 360e937989..c7046eb4e2 100644
--- a/hw/i386/intel_iommu_internal.h
+++ b/hw/i386/intel_iommu_internal.h
@@ -28,6 +28,7 @@
   #ifndef HW_I386_INTEL_IOMMU_INTERNAL_H
   #define HW_I386_INTEL_IOMMU_INTERNAL_H
   #include "hw/i386/intel_iommu.h"
+#include "system/host_iommu_device.h"

   /*
    * Intel IOMMU register specification
@@ -608,4 +609,10 @@ typedef struct VTDRootEntry VTDRootEntry;
   /* Bits to decide the offset for each level */
   #define VTD_LEVEL_BITS           9

+typedef struct VTDHostIOMMUDevice {
+    IntelIOMMUState *iommu_state;
+    PCIBus *bus;
+    uint8_t devfn;
+    HostIOMMUDevice *hiod;
+} VTDHostIOMMUDevice;
   #endif
diff --git a/include/hw/i386/intel_iommu.h
b/include/hw/i386/intel_iommu.h
index e95477e855..50f9b27a45 100644
--- a/include/hw/i386/intel_iommu.h
+++ b/include/hw/i386/intel_iommu.h
@@ -295,7 +295,7 @@ struct IntelIOMMUState {
       /* list of registered notifiers */
       QLIST_HEAD(, VTDAddressSpace) vtd_as_with_notifiers;

-    GHashTable *vtd_host_iommu_dev;             /*
HostIOMMUDevice */
+    GHashTable *vtd_host_iommu_dev;             /*
VTDHostIOMMUDevice */

       /* interrupt remapping */
       bool intr_enabled;              /* Whether guest enabled IR */
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index e3b871de70..512ca4fdc5 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -281,7 +281,10 @@ static gboolean vtd_hiod_equal(gconstpointer v1,
gconstpointer v2)

   static void vtd_hiod_destroy(gpointer v)
   {
-    object_unref(v);
+    VTDHostIOMMUDevice *vtd_hiod = v;
+
+    object_unref(vtd_hiod->hiod);
+    g_free(vtd_hiod);
   }

   static gboolean vtd_hash_remove_by_domain(gpointer key, gpointer
value,
@@ -4371,6 +4374,7 @@ static bool vtd_dev_set_iommu_device(PCIBus
*bus, void *opaque, int devfn,
                                        HostIOMMUDevice *hiod,
Error **errp)
   {
       IntelIOMMUState *s = opaque;
+    VTDHostIOMMUDevice *vtd_hiod;
       struct vtd_as_key key = {
           .bus = bus,
           .devfn = devfn,
@@ -4387,7 +4391,14 @@ static bool vtd_dev_set_iommu_device(PCIBus
*bus, void *opaque, int devfn,
           return false;
       }

+    vtd_hiod = g_malloc0(sizeof(VTDHostIOMMUDevice));
+    vtd_hiod->bus = bus;
+    vtd_hiod->devfn = (uint8_t)devfn;
+    vtd_hiod->iommu_state = s;
+    vtd_hiod->hiod = hiod;

how about moving it after the below if branch? :)

They will be used in vtd_check_hiod(), so need to initialize them early.

got it. it's needed by following patch.


Reply via email to