@@ -1,7 +1,7 @@
/*
* QEMU S390x floating interrupt controller (flic)
*
- * Copyright 2014 IBM Corp.
+ * Copyright IBM Corp. 2014, 2017
* Author(s): Jens Freimann <jfrei@linux.vnet.ibm.com>
* Cornelia Huck <cornelia.huck@de.ibm.com>
*
@@ -136,9 +136,7 @@ static void qemu_s390_flic_reset(DeviceState *dev)
bool ais_needed(void *opaque)
{
- S390FLICState *s = opaque;
-
- return s->ais_supported;
+ return s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION);
}
static const VMStateDescription qemu_s390_flic_vmstate = {
@@ -185,8 +183,6 @@ static void s390_flic_common_realize(DeviceState *dev, Error **errp)
" (%d > %d)", max_batch, ADAPTER_ROUTES_MAX_GSI);
return;
}
-
- fs->ais_supported = s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION);
}
static void s390_flic_class_init(ObjectClass *oc, void *data)
@@ -1,7 +1,7 @@
/*
* QEMU S390x KVM floating interrupt controller (flic)
*
- * Copyright 2014 IBM Corp.
+ * Copyright IBM Corp. 2014, 2017
* Author(s): Jens Freimann <jfrei@linux.vnet.ibm.com>
* Cornelia Huck <cornelia.huck@de.ibm.com>
*
@@ -164,7 +164,7 @@ static int kvm_s390_modify_ais_mode(S390FLICState *fs, uint8_t isc,
.addr = (uint64_t)&req,
};
- if (!fs->ais_supported) {
+ if (!s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION)) {
return -ENOSYS;
}
@@ -181,7 +181,7 @@ static int kvm_s390_inject_airq(S390FLICState *fs, uint8_t type,
.attr = id,
};
- if (!fs->ais_supported) {
+ if (!s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION)) {
return -ENOSYS;
}
@@ -459,7 +459,7 @@ static int kvm_flic_ais_post_load(void *opaque, int version_id)
* migration from a host that has AIS to a host that has no AIS.
* In that case the target system will reject the migration here.
*/
- if (!ais_needed(flic)) {
+ if (!s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION)) {
return -ENOSYS;
}
@@ -557,6 +557,12 @@ static void kvm_s390_flic_realize(DeviceState *dev, Error **errp)
test_attr.group = KVM_DEV_FLIC_CLEAR_IO_IRQ;
flic_state->clear_io_supported = !ioctl(flic_state->fd,
KVM_HAS_DEVICE_ATTR, test_attr);
+ /* try enable the AIS facility */
+ test_attr.group = KVM_DEV_FLIC_AISM_ALL;
+ if (!ioctl(flic_state->fd, KVM_HAS_DEVICE_ATTR, test_attr)) {
+ kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_AIS, 0);
+ }
+
return;
fail:
error_propagate(errp, errp_local);
@@ -578,7 +584,7 @@ static void kvm_s390_flic_reset(DeviceState *dev)
flic_disable_wait_pfault(flic);
- if (fs->ais_supported) {
+ if (s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION)) {
for (isc = 0; isc <= MAX_ISC; isc++) {
rc = kvm_s390_modify_ais_mode(fs, isc, SIC_IRQ_MODE_ALL);
if (rc) {
@@ -1,7 +1,7 @@
/*
* Channel subsystem base support.
*
- * Copyright 2012 IBM Corp.
+ * Copyright IBM Corp. 2012, 2017
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
*
* This work is licensed under the terms of the GNU GPL, version 2 or (at
@@ -672,7 +672,7 @@ void css_adapter_interrupt(CssIoAdapterType type, uint8_t isc)
}
trace_css_adapter_interrupt(isc);
- if (fs->ais_supported) {
+ if (s390_has_feat(S390_FEAT_ADAPTER_INT_SUPPRESSION)) {
if (fsc->inject_airq(fs, type, isc, adapter->flags)) {
error_report("Failed to inject airq with AIS supported");
exit(1);
@@ -1,7 +1,7 @@
/*
* virtio ccw machine
*
- * Copyright 2012 IBM Corp.
+ * Copyright IBM Corp. 2012, 2017
* Copyright (c) 2009 Alexander Graf <agraf@suse.de>
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
*
@@ -279,11 +279,15 @@ static void ccw_init(MachineState *machine)
s390_sclp_init();
s390_memory_init(machine->ram_size);
+ /*
+ * This might also enable some KVM features like AIS, so it must
+ * be called before the CPU model
+ */
+ s390_flic_init();
+
/* init CPUs (incl. CPU model) early so s390_has_feature() works */
s390_init_cpus(machine);
- s390_flic_init();
-
/* get a BUS */
css_bus = virtual_css_bus_init();
s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline,
@@ -44,7 +44,6 @@ typedef struct S390FLICState {
SysBusDevice parent_obj;
/* to limit AdapterRoutes.num_routes for compat */
uint32_t adapter_routes_max_batch;
- bool ais_supported;
} S390FLICState;
#define S390_FLIC_COMMON_CLASS(klass) \
@@ -2,7 +2,7 @@
* QEMU S390x KVM implementation
*
* Copyright (c) 2009 Alexander Graf <agraf@suse.de>
- * Copyright IBM Corp. 2012
+ * Copyright IBM Corp. 2012, 2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -311,13 +311,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
}
}
- /*
- * The migration interface for ais was introduced with kernel 4.13
- * but the capability itself had been active since 4.12. As migration
- * support is considered necessary let's disable ais in the 2.10
- * machine.
- */
- /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
+ /* The AIS enablement happens in the flic realize */
qemu_mutex_init(&qemu_sigp_mutex);