s390x: Fence huge pages prior to 3.1
diff mbox series

Message ID 20180928093435.198573-1-frankja@linux.ibm.com
State New
Headers show
Series
  • s390x: Fence huge pages prior to 3.1
Related show

Commit Message

Janosch Frank Sept. 28, 2018, 9:34 a.m. UTC
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(+)

Comments

Cornelia Huck Sept. 28, 2018, 9:53 a.m. UTC | #1
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.
David Hildenbrand Sept. 28, 2018, 11:16 a.m. UTC | #2
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>
Cornelia Huck Oct. 1, 2018, 12:58 p.m. UTC | #3
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.

Patch
diff mbox series

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");