Commit 254957fa authored by Zeng Guang's avatar Zeng Guang Committed by Jason Zeng
Browse files

kvm: selftests: Add KVM_CAP_MAX_VCPU_ID cap test

mainline inclusion
from mainline-v6.0-rc1
commit 753dcf7a
category: feature
feature: IPI Virtualization
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/I5ODSC
CVE: N/A
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=753dcf7a8686a750fa6aa4b4ca42c6945fc75ac1



Intel-SIG: commit 753dcf7a ("kvm: selftests: Add KVM_CAP_MAX_VCPU_ID cap test")

-------------------------------------

kvm: selftests: Add KVM_CAP_MAX_VCPU_ID cap test

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: default avatarZeng Guang <guang.zeng@intel.com>
Message-Id: <20220422134456.26655-1-guang.zeng@intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarJason Zeng <jason.zeng@intel.com>
parent 59461b8c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
/x86_64/evmcs_test
/x86_64/kvm_pv_test
/x86_64/hyperv_cpuid
/x86_64/max_vcpuid_cap_test
/x86_64/mmio_warning_test
/x86_64/platform_info_test
/x86_64/set_sregs_test
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
TEST_GEN_PROGS_x86_64 += x86_64/debug_regs
TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test
TEST_GEN_PROGS_x86_64 += x86_64/user_msr_test
TEST_GEN_PROGS_x86_64 += x86_64/max_vcpuid_cap_test
TEST_GEN_PROGS_x86_64 += demand_paging_test
TEST_GEN_PROGS_x86_64 += dirty_log_test
TEST_GEN_PROGS_x86_64 += dirty_log_perf_test
+1 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ enum vm_mem_backing_src_type {
};

int kvm_check_cap(long cap);
int vm_check_cap(struct kvm_vm *vm, long cap);
int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap);
int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
		    struct kvm_enable_cap *cap);
+27 −0
Original line number Diff line number Diff line
@@ -63,6 +63,33 @@ int kvm_check_cap(long cap)
	return ret;
}

/* VM Check Capability
 *
 * Input Args:
 * vm - Virtual Machine
 * cap - Capability
 *
 * Output Args: None
 *
 * Return:
 * On success, the Value corresponding to the capability (KVM_CAP_*)
 * specified by the value of cap. On failure a TEST_ASSERT failure
 * is produced.
 *
 * Looks up and returns the value corresponding to the capability
 * (KVM_CAP_*) given by cap.
 */
int vm_check_cap(struct kvm_vm *vm, long cap)
{
	int ret;

	ret = ioctl(vm->fd, KVM_CHECK_EXTENSION, cap);
	TEST_ASSERT(ret >= 0, "KVM_CHECK_EXTENSION VM IOCTL failed,\n"
		    " rc: %i errno: %i", ret, errno);

	return ret;
}

/* VM Enable Capability
 *
 * Input Args:
+54 −0
Original line number Diff line number Diff line
// 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;
}