The test at hand queried whether the kernel supports CMMA, but in addition machine support is required. Add a check whether the machine supports CMMA. This fixes the test under G3 (z/VM, KVM). Signed-off-by: Nico Boehr <nrb@xxxxxxxxxxxxx> --- tools/testing/selftests/kvm/s390x/cmma_test.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tools/testing/selftests/kvm/s390x/cmma_test.c b/tools/testing/selftests/kvm/s390x/cmma_test.c index 6d0751ea224b..1d73e78e8fa7 100644 --- a/tools/testing/selftests/kvm/s390x/cmma_test.c +++ b/tools/testing/selftests/kvm/s390x/cmma_test.c @@ -660,12 +660,32 @@ struct testdef { { "GET_CMMA_BITS: holes are skipped", test_get_skip_holes }, }; +/** + * The kernel may support CMMA, but the machine may not (i.e. if running as + * guest-3). + * + * In this case, the CMMA capabilities are all there, but the CMMA-related + * ioctls fail. To find out whether the machine supports CMMA, create a + * temporary VM and then query the CMMA feature of the VM. + */ +static int machine_has_cmma(void) +{ + struct kvm_vm *vm = create_vm(); + int r; + + r = !__kvm_has_device_attr(vm->fd, KVM_S390_VM_MEM_CTRL, KVM_S390_VM_MEM_ENABLE_CMMA); + kvm_vm_free(vm); + + return r; +} + int main(int argc, char *argv[]) { int idx; TEST_REQUIRE(kvm_has_cap(KVM_CAP_SYNC_REGS)); TEST_REQUIRE(kvm_has_cap(KVM_CAP_S390_CMMA_MIGRATION)); + TEST_REQUIRE(machine_has_cmma()); ksft_print_header(); -- 2.39.1