Message ID | 20180928093435.198573-1-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: Fence huge pages prior to 3.1 | expand |
On Fri, 28 Sep 2018 11:34:35 +0200 Janosch Frank <frankja@linux.ibm.com> wrote: > As the kernel has no way of disallowing the start of a huge page > backed VM, we can migrate a running huge backed VM to a host that has > no huge page KVM support. > > Let's glue huge page support support to the 3.1 machine, so we do not "As the QEMU code actively enabling huge page support in the kernel was added with 3.1, let's glue..." > migrate to a destination host that doesn't have QEMU huge page support > and can stop migration if KVM doesn't indicate support. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > --- > hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ > include/hw/s390x/s390-virtio-ccw.h | 3 +++ > target/s390x/kvm.c | 6 ++++++ > 3 files changed, 19 insertions(+) Looks good to me, waiting for review by others.
On 28/09/2018 11:34, Janosch Frank wrote: > As the kernel has no way of disallowing the start of a huge page > backed VM, we can migrate a running huge backed VM to a host that has > no huge page KVM support. > > Let's glue huge page support support to the 3.1 machine, so we do not > migrate to a destination host that doesn't have QEMU huge page support > and can stop migration if KVM doesn't indicate support. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > --- > hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ > include/hw/s390x/s390-virtio-ccw.h | 3 +++ > target/s390x/kvm.c | 6 ++++++ > 3 files changed, 19 insertions(+) > > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > index f0f7fdcadd..53fd7c975f 100644 > --- a/hw/s390x/s390-virtio-ccw.c > +++ b/hw/s390x/s390-virtio-ccw.c > @@ -456,6 +456,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) > s390mc->ri_allowed = true; > s390mc->cpu_model_allowed = true; > s390mc->css_migration_enabled = true; > + s390mc->hpage_1m_allowed = true; > mc->init = ccw_init; > mc->reset = s390_machine_reset; > mc->hot_add_cpu = s390_hot_add_cpu; > @@ -535,6 +536,12 @@ bool cpu_model_allowed(void) > return get_machine_class()->cpu_model_allowed; > } > > +bool hpage_1m_allowed(void) > +{ > + /* for "none" machine this results in true */ > + return get_machine_class()->hpage_1m_allowed; > +} > + > static char *machine_get_loadparm(Object *obj, Error **errp) > { > S390CcwMachineState *ms = S390_CCW_MACHINE(obj); > @@ -747,6 +754,9 @@ static void ccw_machine_3_0_instance_options(MachineState *machine) > > static void ccw_machine_3_0_class_options(MachineClass *mc) > { > + S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc); > + > + s390mc->hpage_1m_allowed = false; > ccw_machine_3_1_class_options(mc); > SET_MACHINE_COMPAT(mc, CCW_COMPAT_3_0); > } > diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h > index e9c4f4182b..8aa27199c9 100644 > --- a/include/hw/s390x/s390-virtio-ccw.h > +++ b/include/hw/s390x/s390-virtio-ccw.h > @@ -39,12 +39,15 @@ typedef struct S390CcwMachineClass { > bool ri_allowed; > bool cpu_model_allowed; > bool css_migration_enabled; > + bool hpage_1m_allowed; > } S390CcwMachineClass; > > /* runtime-instrumentation allowed by the machine */ > bool ri_allowed(void); > /* cpu model allowed by the machine */ > bool cpu_model_allowed(void); > +/* 1M huge page mappings allowed by the machine */ > +bool hpage_1m_allowed(void); > > /** > * Returns true if (vmstate based) migration of the channel subsystem > diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c > index 348e8cc546..323cb00e6a 100644 > --- a/target/s390x/kvm.c > +++ b/target/s390x/kvm.c > @@ -292,6 +292,12 @@ static int kvm_s390_configure_mempath_backing(KVMState *s) > return 0; > } > > + if (!hpage_1m_allowed()) { > + error_report("This QEMU machine does not support huge page " > + "mappings"); > + return -EINVAL; > + } > + > if (path_psize != 1 * MiB) { > error_report("Memory backing with 2G pages was specified, " > "but KVM does not support this memory backing"); > Yes, this makes sense. Reviewed-by: David Hildenbrand <david@redhat.com>
On Fri, 28 Sep 2018 11:34:35 +0200 Janosch Frank <frankja@linux.ibm.com> wrote: > As the kernel has no way of disallowing the start of a huge page > backed VM, we can migrate a running huge backed VM to a host that has > no huge page KVM support. > > Let's glue huge page support support to the 3.1 machine, so we do not > migrate to a destination host that doesn't have QEMU huge page support > and can stop migration if KVM doesn't indicate support. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > --- > hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ > include/hw/s390x/s390-virtio-ccw.h | 3 +++ > target/s390x/kvm.c | 6 ++++++ > 3 files changed, 19 insertions(+) Thanks, applied.
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index f0f7fdcadd..53fd7c975f 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -456,6 +456,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) s390mc->ri_allowed = true; s390mc->cpu_model_allowed = true; s390mc->css_migration_enabled = true; + s390mc->hpage_1m_allowed = true; mc->init = ccw_init; mc->reset = s390_machine_reset; mc->hot_add_cpu = s390_hot_add_cpu; @@ -535,6 +536,12 @@ bool cpu_model_allowed(void) return get_machine_class()->cpu_model_allowed; } +bool hpage_1m_allowed(void) +{ + /* for "none" machine this results in true */ + return get_machine_class()->hpage_1m_allowed; +} + static char *machine_get_loadparm(Object *obj, Error **errp) { S390CcwMachineState *ms = S390_CCW_MACHINE(obj); @@ -747,6 +754,9 @@ static void ccw_machine_3_0_instance_options(MachineState *machine) static void ccw_machine_3_0_class_options(MachineClass *mc) { + S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc); + + s390mc->hpage_1m_allowed = false; ccw_machine_3_1_class_options(mc); SET_MACHINE_COMPAT(mc, CCW_COMPAT_3_0); } diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h index e9c4f4182b..8aa27199c9 100644 --- a/include/hw/s390x/s390-virtio-ccw.h +++ b/include/hw/s390x/s390-virtio-ccw.h @@ -39,12 +39,15 @@ typedef struct S390CcwMachineClass { bool ri_allowed; bool cpu_model_allowed; bool css_migration_enabled; + bool hpage_1m_allowed; } S390CcwMachineClass; /* runtime-instrumentation allowed by the machine */ bool ri_allowed(void); /* cpu model allowed by the machine */ bool cpu_model_allowed(void); +/* 1M huge page mappings allowed by the machine */ +bool hpage_1m_allowed(void); /** * Returns true if (vmstate based) migration of the channel subsystem diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index 348e8cc546..323cb00e6a 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -292,6 +292,12 @@ static int kvm_s390_configure_mempath_backing(KVMState *s) return 0; } + if (!hpage_1m_allowed()) { + error_report("This QEMU machine does not support huge page " + "mappings"); + return -EINVAL; + } + if (path_psize != 1 * MiB) { error_report("Memory backing with 2G pages was specified, " "but KVM does not support this memory backing");
As the kernel has no way of disallowing the start of a huge page backed VM, we can migrate a running huge backed VM to a host that has no huge page KVM support. Let's glue huge page support support to the 3.1 machine, so we do not migrate to a destination host that doesn't have QEMU huge page support and can stop migration if KVM doesn't indicate support. Signed-off-by: Janosch Frank <frankja@linux.ibm.com> --- hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ include/hw/s390x/s390-virtio-ccw.h | 3 +++ target/s390x/kvm.c | 6 ++++++ 3 files changed, 19 insertions(+)