Allow mapping guest with 2G hugepages on hosts that support it.

Add new helper functions to check whether hpages are in effect, and
which size.

Signed-off-by: Claudio Imbrenda <[email protected]>
Reviewed-by: Eric Farman <[email protected]>
Reviewed-by: Hendrik Brueckner <[email protected]>
---
 target/s390x/diag.c          |  2 +-
 target/s390x/kvm/kvm.c       | 40 +++++++++++++++++++++++-------------
 target/s390x/kvm/kvm_s390x.h |  2 ++
 target/s390x/kvm/stubs.c     | 10 +++++++++
 4 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/target/s390x/diag.c b/target/s390x/diag.c
index 80f0958478..46d191b87d 100644
--- a/target/s390x/diag.c
+++ b/target/s390x/diag.c
@@ -185,7 +185,7 @@ out:
             return false;
         }
 
-        if (kvm_enabled() && kvm_s390_get_hpage_1m()) {
+        if (kvm_enabled() && kvm_s390_get_hpage()) {
             error_report("Protected VMs can currently not be backed with "
                          "huge pages");
             env->regs[r1 + 1] = DIAG_308_RC_INVAL_FOR_PV;
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index 72031a5714..0d04e940ef 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -145,7 +145,7 @@ static int cap_mem_op;
 static int cap_mem_op_extension;
 static int cap_s390_irq;
 static int cap_ri;
-static int cap_hpage_1m;
+static int cap_hpage;
 static int cap_vcpu_resets;
 static int cap_protected;
 static int cap_zpci_op;
@@ -231,7 +231,7 @@ static void kvm_s390_enable_cmma(void)
         .attr = KVM_S390_VM_MEM_ENABLE_CMMA,
     };
 
-    if (cap_hpage_1m) {
+    if (cap_hpage) {
         warn_report("CMM will not be enabled because it is not "
                     "compatible with huge memory backings.");
         return;
@@ -298,24 +298,36 @@ void kvm_s390_set_max_pagesize(uint64_t pagesize, Error 
**errp)
         return;
     }
 
-    if (pagesize != 1 * MiB) {
-        error_setg(errp, "Memory backing with 2G pages was specified, "
-                   "but KVM does not support this memory backing");
-        return;
-    }
-
-    if (kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_HPAGE_1M, 0)) {
-        error_setg(errp, "Memory backing with 1M pages was specified, "
-                   "but KVM does not support this memory backing");
-        return;
+    if (pagesize == 2 * GiB) {
+        if (kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_HPAGE_2G, 0)) {
+            error_setg(errp, "Memory backing with 2G pages was specified, "
+                       "but KVM does not support this memory backing");
+            return;
+        }
+        cap_hpage = 2;
+    } else if (pagesize == MiB) {
+        if (kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_HPAGE_1M, 0)) {
+            error_setg(errp, "Memory backing with 1M pages was specified, "
+                       "but KVM does not support this memory backing");
+            return;
+        }
+        cap_hpage = 1;
     }
+}
 
-    cap_hpage_1m = 1;
+int kvm_s390_get_hpage(void)
+{
+    return cap_hpage;
 }
 
 int kvm_s390_get_hpage_1m(void)
 {
-    return cap_hpage_1m;
+    return cap_hpage == 1;
+}
+
+int kvm_s390_get_hpage_2g(void)
+{
+    return cap_hpage == 2;
 }
 
 static void ccw_machine_class_foreach(ObjectClass *oc, void *opaque)
diff --git a/target/s390x/kvm/kvm_s390x.h b/target/s390x/kvm/kvm_s390x.h
index 7b1cce3e60..ccc615abed 100644
--- a/target/s390x/kvm/kvm_s390x.h
+++ b/target/s390x/kvm/kvm_s390x.h
@@ -25,7 +25,9 @@ void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code);
 int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
 void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
 int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
+int kvm_s390_get_hpage(void);
 int kvm_s390_get_hpage_1m(void);
+int kvm_s390_get_hpage_2g(void);
 int kvm_s390_get_protected_dump(void);
 int kvm_s390_get_ri(void);
 int kvm_s390_get_zpci_op(void);
diff --git a/target/s390x/kvm/stubs.c b/target/s390x/kvm/stubs.c
index 196127baa5..06e865f806 100644
--- a/target/s390x/kvm/stubs.c
+++ b/target/s390x/kvm/stubs.c
@@ -143,11 +143,21 @@ int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
     g_assert_not_reached();
 }
 
+int kvm_s390_get_hpage(void)
+{
+    g_assert_not_reached();
+}
+
 int kvm_s390_get_hpage_1m(void)
 {
     g_assert_not_reached();
 }
 
+int kvm_s390_get_hpage_2g(void)
+{
+    g_assert_not_reached();
+}
+
 void kvm_s390_enable_css_support(S390CPU *cpu)
 {
     g_assert_not_reached();
-- 
2.55.0


Reply via email to