qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] intel_iommu migration compatibiltiy for scalable mode e


From: Peter Xu
Subject: Re: [Qemu-devel] intel_iommu migration compatibiltiy for scalable mode emulation
Date: Thu, 28 Mar 2019 14:13:46 +0800
User-agent: Mutt/1.10.1 (2018-07-13)

On Wed, Mar 27, 2019 at 06:17:08PM -0400, Michael S. Tsirkin wrote:
> On Wed, Mar 27, 2019 at 08:02:24PM +0000, Dr. David Alan Gilbert wrote:
> > (Oops, originally forgot to cc the list)
> > 
> > * Dr. David Alan Gilbert (address@hidden) wrote:
> > > Hi,
> > >   Commit fb43cf739 introduced a new iommu migration field called
> > > 'root_scalable' - but it doesn't do any machine type checks, which means
> > > it breaks migration between 3.1<->4.0 -  we should fix this for 4.0.
> > > 
> > > Can we make this conditional on the 4.0 machine type?
> > > 
> > > Dave
> > > --
> > > Dr. David Alan Gilbert / address@hidden / Manchester, UK
> > --
> > Dr. David Alan Gilbert / address@hidden / Manchester, UK
> 
> Yes we have to. Peter?

Oh yes... My fault to not have noticed it when reviewing.

A simple fix could be simply boosting the version:

diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index b90de6c664..c1f4604143 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -2950,7 +2950,7 @@ static int vtd_post_load(void *opaque, int version_id)
 
 static const VMStateDescription vtd_vmstate = {
     .name = "iommu-intel",
-    .version_id = 1,
+    .version_id = 2,
     .minimum_version_id = 1,
     .priority = MIG_PRI_IOMMU,
     .post_load = vtd_post_load,
@@ -2966,7 +2966,7 @@ static const VMStateDescription vtd_vmstate = {
         VMSTATE_UINT8_ARRAY(csr, IntelIOMMUState, DMAR_REG_SIZE),
         VMSTATE_UINT8(iq_last_desc_type, IntelIOMMUState),
         VMSTATE_BOOL(root_extended, IntelIOMMUState),
-        VMSTATE_BOOL(root_scalable, IntelIOMMUState),
+        VMSTATE_BOOL_V(root_scalable, IntelIOMMUState, 2),
         VMSTATE_BOOL(dmar_enabled, IntelIOMMUState),
         VMSTATE_BOOL(qi_enabled, IntelIOMMUState),
         VMSTATE_BOOL(intr_enabled, IntelIOMMUState),

But maybe it won't satisfy 4.0->3.1 migrations (hmm Dave could you
hint me on why we need this backward migration again?  I probably
asked before but I must have forgotten!).

Another way is to calculate it during post load:

diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index b90de6c664..8a68f7fac5 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -162,6 +162,15 @@ static inline void vtd_iommu_unlock(IntelIOMMUState *s)
     qemu_mutex_unlock(&s->iommu_lock);
 }

+static void vtd_update_scalable_state(IntelIOMMUState *s)
+{
+    uint64_t val = vtd_get_quad_raw(s, DMAR_RTADDR_REG);
+
+    if (s->scalable_mode) {
+        s->root_scalable = val & VTD_RTADDR_SMT;
+    }
+}
+
 /* Whether the address space needs to notify new mappings */
 static inline gboolean vtd_as_has_map_notifier(VTDAddressSpace *as)
 {
@@ -1710,11 +1719,10 @@ static void vtd_root_table_setup(IntelIOMMUState *s)
 {
     s->root = vtd_get_quad_raw(s, DMAR_RTADDR_REG);
     s->root_extended = s->root & VTD_RTADDR_RTT;
-    if (s->scalable_mode) {
-        s->root_scalable = s->root & VTD_RTADDR_SMT;
-    }
     s->root &= VTD_RTADDR_ADDR_MASK(s->aw_bits);

+    vtd_update_scalable_state(s);
+
     trace_vtd_reg_dmar_root(s->root, s->root_extended);
 }

@@ -2945,6 +2953,12 @@ static int vtd_post_load(void *opaque, int version_id)
      */
     vtd_switch_address_space_all(iommu);

+    /*
+     * We don't migrate the root_scalable to make sure we won't break
+     * migrations from/to old binaries.
+     */
+    vtd_update_scalable_state(iommu);
+
     return 0;
 }

@@ -2966,7 +2980,6 @@ static const VMStateDescription vtd_vmstate = {
         VMSTATE_UINT8_ARRAY(csr, IntelIOMMUState, DMAR_REG_SIZE),
         VMSTATE_UINT8(iq_last_desc_type, IntelIOMMUState),
         VMSTATE_BOOL(root_extended, IntelIOMMUState),
-        VMSTATE_BOOL(root_scalable, IntelIOMMUState),
         VMSTATE_BOOL(dmar_enabled, IntelIOMMUState),
         VMSTATE_BOOL(qi_enabled, IntelIOMMUState),
         VMSTATE_BOOL(intr_enabled, IntelIOMMUState),

This is a bit longer but I think it should fix both directions (3.1
<-> 4.0 migrations).

Regards,

-- 
Peter Xu



reply via email to

[Prev in Thread] Current Thread [Next in Thread]