@samitouri / QOSamiQemu / commits / 6126cbe2e5

target/s390x: Allow 2G hugepages guest backing

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> Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com> Link: https://lore.kernel.org/qemu-devel/20260805103728.97602-2-imbrenda@linux.ibm.com Signed-off-by: Eric Farman <farman@linux.ibm.com>

Claudio Imbrenda committed Aug 5, 2026 at 12:37 UTC 6126cbe2e59d7a9df1128f6072e3480267451187
4 files changed +20 -22
target/s390x/diag.c
+1 -1
@@ -185,7 +185,7 @@ out:
185 return false;
186 }
187
188 - if (kvm_enabled() && kvm_s390_get_hpage_1m()) {
188 + if (kvm_enabled() && kvm_s390_get_hpage()) {
189 error_report("Protected VMs can currently not be backed with "
190 "huge pages");
191 env->regs[r1 + 1] = DIAG_308_RC_INVAL_FOR_PV;
target/s390x/kvm/kvm.c
+17 -19
@@ -145,7 +145,7 @@ static int cap_mem_op;
145 static int cap_mem_op_extension;
146 static int cap_s390_irq;
147 static int cap_ri;
148 -static int cap_hpage_1m;
148 +static int cap_hpage;
149 static int cap_vcpu_resets;
150 static int cap_protected;
151 static int cap_zpci_op;
@@ -231,7 +231,7 @@ static void kvm_s390_enable_cmma(void)
231 .attr = KVM_S390_VM_MEM_ENABLE_CMMA,
232 };
233
234 - if (cap_hpage_1m) {
234 + if (cap_hpage) {
235 warn_report("CMM will not be enabled because it is not "
236 "compatible with huge memory backings.");
237 return;
@@ -292,30 +292,28 @@ void kvm_s390_crypto_reset(void)
292 }
293 }
294
295 -void kvm_s390_set_max_pagesize(uint64_t pagesize, Error **errp)
295 +static bool kvm_s390_pgsize_cap(uint32_t capa, const char *s, Error **errp)
296 {
297 - if (pagesize == 4 * KiB) {
298 - return;
299 - }
300 -
301 - if (pagesize != 1 * MiB) {
302 - error_setg(errp, "Memory backing with 2G pages was specified, "
303 - "but KVM does not support this memory backing");
304 - return;
297 + if (kvm_vm_enable_cap(kvm_state, capa, 0)) {
298 + error_setg(errp, "Memory backing with %s pages was specified, "
299 + "but KVM does not support this memory backing", s);
300 + return false;
301 }
302 + return true;
303 +}
304
307 - if (kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_HPAGE_1M, 0)) {
308 - error_setg(errp, "Memory backing with 1M pages was specified, "
309 - "but KVM does not support this memory backing");
310 - return;
305 +void kvm_s390_set_max_pagesize(uint64_t pagesize, Error **errp)
306 +{
307 + if (pagesize == MiB) {
308 + cap_hpage = kvm_s390_pgsize_cap(KVM_CAP_S390_HPAGE_1M, "1M", errp);
309 + } else if (pagesize != 4 * KiB) {
310 + cap_hpage = 2 * kvm_s390_pgsize_cap(KVM_CAP_S390_HPAGE_2G, "2G", errp);
311 }
312 -
313 - cap_hpage_1m = 1;
312 }
313
316 -int kvm_s390_get_hpage_1m(void)
314 +int kvm_s390_get_hpage(void)
315 {
318 - return cap_hpage_1m;
316 + return cap_hpage;
317 }
318
319 static void ccw_machine_class_foreach(ObjectClass *oc, void *opaque)
target/s390x/kvm/kvm_s390x.h
+1 -1
@@ -25,7 +25,7 @@ void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code);
25 int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
26 void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
27 int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
28 -int kvm_s390_get_hpage_1m(void);
28 +int kvm_s390_get_hpage(void);
29 int kvm_s390_get_protected_dump(void);
30 int kvm_s390_get_ri(void);
31 int kvm_s390_get_zpci_op(void);
target/s390x/kvm/stubs.c
+1 -1
@@ -143,7 +143,7 @@ int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
143 g_assert_not_reached();
144 }
145
146 -int kvm_s390_get_hpage_1m(void)
146 +int kvm_s390_get_hpage(void)
147 {
148 g_assert_not_reached();
149 }