]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: selftests: Avoid testing the IMPDEF behavior
authorZenghui Yu (Huawei) <zenghui.yu@linux.dev>
Tue, 17 Mar 2026 13:15:58 +0000 (21:15 +0800)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Apr 2026 16:29:21 +0000 (17:29 +0100)
It turned out that we can't really force KVM to use the "slow" path when
emulating AT instructions [1]. We should therefore avoid testing the IMPDEF
behavior (i.e., TEST_ACCESS_FLAG - address translation instructions are
permitted to update AF but not required).

Remove it and improve the comment a bit.

[1] https://lore.kernel.org/r/b951dcfb-0ad1-4d7b-b6ce-d54b272dd9be@linux.dev

Signed-off-by: Zenghui Yu (Huawei) <zenghui.yu@linux.dev>
Link: https://patch.msgid.link/20260317131558.52751-1-zenghui.yu@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
tools/testing/selftests/kvm/arm64/at.c

index c8ee6f520734db2458c765057a4fb4d8426a7b50..ce5d312ef6baae997dde1e2d5d0e492e9d069e67 100644 (file)
@@ -13,7 +13,6 @@
 
 enum {
        CLEAR_ACCESS_FLAG,
-       TEST_ACCESS_FLAG,
 };
 
 static u64 *ptep_hva;
@@ -49,7 +48,6 @@ do {                                                                                  \
                GUEST_ASSERT_EQ(FIELD_GET(SYS_PAR_EL1_ATTR, par), MAIR_ATTR_NORMAL);    \
                GUEST_ASSERT_EQ(FIELD_GET(SYS_PAR_EL1_SH, par), PTE_SHARED >> 8);       \
                GUEST_ASSERT_EQ(par & SYS_PAR_EL1_PA, TEST_ADDR);                       \
-               GUEST_SYNC(TEST_ACCESS_FLAG);                                           \
        }                                                                               \
 } while (0)
 
@@ -85,10 +83,6 @@ static void guest_code(void)
        if (!SYS_FIELD_GET(ID_AA64MMFR1_EL1, HAFDBS, read_sysreg(id_aa64mmfr1_el1)))
                GUEST_DONE();
 
-       /*
-        * KVM's software PTW makes the implementation choice that the AT
-        * instruction sets the access flag.
-        */
        sysreg_clear_set(tcr_el1, 0, TCR_HA);
        isb();
        test_at(false);
@@ -102,8 +96,8 @@ static void handle_sync(struct kvm_vcpu *vcpu, struct ucall *uc)
        case CLEAR_ACCESS_FLAG:
                /*
                 * Delete + reinstall the memslot to invalidate stage-2
-                * mappings of the stage-1 page tables, forcing KVM to
-                * use the 'slow' AT emulation path.
+                * mappings of the stage-1 page tables, allowing KVM to
+                * potentially use the 'slow' AT emulation path.
                 *
                 * This and clearing the access flag from host userspace
                 * ensures that the access flag cannot be set speculatively
@@ -112,10 +106,6 @@ static void handle_sync(struct kvm_vcpu *vcpu, struct ucall *uc)
                clear_bit(__ffs(PTE_AF), ptep_hva);
                vm_mem_region_reload(vcpu->vm, vcpu->vm->memslots[MEM_REGION_PT]);
                break;
-       case TEST_ACCESS_FLAG:
-               TEST_ASSERT(test_bit(__ffs(PTE_AF), ptep_hva),
-                           "Expected access flag to be set (desc: %lu)", *ptep_hva);
-               break;
        default:
                TEST_FAIL("Unexpected SYNC arg: %lu", uc->args[1]);
        }