@samitouri / QOSamiQemu / commits / eec9d7203e

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;