|
@@ -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();
|