Message ID | 1483672082-5512-3-git-send-email-peterx@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2017年01月06日 11:08, Peter Xu wrote: > IOMMU needs to be migrated before all the PCI devices (in case there are > devices that will request for address translation). So marking it with a > priority higher than the default (which PCI devices and other belong). > Migration framework handled the rest. > > Signed-off-by: Peter Xu <peterx@redhat.com> > --- > hw/i386/intel_iommu.c | 21 ++++++++++++++++++++- > include/migration/vmstate.h | 1 + > 2 files changed, 21 insertions(+), 1 deletion(-) > > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > index 5f3e351..ea9e526 100644 > --- a/hw/i386/intel_iommu.c > +++ b/hw/i386/intel_iommu.c > @@ -1996,7 +1996,26 @@ static void vtd_iommu_notify_flag_changed(MemoryRegion *iommu, > > static const VMStateDescription vtd_vmstate = { > .name = "iommu-intel", > - .unmigratable = 1, > + .version_id = 1, > + .minimum_version_id = 1, > + .priority = MIG_PRI_IOMMU, > + .fields = (VMStateField[]) { > + VMSTATE_UINT64(root, IntelIOMMUState), > + VMSTATE_UINT64(intr_root, IntelIOMMUState), > + VMSTATE_UINT64(iq, IntelIOMMUState), > + VMSTATE_UINT32(intr_size, IntelIOMMUState), > + VMSTATE_UINT16(iq_head, IntelIOMMUState), > + VMSTATE_UINT16(iq_tail, IntelIOMMUState), > + VMSTATE_UINT16(iq_size, IntelIOMMUState), > + VMSTATE_UINT16(next_frcd_reg, IntelIOMMUState), > + VMSTATE_UINT8(iq_last_desc_type, IntelIOMMUState), > + VMSTATE_BOOL(root_extended, IntelIOMMUState), > + VMSTATE_BOOL(dmar_enabled, IntelIOMMUState), > + VMSTATE_BOOL(qi_enabled, IntelIOMMUState), > + VMSTATE_BOOL(intr_enabled, IntelIOMMUState), > + VMSTATE_BOOL(intr_eime, IntelIOMMUState), > + VMSTATE_END_OF_LIST() > + } > }; Looks like register values were missed (e.g csr[]) ? > > static const MemoryRegionOps vtd_mem_ops = { > diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h > index 1a22887..2125829 100644 > --- a/include/migration/vmstate.h > +++ b/include/migration/vmstate.h > @@ -188,6 +188,7 @@ enum VMStateFlags { > > typedef enum { > MIG_PRI_DEFAULT = 0, > + MIG_PRI_IOMMU, /* Must happen before PCI devices */ > MIG_PRI_MAX, > } MigrationPriority; >
On Fri, Jan 06, 2017 at 11:42:30AM +0800, Jason Wang wrote: > > > On 2017年01月06日 11:08, Peter Xu wrote: > >IOMMU needs to be migrated before all the PCI devices (in case there are > >devices that will request for address translation). So marking it with a > >priority higher than the default (which PCI devices and other belong). > >Migration framework handled the rest. > > > >Signed-off-by: Peter Xu <peterx@redhat.com> > >--- > > hw/i386/intel_iommu.c | 21 ++++++++++++++++++++- > > include/migration/vmstate.h | 1 + > > 2 files changed, 21 insertions(+), 1 deletion(-) > > > >diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > >index 5f3e351..ea9e526 100644 > >--- a/hw/i386/intel_iommu.c > >+++ b/hw/i386/intel_iommu.c > >@@ -1996,7 +1996,26 @@ static void vtd_iommu_notify_flag_changed(MemoryRegion *iommu, > > static const VMStateDescription vtd_vmstate = { > > .name = "iommu-intel", > >- .unmigratable = 1, > >+ .version_id = 1, > >+ .minimum_version_id = 1, > >+ .priority = MIG_PRI_IOMMU, > >+ .fields = (VMStateField[]) { > >+ VMSTATE_UINT64(root, IntelIOMMUState), > >+ VMSTATE_UINT64(intr_root, IntelIOMMUState), > >+ VMSTATE_UINT64(iq, IntelIOMMUState), > >+ VMSTATE_UINT32(intr_size, IntelIOMMUState), > >+ VMSTATE_UINT16(iq_head, IntelIOMMUState), > >+ VMSTATE_UINT16(iq_tail, IntelIOMMUState), > >+ VMSTATE_UINT16(iq_size, IntelIOMMUState), > >+ VMSTATE_UINT16(next_frcd_reg, IntelIOMMUState), > >+ VMSTATE_UINT8(iq_last_desc_type, IntelIOMMUState), > >+ VMSTATE_BOOL(root_extended, IntelIOMMUState), > >+ VMSTATE_BOOL(dmar_enabled, IntelIOMMUState), > >+ VMSTATE_BOOL(qi_enabled, IntelIOMMUState), > >+ VMSTATE_BOOL(intr_enabled, IntelIOMMUState), > >+ VMSTATE_BOOL(intr_eime, IntelIOMMUState), > >+ VMSTATE_END_OF_LIST() > >+ } > > }; > > Looks like register values were missed (e.g csr[]) ? Oops, I missed the most important thing. :) And obviously it even escaped from smoke test... Thanks Jason. Will repost. -- peterx
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 5f3e351..ea9e526 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -1996,7 +1996,26 @@ static void vtd_iommu_notify_flag_changed(MemoryRegion *iommu, static const VMStateDescription vtd_vmstate = { .name = "iommu-intel", - .unmigratable = 1, + .version_id = 1, + .minimum_version_id = 1, + .priority = MIG_PRI_IOMMU, + .fields = (VMStateField[]) { + VMSTATE_UINT64(root, IntelIOMMUState), + VMSTATE_UINT64(intr_root, IntelIOMMUState), + VMSTATE_UINT64(iq, IntelIOMMUState), + VMSTATE_UINT32(intr_size, IntelIOMMUState), + VMSTATE_UINT16(iq_head, IntelIOMMUState), + VMSTATE_UINT16(iq_tail, IntelIOMMUState), + VMSTATE_UINT16(iq_size, IntelIOMMUState), + VMSTATE_UINT16(next_frcd_reg, IntelIOMMUState), + VMSTATE_UINT8(iq_last_desc_type, IntelIOMMUState), + VMSTATE_BOOL(root_extended, IntelIOMMUState), + VMSTATE_BOOL(dmar_enabled, IntelIOMMUState), + VMSTATE_BOOL(qi_enabled, IntelIOMMUState), + VMSTATE_BOOL(intr_enabled, IntelIOMMUState), + VMSTATE_BOOL(intr_eime, IntelIOMMUState), + VMSTATE_END_OF_LIST() + } }; static const MemoryRegionOps vtd_mem_ops = { diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 1a22887..2125829 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -188,6 +188,7 @@ enum VMStateFlags { typedef enum { MIG_PRI_DEFAULT = 0, + MIG_PRI_IOMMU, /* Must happen before PCI devices */ MIG_PRI_MAX, } MigrationPriority;
IOMMU needs to be migrated before all the PCI devices (in case there are devices that will request for address translation). So marking it with a priority higher than the default (which PCI devices and other belong). Migration framework handled the rest. Signed-off-by: Peter Xu <peterx@redhat.com> --- hw/i386/intel_iommu.c | 21 ++++++++++++++++++++- include/migration/vmstate.h | 1 + 2 files changed, 21 insertions(+), 1 deletion(-)