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
