[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 2/3] s390x/ais: enable ais when migration is
From: |
Christian Borntraeger |
Subject: |
Re: [Qemu-devel] [PATCH v3 2/3] s390x/ais: enable ais when migration is available |
Date: |
Fri, 29 Sep 2017 10:12:43 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 |
Conny can you maybe defer this patch?
Turns out that this patch will enable the ais feature, so you can do -cpu
z13,ais=on,
but it will not enable ais for the none machine
That means that libvirt will not enable ais for host-model or host-passthrough.
Reason seems to be that the flic interrupt controller is not created when the
none machine is used.
On 09/27/2017 09:20 AM, Christian Borntraeger wrote:
> Instead of unconditionally enabling the KVM AIS capability
> in the kvm arch init function, do this in the flic realize function
> when we know if migration is available. This requires to initialize
> flic before the CPUs (and cpu models).
>
> Signed-off-by: Christian Borntraeger <address@hidden>
> Reviewed-by: David Hildenbrand <address@hidden>
> ---
> hw/intc/s390_flic.c | 8 ++------
> hw/intc/s390_flic_kvm.c | 16 +++++++++++-----
> hw/s390x/css.c | 4 ++--
> hw/s390x/s390-virtio-ccw.c | 10 +++++++---
> include/hw/s390x/s390_flic.h | 1 -
> target/s390x/kvm.c | 10 ++--------
> 6 files changed, 24 insertions(+), 25 deletions(-)
>
> diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
> index 6eaf178..9858f0e 100644
> --- a/hw/intc/s390_flic.c
> +++ b/hw/intc/s390_flic.c
> @@ -1,7 +1,7 @@
> /*
> * QEMU S390x floating interrupt controller (flic)
> *
> - * Copyright 2014 IBM Corp.
> + * Copyright IBM Corp. 2014, 2017
> * Author(s): Jens Freimann <address@hidden>
> * Cornelia Huck <address@hidden>
> *
> @@ -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)
> diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
> index 7ead17a..0a370a9 100644
> --- a/hw/intc/s390_flic_kvm.c
> +++ b/hw/intc/s390_flic_kvm.c
> @@ -1,7 +1,7 @@
> /*
> * QEMU S390x KVM floating interrupt controller (flic)
> *
> - * Copyright 2014 IBM Corp.
> + * Copyright IBM Corp. 2014, 2017
> * Author(s): Jens Freimann <address@hidden>
> * Cornelia Huck <address@hidden>
> *
> @@ -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) {
> diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> index 75d4f30..1d4bb73 100644
> --- a/hw/s390x/css.c
> +++ b/hw/s390x/css.c
> @@ -1,7 +1,7 @@
> /*
> * Channel subsystem base support.
> *
> - * Copyright 2012 IBM Corp.
> + * Copyright IBM Corp. 2012, 2017
> * Author(s): Cornelia Huck <address@hidden>
> *
> * 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);
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index fafbc6d..98c82c2 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -1,7 +1,7 @@
> /*
> * virtio ccw machine
> *
> - * Copyright 2012 IBM Corp.
> + * Copyright IBM Corp. 2012, 2017
> * Copyright (c) 2009 Alexander Graf <address@hidden>
> * Author(s): Cornelia Huck <address@hidden>
> *
> @@ -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,
> diff --git a/include/hw/s390x/s390_flic.h b/include/hw/s390x/s390_flic.h
> index 7aab6ef..75fd83c 100644
> --- a/include/hw/s390x/s390_flic.h
> +++ b/include/hw/s390x/s390_flic.h
> @@ -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) \
> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index ebb75ca..9ee2ada 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -2,7 +2,7 @@
> * QEMU S390x KVM implementation
> *
> * Copyright (c) 2009 Alexander Graf <address@hidden>
> - * 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);
>