kvm: selftests: Add KVM_CAP_MAX_VCPU_ID cap test
authorZeng Guang <guang.zeng@intel.com>
Fri, 22 Apr 2022 13:44:56 +0000 (21:44 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 8 Jun 2022 08:47:34 +0000 (04:47 -0400)
Basic test coverage of KVM_CAP_MAX_VCPU_ID cap.

This capability can be enabled before vCPU creation and only allowed
to set once. if assigned vcpu id is beyond KVM_CAP_MAX_VCPU_ID
capability, vCPU creation will fail.

Signed-off-by: Zeng Guang <guang.zeng@intel.com>
Message-Id: <20220422134456.26655-1-guang.zeng@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/.gitignore
tools/testing/selftests/kvm/Makefile
tools/testing/selftests/kvm/x86_64/max_vcpuid_cap_test.c [new file with mode: 0644]

index 82e764d..90a6dea 100644 (file)
@@ -25,6 +25,7 @@
 /x86_64/hyperv_cpuid
 /x86_64/hyperv_features
 /x86_64/hyperv_svm_test
+/x86_64/max_vcpuid_cap_test
 /x86_64/mmio_warning_test
 /x86_64/mmu_role_test
 /x86_64/platform_info_test
index f2647b8..a014368 100644 (file)
@@ -89,6 +89,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/xen_shinfo_test
 TEST_GEN_PROGS_x86_64 += x86_64/xen_vmcall_test
 TEST_GEN_PROGS_x86_64 += x86_64/sev_migrate_tests
 TEST_GEN_PROGS_x86_64 += x86_64/amx_test
+TEST_GEN_PROGS_x86_64 += x86_64/max_vcpuid_cap_test
 TEST_GEN_PROGS_x86_64 += access_tracking_perf_test
 TEST_GEN_PROGS_x86_64 += demand_paging_test
 TEST_GEN_PROGS_x86_64 += dirty_log_test
diff --git a/tools/testing/selftests/kvm/x86_64/max_vcpuid_cap_test.c b/tools/testing/selftests/kvm/x86_64/max_vcpuid_cap_test.c
new file mode 100644 (file)
index 0000000..3f6c1ad
--- /dev/null
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * maximum APIC ID capability tests
+ *
+ * Copyright (C) 2022, Intel, Inc.
+ *
+ * Tests for getting/setting maximum APIC ID capability
+ */
+
+#include "kvm_util.h"
+#include "../lib/kvm_util_internal.h"
+
+#define MAX_VCPU_ID    2
+
+int main(int argc, char *argv[])
+{
+       struct kvm_vm *vm;
+       struct kvm_enable_cap cap = { 0 };
+       int ret;
+
+       vm = vm_create(VM_MODE_DEFAULT, 0, O_RDWR);
+
+       /* Get KVM_CAP_MAX_VCPU_ID cap supported in KVM */
+       ret = vm_check_cap(vm, KVM_CAP_MAX_VCPU_ID);
+
+       /* Try to set KVM_CAP_MAX_VCPU_ID beyond KVM cap */
+       cap.cap = KVM_CAP_MAX_VCPU_ID;
+       cap.args[0] = ret + 1;
+       ret = ioctl(vm->fd, KVM_ENABLE_CAP, &cap);
+       TEST_ASSERT(ret < 0,
+                   "Unexpected success to enable KVM_CAP_MAX_VCPU_ID"
+                   "beyond KVM cap!\n");
+
+       /* Set KVM_CAP_MAX_VCPU_ID */
+       cap.cap = KVM_CAP_MAX_VCPU_ID;
+       cap.args[0] = MAX_VCPU_ID;
+       ret = ioctl(vm->fd, KVM_ENABLE_CAP, &cap);
+       TEST_ASSERT(ret == 0,
+                   "Unexpected failure to enable KVM_CAP_MAX_VCPU_ID!\n");
+
+       /* Try to set KVM_CAP_MAX_VCPU_ID again */
+       cap.args[0] = MAX_VCPU_ID + 1;
+       ret = ioctl(vm->fd, KVM_ENABLE_CAP, &cap);
+       TEST_ASSERT(ret < 0,
+                   "Unexpected success to enable KVM_CAP_MAX_VCPU_ID again\n");
+
+       /* Create vCPU with id beyond KVM_CAP_MAX_VCPU_ID cap*/
+       ret = ioctl(vm->fd, KVM_CREATE_VCPU, MAX_VCPU_ID);
+       TEST_ASSERT(ret < 0,
+                   "Unexpected success in creating a vCPU with VCPU ID out of range\n");
+
+       kvm_vm_free(vm);
+       return 0;
+}