|
|
76daa3 |
From 88f3005a6fb5f44406a25229a302261ad1a6f8d9 Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Auger Eric <eric.auger@redhat.com>
|
|
|
76daa3 |
Date: Fri, 16 Jun 2017 15:17:56 +0200
|
|
|
76daa3 |
Subject: [PATCH 5/5] hw/intc/arm_gicv3_its: Allow save/restore
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Auger Eric <eric.auger@redhat.com>
|
|
|
76daa3 |
Message-id: <1497626276-18221-6-git-send-email-eric.auger@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75636
|
|
|
76daa3 |
O-Subject: [Pegas-1.0 qemu-kvm PATCH v2 5/5] hw/intc/arm_gicv3_its: Allow save/restore
|
|
|
76daa3 |
Bugzilla: 1462061
|
|
|
76daa3 |
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
We change the restoration priority of both the GICv3 and ITS. The
|
|
|
76daa3 |
GICv3 must be restored before the ITS and the ITS needs to be restored
|
|
|
76daa3 |
before PCIe devices since it translates their MSI transactions.
|
|
|
76daa3 |
|
|
|
76daa3 |
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
|
|
76daa3 |
Message-id: 1497023553-18411-5-git-send-email-eric.auger@redhat.com
|
|
|
76daa3 |
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
|
|
76daa3 |
(cherry picked from commit 252a7a6a968c279a4636a86b0559ba3a930a90b5)
|
|
|
76daa3 |
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
hw/intc/arm_gicv3_common.c | 1 +
|
|
|
76daa3 |
hw/intc/arm_gicv3_its_common.c | 2 +-
|
|
|
76daa3 |
hw/intc/arm_gicv3_its_kvm.c | 24 ++++++++++++------------
|
|
|
76daa3 |
include/migration/vmstate.h | 2 ++
|
|
|
76daa3 |
4 files changed, 16 insertions(+), 13 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
|
|
|
76daa3 |
index c6493d6..4228b7c 100644
|
|
|
76daa3 |
--- a/hw/intc/arm_gicv3_common.c
|
|
|
76daa3 |
+++ b/hw/intc/arm_gicv3_common.c
|
|
|
76daa3 |
@@ -145,6 +145,7 @@ static const VMStateDescription vmstate_gicv3 = {
|
|
|
76daa3 |
.minimum_version_id = 1,
|
|
|
76daa3 |
.pre_save = gicv3_pre_save,
|
|
|
76daa3 |
.post_load = gicv3_post_load,
|
|
|
76daa3 |
+ .priority = MIG_PRI_GICV3,
|
|
|
76daa3 |
.fields = (VMStateField[]) {
|
|
|
76daa3 |
VMSTATE_UINT32(gicd_ctlr, GICv3State),
|
|
|
76daa3 |
VMSTATE_UINT32_ARRAY(gicd_statusr, GICv3State, 2),
|
|
|
76daa3 |
diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c
|
|
|
76daa3 |
index 696c11c..68b20fc 100644
|
|
|
76daa3 |
--- a/hw/intc/arm_gicv3_its_common.c
|
|
|
76daa3 |
+++ b/hw/intc/arm_gicv3_its_common.c
|
|
|
76daa3 |
@@ -48,7 +48,7 @@ static const VMStateDescription vmstate_its = {
|
|
|
76daa3 |
.name = "arm_gicv3_its",
|
|
|
76daa3 |
.pre_save = gicv3_its_pre_save,
|
|
|
76daa3 |
.post_load = gicv3_its_post_load,
|
|
|
76daa3 |
- .unmigratable = true,
|
|
|
76daa3 |
+ .priority = MIG_PRI_GICV3_ITS,
|
|
|
76daa3 |
.fields = (VMStateField[]) {
|
|
|
76daa3 |
VMSTATE_UINT32(ctlr, GICv3ITSState),
|
|
|
76daa3 |
VMSTATE_UINT32(iidr, GICv3ITSState),
|
|
|
76daa3 |
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
|
|
|
76daa3 |
index 3c7c28c..04a51cf 100644
|
|
|
76daa3 |
--- a/hw/intc/arm_gicv3_its_kvm.c
|
|
|
76daa3 |
+++ b/hw/intc/arm_gicv3_its_kvm.c
|
|
|
76daa3 |
@@ -85,18 +85,6 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
|
|
|
76daa3 |
GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
|
|
|
76daa3 |
Error *local_err = NULL;
|
|
|
76daa3 |
|
|
|
76daa3 |
- /*
|
|
|
76daa3 |
- * Block migration of a KVM GICv3 ITS device: the API for saving and
|
|
|
76daa3 |
- * restoring the state in the kernel is not yet available
|
|
|
76daa3 |
- */
|
|
|
76daa3 |
- error_setg(&s->migration_blocker, "vITS migration is not implemented");
|
|
|
76daa3 |
- migrate_add_blocker(s->migration_blocker, &local_err);
|
|
|
76daa3 |
- if (local_err) {
|
|
|
76daa3 |
- error_propagate(errp, local_err);
|
|
|
76daa3 |
- error_free(s->migration_blocker);
|
|
|
76daa3 |
- return;
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
-
|
|
|
76daa3 |
s->dev_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
|
|
|
76daa3 |
if (s->dev_fd < 0) {
|
|
|
76daa3 |
error_setg_errno(errp, -s->dev_fd, "error creating in-kernel ITS");
|
|
|
76daa3 |
@@ -113,6 +101,18 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
|
|
|
76daa3 |
|
|
|
76daa3 |
gicv3_its_init_mmio(s, NULL);
|
|
|
76daa3 |
|
|
|
76daa3 |
+ if (!kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ITS_REGS,
|
|
|
76daa3 |
+ GITS_CTLR)) {
|
|
|
76daa3 |
+ error_setg(&s->migration_blocker, "This operating system kernel "
|
|
|
76daa3 |
+ "does not support vITS migration");
|
|
|
76daa3 |
+ migrate_add_blocker(s->migration_blocker, &local_err);
|
|
|
76daa3 |
+ if (local_err) {
|
|
|
76daa3 |
+ error_propagate(errp, local_err);
|
|
|
76daa3 |
+ error_free(s->migration_blocker);
|
|
|
76daa3 |
+ return;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
kvm_msi_use_devid = true;
|
|
|
76daa3 |
kvm_gsi_direct_mapping = false;
|
|
|
76daa3 |
kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled();
|
|
|
76daa3 |
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
|
|
|
76daa3 |
index f2dbf84..8dab9c7 100644
|
|
|
76daa3 |
--- a/include/migration/vmstate.h
|
|
|
76daa3 |
+++ b/include/migration/vmstate.h
|
|
|
76daa3 |
@@ -198,6 +198,8 @@ enum VMStateFlags {
|
|
|
76daa3 |
typedef enum {
|
|
|
76daa3 |
MIG_PRI_DEFAULT = 0,
|
|
|
76daa3 |
MIG_PRI_IOMMU, /* Must happen before PCI devices */
|
|
|
76daa3 |
+ MIG_PRI_GICV3_ITS, /* Must happen before PCI devices */
|
|
|
76daa3 |
+ MIG_PRI_GICV3, /* Must happen before the ITS */
|
|
|
76daa3 |
MIG_PRI_MAX,
|
|
|
76daa3 |
} MigrationPriority;
|
|
|
76daa3 |
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|