Message ID | 1492173995-14140-5-git-send-email-eric.auger@redhat.com |
---|---|
State | New |
Headers | show |
On Fri, Apr 14, 2017 at 6:16 PM, Eric Auger <eric.auger@redhat.com> wrote: > We change the restoration priority of both the GICv3 and ITS. The > GICv3 must be restored before the ITS and the ITS needs to be restored > before PCIe devices since it translates their MSI transactions. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > Reviewed-by: Juan Quintela <quintela@redhat.com> Tested-by: Prakash, Brahmajyosyula <Brahmajyosyula.Prakash@cavium.com>
On 2017/4/14 20:46, Eric Auger wrote: > We change the restoration priority of both the GICv3 and ITS. The > GICv3 must be restored before the ITS and the ITS needs to be restored > before PCIe devices since it translates their MSI transactions. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > Reviewed-by: Juan Quintela <quintela@redhat.com> > > --- > v2 -> v3: > - reword migration blocker message > - remove unmigratable setting to false > > v1 -> v2: > - handle case where migrate_add_blocker fails > - add comments along with ITS and GICv3 migration priorities > --- > hw/intc/arm_gicv3_common.c | 1 + > hw/intc/arm_gicv3_its_common.c | 2 +- > hw/intc/arm_gicv3_its_kvm.c | 24 ++++++++++++------------ > include/migration/vmstate.h | 2 ++ > 4 files changed, 16 insertions(+), 13 deletions(-) > > diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c > index c6493d6..4228b7c 100644 > --- a/hw/intc/arm_gicv3_common.c > +++ b/hw/intc/arm_gicv3_common.c > @@ -145,6 +145,7 @@ static const VMStateDescription vmstate_gicv3 = { > .minimum_version_id = 1, > .pre_save = gicv3_pre_save, > .post_load = gicv3_post_load, > + .priority = MIG_PRI_GICV3, > .fields = (VMStateField[]) { > VMSTATE_UINT32(gicd_ctlr, GICv3State), > VMSTATE_UINT32_ARRAY(gicd_statusr, GICv3State, 2), > diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c > index efab8c7..22ce4c4 100644 > --- a/hw/intc/arm_gicv3_its_common.c > +++ b/hw/intc/arm_gicv3_its_common.c > @@ -48,7 +48,7 @@ static const VMStateDescription vmstate_its = { > .name = "arm_gicv3_its", > .pre_save = gicv3_its_pre_save, > .post_load = gicv3_its_post_load, > - .unmigratable = true, > + .priority = MIG_PRI_GICV3_ITS, > .fields = (VMStateField[]) { > VMSTATE_UINT32(ctlr, GICv3ITSState), > VMSTATE_UINT32(iidr, GICv3ITSState), > diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c > index 7c5502c..8401d2f 100644 > --- a/hw/intc/arm_gicv3_its_kvm.c > +++ b/hw/intc/arm_gicv3_its_kvm.c > @@ -77,18 +77,6 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp) > GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev); > Error *local_err = NULL; > > - /* > - * Block migration of a KVM GICv3 ITS device: the API for saving and > - * restoring the state in the kernel is not yet available > - */ > - error_setg(&s->migration_blocker, "vITS migration is not implemented"); > - migrate_add_blocker(s->migration_blocker, &local_err); > - if (local_err) { > - error_propagate(errp, local_err); > - error_free(s->migration_blocker); > - return; > - } > - > s->dev_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_ITS, false); > if (s->dev_fd < 0) { > error_setg_errno(errp, -s->dev_fd, "error creating in-kernel ITS"); > @@ -105,6 +93,18 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp) > > gicv3_its_init_mmio(s, NULL); > > + if (!kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ITS_REGS, > + GITS_CTLR)) { > + error_setg(&s->migration_blocker, "This operating system kernel " > + "does not support vGICv3 migration"); s/vGICv3/vITS > + migrate_add_blocker(s->migration_blocker, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + error_free(s->migration_blocker); > + return; > + } > + } > + > kvm_msi_use_devid = true; > kvm_gsi_direct_mapping = false; > kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled(); > diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h > index f2dbf84..8dab9c7 100644 > --- a/include/migration/vmstate.h > +++ b/include/migration/vmstate.h > @@ -198,6 +198,8 @@ enum VMStateFlags { > typedef enum { > MIG_PRI_DEFAULT = 0, > MIG_PRI_IOMMU, /* Must happen before PCI devices */ > + MIG_PRI_GICV3_ITS, /* Must happen before PCI devices */ > + MIG_PRI_GICV3, /* Must happen before the ITS */ > MIG_PRI_MAX, > } MigrationPriority; > > Thanks,
Hi Shannon, On 19/05/2017 12:30, Shannon Zhao wrote: > > > On 2017/4/14 20:46, Eric Auger wrote: >> We change the restoration priority of both the GICv3 and ITS. The >> GICv3 must be restored before the ITS and the ITS needs to be restored >> before PCIe devices since it translates their MSI transactions. >> >> Signed-off-by: Eric Auger <eric.auger@redhat.com> >> Reviewed-by: Juan Quintela <quintela@redhat.com> >> >> --- >> v2 -> v3: >> - reword migration blocker message >> - remove unmigratable setting to false >> >> v1 -> v2: >> - handle case where migrate_add_blocker fails >> - add comments along with ITS and GICv3 migration priorities >> --- >> hw/intc/arm_gicv3_common.c | 1 + >> hw/intc/arm_gicv3_its_common.c | 2 +- >> hw/intc/arm_gicv3_its_kvm.c | 24 ++++++++++++------------ >> include/migration/vmstate.h | 2 ++ >> 4 files changed, 16 insertions(+), 13 deletions(-) >> >> diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c >> index c6493d6..4228b7c 100644 >> --- a/hw/intc/arm_gicv3_common.c >> +++ b/hw/intc/arm_gicv3_common.c >> @@ -145,6 +145,7 @@ static const VMStateDescription vmstate_gicv3 = { >> .minimum_version_id = 1, >> .pre_save = gicv3_pre_save, >> .post_load = gicv3_post_load, >> + .priority = MIG_PRI_GICV3, >> .fields = (VMStateField[]) { >> VMSTATE_UINT32(gicd_ctlr, GICv3State), >> VMSTATE_UINT32_ARRAY(gicd_statusr, GICv3State, 2), >> diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c >> index efab8c7..22ce4c4 100644 >> --- a/hw/intc/arm_gicv3_its_common.c >> +++ b/hw/intc/arm_gicv3_its_common.c >> @@ -48,7 +48,7 @@ static const VMStateDescription vmstate_its = { >> .name = "arm_gicv3_its", >> .pre_save = gicv3_its_pre_save, >> .post_load = gicv3_its_post_load, >> - .unmigratable = true, >> + .priority = MIG_PRI_GICV3_ITS, >> .fields = (VMStateField[]) { >> VMSTATE_UINT32(ctlr, GICv3ITSState), >> VMSTATE_UINT32(iidr, GICv3ITSState), >> diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c >> index 7c5502c..8401d2f 100644 >> --- a/hw/intc/arm_gicv3_its_kvm.c >> +++ b/hw/intc/arm_gicv3_its_kvm.c >> @@ -77,18 +77,6 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp) >> GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev); >> Error *local_err = NULL; >> >> - /* >> - * Block migration of a KVM GICv3 ITS device: the API for saving and >> - * restoring the state in the kernel is not yet available >> - */ >> - error_setg(&s->migration_blocker, "vITS migration is not implemented"); >> - migrate_add_blocker(s->migration_blocker, &local_err); >> - if (local_err) { >> - error_propagate(errp, local_err); >> - error_free(s->migration_blocker); >> - return; >> - } >> - >> s->dev_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_ITS, false); >> if (s->dev_fd < 0) { >> error_setg_errno(errp, -s->dev_fd, "error creating in-kernel ITS"); >> @@ -105,6 +93,18 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp) >> >> gicv3_its_init_mmio(s, NULL); >> >> + if (!kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ITS_REGS, >> + GITS_CTLR)) { >> + error_setg(&s->migration_blocker, "This operating system kernel " >> + "does not support vGICv3 migration"); > s/vGICv3/vITS Done Thanks for reporting this! Eric >> + migrate_add_blocker(s->migration_blocker, &local_err); >> + if (local_err) { >> + error_propagate(errp, local_err); >> + error_free(s->migration_blocker); >> + return; >> + } >> + } >> + >> kvm_msi_use_devid = true; >> kvm_gsi_direct_mapping = false; >> kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled(); >> diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h >> index f2dbf84..8dab9c7 100644 >> --- a/include/migration/vmstate.h >> +++ b/include/migration/vmstate.h >> @@ -198,6 +198,8 @@ enum VMStateFlags { >> typedef enum { >> MIG_PRI_DEFAULT = 0, >> MIG_PRI_IOMMU, /* Must happen before PCI devices */ >> + MIG_PRI_GICV3_ITS, /* Must happen before PCI devices */ >> + MIG_PRI_GICV3, /* Must happen before the ITS */ >> MIG_PRI_MAX, >> } MigrationPriority; >> >> > > Thanks, >
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c index c6493d6..4228b7c 100644 --- a/hw/intc/arm_gicv3_common.c +++ b/hw/intc/arm_gicv3_common.c @@ -145,6 +145,7 @@ static const VMStateDescription vmstate_gicv3 = { .minimum_version_id = 1, .pre_save = gicv3_pre_save, .post_load = gicv3_post_load, + .priority = MIG_PRI_GICV3, .fields = (VMStateField[]) { VMSTATE_UINT32(gicd_ctlr, GICv3State), VMSTATE_UINT32_ARRAY(gicd_statusr, GICv3State, 2), diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c index efab8c7..22ce4c4 100644 --- a/hw/intc/arm_gicv3_its_common.c +++ b/hw/intc/arm_gicv3_its_common.c @@ -48,7 +48,7 @@ static const VMStateDescription vmstate_its = { .name = "arm_gicv3_its", .pre_save = gicv3_its_pre_save, .post_load = gicv3_its_post_load, - .unmigratable = true, + .priority = MIG_PRI_GICV3_ITS, .fields = (VMStateField[]) { VMSTATE_UINT32(ctlr, GICv3ITSState), VMSTATE_UINT32(iidr, GICv3ITSState), diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c index 7c5502c..8401d2f 100644 --- a/hw/intc/arm_gicv3_its_kvm.c +++ b/hw/intc/arm_gicv3_its_kvm.c @@ -77,18 +77,6 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp) GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev); Error *local_err = NULL; - /* - * Block migration of a KVM GICv3 ITS device: the API for saving and - * restoring the state in the kernel is not yet available - */ - error_setg(&s->migration_blocker, "vITS migration is not implemented"); - migrate_add_blocker(s->migration_blocker, &local_err); - if (local_err) { - error_propagate(errp, local_err); - error_free(s->migration_blocker); - return; - } - s->dev_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_ITS, false); if (s->dev_fd < 0) { error_setg_errno(errp, -s->dev_fd, "error creating in-kernel ITS"); @@ -105,6 +93,18 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp) gicv3_its_init_mmio(s, NULL); + if (!kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ITS_REGS, + GITS_CTLR)) { + error_setg(&s->migration_blocker, "This operating system kernel " + "does not support vGICv3 migration"); + migrate_add_blocker(s->migration_blocker, &local_err); + if (local_err) { + error_propagate(errp, local_err); + error_free(s->migration_blocker); + return; + } + } + kvm_msi_use_devid = true; kvm_gsi_direct_mapping = false; kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled(); diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index f2dbf84..8dab9c7 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -198,6 +198,8 @@ enum VMStateFlags { typedef enum { MIG_PRI_DEFAULT = 0, MIG_PRI_IOMMU, /* Must happen before PCI devices */ + MIG_PRI_GICV3_ITS, /* Must happen before PCI devices */ + MIG_PRI_GICV3, /* Must happen before the ITS */ MIG_PRI_MAX, } MigrationPriority;