* [PATCH v3 1/1] target/s390x: Allow 2G hugepages guest backing
2026-08-05 10:37 [PATCH v3 0/1] target/s390x: Allow 2G hugepages guest backing Claudio Imbrenda
@ 2026-08-05 10:37 ` Claudio Imbrenda
2026-08-05 17:17 ` Matthew Rosato
2026-08-10 18:39 ` [PATCH v3 0/1] " Eric Farman
1 sibling, 1 reply; 4+ messages in thread
From: Claudio Imbrenda @ 2026-08-05 10:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, borntraeger, frankja, pasic, mhartmay, david, farman,
mjrosato, richard.henderson, iii, cohuck
Allow mapping guest with 2G hugepages on hosts that support it.
Rename kvm_s390_get_hpage_1m() to kvm_s390_get_hpage() to reflect that
it is not anymore limited only to 1m hpages.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
---
target/s390x/diag.c | 2 +-
target/s390x/kvm/kvm.c | 36 +++++++++++++++++-------------------
target/s390x/kvm/kvm_s390x.h | 2 +-
target/s390x/kvm/stubs.c | 2 +-
4 files changed, 20 insertions(+), 22 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..803b878b4f 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;
@@ -292,30 +292,28 @@ void kvm_s390_crypto_reset(void)
}
}
-void kvm_s390_set_max_pagesize(uint64_t pagesize, Error **errp)
+static bool kvm_s390_pgsize_cap(uint32_t capa, const char *s, Error **errp)
{
- if (pagesize == 4 * KiB) {
- 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, capa, 0)) {
+ error_setg(errp, "Memory backing with %s pages was specified, "
+ "but KVM does not support this memory backing", s);
+ return false;
}
+ return true;
+}
- 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;
+void kvm_s390_set_max_pagesize(uint64_t pagesize, Error **errp)
+{
+ if (pagesize == MiB) {
+ cap_hpage = kvm_s390_pgsize_cap(KVM_CAP_S390_HPAGE_1M, "1M", errp);
+ } else if (pagesize != 4 * KiB) {
+ cap_hpage = 2 * kvm_s390_pgsize_cap(KVM_CAP_S390_HPAGE_2G, "2G", errp);
}
-
- cap_hpage_1m = 1;
}
-int kvm_s390_get_hpage_1m(void)
+int kvm_s390_get_hpage(void)
{
- return cap_hpage_1m;
+ return cap_hpage;
}
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..3c4fa0489c 100644
--- a/target/s390x/kvm/kvm_s390x.h
+++ b/target/s390x/kvm/kvm_s390x.h
@@ -25,7 +25,7 @@ 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_1m(void);
+int kvm_s390_get_hpage(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..ebf3c83994 100644
--- a/target/s390x/kvm/stubs.c
+++ b/target/s390x/kvm/stubs.c
@@ -143,7 +143,7 @@ int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
g_assert_not_reached();
}
-int kvm_s390_get_hpage_1m(void)
+int kvm_s390_get_hpage(void)
{
g_assert_not_reached();
}
--
2.55.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v3 0/1] target/s390x: Allow 2G hugepages guest backing
2026-08-05 10:37 [PATCH v3 0/1] target/s390x: Allow 2G hugepages guest backing Claudio Imbrenda
2026-08-05 10:37 ` [PATCH v3 1/1] " Claudio Imbrenda
@ 2026-08-10 18:39 ` Eric Farman
1 sibling, 0 replies; 4+ messages in thread
From: Eric Farman @ 2026-08-10 18:39 UTC (permalink / raw)
To: Claudio Imbrenda, qemu-devel
Cc: qemu-s390x, borntraeger, frankja, pasic, mhartmay, david,
mjrosato, richard.henderson, iii, cohuck
On 8/5/26 6:37 AM, Claudio Imbrenda wrote:
> 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.
>
> v2->v3:
> * Remove dead code introduced in the previous version.
> * Factor out the capability enablement and error reporting to avoid
> duplicating code and error messages.
> * Optimize the control flow and bring it back in line with the previous
> behaviour regarding page sizes, i.e. assuming that if the page size
> is neither 4K nor 1M, then it must be 2G.
>
> v1->v2:
> * Rename the global variable to cap_hpage
> * Use different values of cap_hpage to distinguish between hpage sizes
> * Add wrappers to test for specific hpage sizes
>
> Claudio Imbrenda (1):
> target/s390x: Allow 2G hugepages guest backing
Thanks! Applied for 11.2
>
> target/s390x/diag.c | 2 +-
> target/s390x/kvm/kvm.c | 36 +++++++++++++++++-------------------
> target/s390x/kvm/kvm_s390x.h | 2 +-
> target/s390x/kvm/stubs.c | 2 +-
> 4 files changed, 20 insertions(+), 22 deletions(-)
>
^ permalink raw reply [flat|nested] 4+ messages in thread