[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 17/17] hw/intc/arm_gicv3_its: Allow save/restore
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 17/17] hw/intc/arm_gicv3_its: Allow save/restore |
Date: |
Tue, 13 Jun 2017 15:07:06 +0100 |
From: Eric Auger <address@hidden>
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 <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
Message-id: address@hidden
Signed-off-by: Peter Maydell <address@hidden>
---
include/migration/vmstate.h | 2 ++
hw/intc/arm_gicv3_common.c | 1 +
hw/intc/arm_gicv3_its_common.c | 2 +-
hw/intc/arm_gicv3_its_kvm.c | 24 ++++++++++++------------
4 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 79a4b35..f3f3c2a 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -149,6 +149,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;
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 696c11c..68b20fc 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 4cd8f5f..1f8991b 100644
--- a/hw/intc/arm_gicv3_its_kvm.c
+++ b/hw/intc/arm_gicv3_its_kvm.c
@@ -85,18 +85,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");
@@ -113,6 +101,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 vITS 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();
--
2.7.4
- [Qemu-devel] [PULL 00/17] target-arm queue, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 15/17] hw/intc/arm_gicv3_its: Implement state save/restore, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 16/17] hw/intc/arm_gicv3_kvm: Implement pending table save, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 14/17] kvm-all: Pass an error object to kvm_device_access, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 09/17] hw/misc/exynos4210_pmu: Add support for system poweroff, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 12/17] aspeed: add a temp sensor device on I2C bus 3, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 05/17] hw/arm/exynos: Move DRAM initialization next boards, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 13/17] timer/aspeed: fix timer enablement when a reload is not set, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 10/17] timer.h: Provide better monotonic time, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 01/17] hw/intc/exynos4210_gic: Use more meaningful name for local variable, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 17/17] hw/intc/arm_gicv3_its: Allow save/restore,
Peter Maydell <=
- [Qemu-devel] [PULL 02/17] hw/timer/exynos4210_mct: Fix checkpatch style errors, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 03/17] hw/timer/exynos4210_mct: Cleanup indentation and empty new lines, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 11/17] hw/misc: add a TMP42{1, 2, 3} device model, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 06/17] hw/arm/exynos: Declare local variables in some order, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 04/17] hw/timer/exynos4210_mct: Remove unused defines, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 08/17] hw/intc/exynos4210_gic: Constify array of combiner interrupts, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 07/17] hw/arm/exynos: Use type define instead of hard-coded a9mpcore_priv string, Peter Maydell, 2017/06/13
- Re: [Qemu-devel] [PULL 00/17] target-arm queue, no-reply, 2017/06/13
- Re: [Qemu-devel] [PULL 00/17] target-arm queue, Peter Maydell, 2017/06/13