target/s390x/kvm: Simplify the async pfault handling code
Since commit 126e7f78036 ("kvm: require KVM_CAP_IOEVENTFD and KVM_CAP_IOEVENTFD_ANY_LENGTH") we require at least kernel v4.4 to be able to use KVM. KVM_CAP_ASYNC_PF is available in the kernel since v3.15 and KVM_SYNC_PFAULT is available since kernel v3.18, so we can assume now that they are available in all supported kernels. Thus simplify the code a little bit by removing the checks for these features. Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Eric Farman <farman@linux.ibm.com> Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com> Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com> Message-ID: <20260317134531.460141-1-thuth@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Thomas Huth committed
Mar 17, 2026 at 14:45 UTC
eec9d7203eca27ebc48d95d6331c1a250e961366
1 file changed
+11
-41
target/s390x/kvm/kvm.c
+11
-41
@@ -140,7 +140,6 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
140
KVM_CAP_LAST_INFO
141
};
142
143
-static int cap_async_pf;
143
static int cap_mem_op;
144
static int cap_mem_op_extension;
145
static int cap_s390_irq;
@@ -333,6 +332,7 @@ int kvm_arch_get_default_type(MachineState *ms)
332
int kvm_arch_init(MachineState *ms, KVMState *s)
333
{
334
int required_caps[] = {
335
+ KVM_CAP_ASYNC_PF,
336
KVM_CAP_DEVICE_CTRL,
337
KVM_CAP_SYNC_REGS,
338
};
@@ -340,7 +340,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
340
for (int i = 0; i < ARRAY_SIZE(required_caps); i++) {
341
if (!kvm_check_extension(s, required_caps[i])) {
342
error_report("KVM is missing capability #%d - "
343
- "please use kernel 3.15 or newer", required_caps[i]);
343
+ "please use kernel 4.4 or newer", required_caps[i]);
344
return -1;
345
}
346
}
@@ -354,7 +354,6 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
354
return -1;
355
}
356
357
- cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF);
357
cap_mem_op = kvm_check_extension(s, KVM_CAP_S390_MEM_OP);
358
cap_mem_op_extension = kvm_check_extension(s, KVM_CAP_S390_MEM_OP_EXTENSION);
359
mem_op_storage_key_support = cap_mem_op_extension > 0;
@@ -466,7 +465,8 @@ static int can_sync_regs(CPUState *cs, int regs)
465
}
466
467
#define KVM_SYNC_REQUIRED_REGS (KVM_SYNC_GPRS | KVM_SYNC_ACRS | \
469
- KVM_SYNC_CRS | KVM_SYNC_PREFIX)
468
+ KVM_SYNC_CRS | KVM_SYNC_PREFIX | \
469
+ KVM_SYNC_PFAULT)
470
471
int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
472
{
@@ -550,25 +550,10 @@ int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
550
}
551
552
/* pfault parameters */
553
- if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
554
- cs->kvm_run->s.regs.pft = env->pfault_token;
555
- cs->kvm_run->s.regs.pfs = env->pfault_select;
556
- cs->kvm_run->s.regs.pfc = env->pfault_compare;
557
- cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PFAULT;
558
- } else if (cap_async_pf) {
559
- r = kvm_set_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
560
- if (r < 0) {
561
- return r;
562
- }
563
- r = kvm_set_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
564
- if (r < 0) {
565
- return r;
566
- }
567
- r = kvm_set_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
568
- if (r < 0) {
569
- return r;
570
- }
571
- }
553
+ cs->kvm_run->s.regs.pft = env->pfault_token;
554
+ cs->kvm_run->s.regs.pfs = env->pfault_select;
555
+ cs->kvm_run->s.regs.pfc = env->pfault_compare;
556
+ cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PFAULT;
557
558
if (can_sync_regs(cs, KVM_SYNC_GSCB)) {
559
memcpy(cs->kvm_run->s.regs.gscb, env->gscb, 32);
@@ -673,24 +658,9 @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
658
}
659
660
/* pfault parameters */
676
- if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
677
- env->pfault_token = cs->kvm_run->s.regs.pft;
678
- env->pfault_select = cs->kvm_run->s.regs.pfs;
679
- env->pfault_compare = cs->kvm_run->s.regs.pfc;
680
- } else if (cap_async_pf) {
681
- r = kvm_get_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
682
- if (r < 0) {
683
- return r;
684
- }
685
- r = kvm_get_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
686
- if (r < 0) {
687
- return r;
688
- }
689
- r = kvm_get_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
690
- if (r < 0) {
691
- return r;
692
- }
693
- }
661
+ env->pfault_token = cs->kvm_run->s.regs.pft;
662
+ env->pfault_select = cs->kvm_run->s.regs.pfs;
663
+ env->pfault_compare = cs->kvm_run->s.regs.pfc;
664
665
if (can_sync_regs(cs, KVM_SYNC_DIAG318)) {
666
env->diag318_info = cs->kvm_run->s.regs.diag318;