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