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
}