Commit 2aab4b35 authored by David Matlack's avatar David Matlack Committed by Paolo Bonzini

KVM: selftests: Print a message if /dev/kvm is missing

If a KVM selftest is run on a machine without /dev/kvm, it will exit
silently. Make it easy to tell what's happening by printing an error
message.

Opportunistically consolidate all codepaths that open /dev/kvm into a
single function so they all print the same message.

This slightly changes the semantics of vm_is_unrestricted_guest() by
changing a TEST_ASSERT() to exit(KSFT_SKIP). However
vm_is_unrestricted_guest() is only called in one place
(x86_64/mmio_warning_test.c) and that is to determine if the test should
be skipped or not.
Signed-off-by: default avatarDavid Matlack <dmatlack@google.com>
Message-Id: <20210511202120.1371800-1-dmatlack@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent c887d6a1
...@@ -77,6 +77,7 @@ struct vm_guest_mode_params { ...@@ -77,6 +77,7 @@ struct vm_guest_mode_params {
}; };
extern const struct vm_guest_mode_params vm_guest_mode_params[]; extern const struct vm_guest_mode_params vm_guest_mode_params[];
int open_kvm_dev_path_or_exit(void);
int kvm_check_cap(long cap); int kvm_check_cap(long cap);
int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *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, int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
......
...@@ -31,6 +31,34 @@ static void *align(void *x, size_t size) ...@@ -31,6 +31,34 @@ static void *align(void *x, size_t size)
return (void *) (((size_t) x + mask) & ~mask); return (void *) (((size_t) x + mask) & ~mask);
} }
/*
* Open KVM_DEV_PATH if available, otherwise exit the entire program.
*
* Input Args:
* flags - The flags to pass when opening KVM_DEV_PATH.
*
* Return:
* The opened file descriptor of /dev/kvm.
*/
static int _open_kvm_dev_path_or_exit(int flags)
{
int fd;
fd = open(KVM_DEV_PATH, flags);
if (fd < 0) {
print_skip("%s not available, is KVM loaded? (errno: %d)",
KVM_DEV_PATH, errno);
exit(KSFT_SKIP);
}
return fd;
}
int open_kvm_dev_path_or_exit(void)
{
return _open_kvm_dev_path_or_exit(O_RDONLY);
}
/* /*
* Capability * Capability
* *
...@@ -52,10 +80,7 @@ int kvm_check_cap(long cap) ...@@ -52,10 +80,7 @@ int kvm_check_cap(long cap)
int ret; int ret;
int kvm_fd; int kvm_fd;
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, cap); ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, cap);
TEST_ASSERT(ret != -1, "KVM_CHECK_EXTENSION IOCTL failed,\n" TEST_ASSERT(ret != -1, "KVM_CHECK_EXTENSION IOCTL failed,\n"
" rc: %i errno: %i", ret, errno); " rc: %i errno: %i", ret, errno);
...@@ -128,9 +153,7 @@ void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size) ...@@ -128,9 +153,7 @@ void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size)
static void vm_open(struct kvm_vm *vm, int perm) static void vm_open(struct kvm_vm *vm, int perm)
{ {
vm->kvm_fd = open(KVM_DEV_PATH, perm); vm->kvm_fd = _open_kvm_dev_path_or_exit(perm);
if (vm->kvm_fd < 0)
exit(KSFT_SKIP);
if (!kvm_check_cap(KVM_CAP_IMMEDIATE_EXIT)) { if (!kvm_check_cap(KVM_CAP_IMMEDIATE_EXIT)) {
print_skip("immediate_exit not available"); print_skip("immediate_exit not available");
...@@ -996,9 +1019,7 @@ static int vcpu_mmap_sz(void) ...@@ -996,9 +1019,7 @@ static int vcpu_mmap_sz(void)
{ {
int dev_fd, ret; int dev_fd, ret;
dev_fd = open(KVM_DEV_PATH, O_RDONLY); dev_fd = open_kvm_dev_path_or_exit();
if (dev_fd < 0)
exit(KSFT_SKIP);
ret = ioctl(dev_fd, KVM_GET_VCPU_MMAP_SIZE, NULL); ret = ioctl(dev_fd, KVM_GET_VCPU_MMAP_SIZE, NULL);
TEST_ASSERT(ret >= sizeof(struct kvm_run), TEST_ASSERT(ret >= sizeof(struct kvm_run),
...@@ -2091,10 +2112,7 @@ bool vm_is_unrestricted_guest(struct kvm_vm *vm) ...@@ -2091,10 +2112,7 @@ bool vm_is_unrestricted_guest(struct kvm_vm *vm)
if (vm == NULL) { if (vm == NULL) {
/* Ensure that the KVM vendor-specific module is loaded. */ /* Ensure that the KVM vendor-specific module is loaded. */
f = fopen(KVM_DEV_PATH, "r"); close(open_kvm_dev_path_or_exit());
TEST_ASSERT(f != NULL, "Error in opening KVM dev file: %d",
errno);
fclose(f);
} }
f = fopen("/sys/module/kvm_intel/parameters/unrestricted_guest", "r"); f = fopen("/sys/module/kvm_intel/parameters/unrestricted_guest", "r");
......
...@@ -657,9 +657,7 @@ struct kvm_cpuid2 *kvm_get_supported_cpuid(void) ...@@ -657,9 +657,7 @@ struct kvm_cpuid2 *kvm_get_supported_cpuid(void)
return cpuid; return cpuid;
cpuid = allocate_kvm_cpuid2(); cpuid = allocate_kvm_cpuid2();
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_CPUID, cpuid); ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_CPUID, cpuid);
TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_CPUID failed %d %d\n", TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_CPUID failed %d %d\n",
...@@ -691,9 +689,7 @@ uint64_t kvm_get_feature_msr(uint64_t msr_index) ...@@ -691,9 +689,7 @@ uint64_t kvm_get_feature_msr(uint64_t msr_index)
buffer.header.nmsrs = 1; buffer.header.nmsrs = 1;
buffer.entry.index = msr_index; buffer.entry.index = msr_index;
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
r = ioctl(kvm_fd, KVM_GET_MSRS, &buffer.header); r = ioctl(kvm_fd, KVM_GET_MSRS, &buffer.header);
TEST_ASSERT(r == 1, "KVM_GET_MSRS IOCTL failed,\n" TEST_ASSERT(r == 1, "KVM_GET_MSRS IOCTL failed,\n"
...@@ -986,9 +982,7 @@ struct kvm_msr_list *kvm_get_msr_index_list(void) ...@@ -986,9 +982,7 @@ struct kvm_msr_list *kvm_get_msr_index_list(void)
struct kvm_msr_list *list; struct kvm_msr_list *list;
int nmsrs, r, kvm_fd; int nmsrs, r, kvm_fd;
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
nmsrs = kvm_get_num_msrs_fd(kvm_fd); nmsrs = kvm_get_num_msrs_fd(kvm_fd);
list = malloc(sizeof(*list) + nmsrs * sizeof(list->indices[0])); list = malloc(sizeof(*list) + nmsrs * sizeof(list->indices[0]));
...@@ -1312,9 +1306,7 @@ struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(void) ...@@ -1312,9 +1306,7 @@ struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(void)
return cpuid; return cpuid;
cpuid = allocate_kvm_cpuid2(); cpuid = allocate_kvm_cpuid2();
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_HV_CPUID, cpuid); ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_HV_CPUID, cpuid);
TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_HV_CPUID failed %d %d\n", TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_HV_CPUID failed %d %d\n",
......
...@@ -37,9 +37,7 @@ static void test_get_msr_index(void) ...@@ -37,9 +37,7 @@ static void test_get_msr_index(void)
int old_res, res, kvm_fd, r; int old_res, res, kvm_fd, r;
struct kvm_msr_list *list; struct kvm_msr_list *list;
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
old_res = kvm_num_index_msrs(kvm_fd, 0); old_res = kvm_num_index_msrs(kvm_fd, 0);
TEST_ASSERT(old_res != 0, "Expecting nmsrs to be > 0"); TEST_ASSERT(old_res != 0, "Expecting nmsrs to be > 0");
...@@ -101,9 +99,7 @@ static void test_get_msr_feature(void) ...@@ -101,9 +99,7 @@ static void test_get_msr_feature(void)
int res, old_res, i, kvm_fd; int res, old_res, i, kvm_fd;
struct kvm_msr_list *feature_list; struct kvm_msr_list *feature_list;
kvm_fd = open(KVM_DEV_PATH, O_RDONLY); kvm_fd = open_kvm_dev_path_or_exit();
if (kvm_fd < 0)
exit(KSFT_SKIP);
old_res = kvm_num_feature_msrs(kvm_fd, 0); old_res = kvm_num_feature_msrs(kvm_fd, 0);
TEST_ASSERT(old_res != 0, "Expecting nmsrs to be > 0"); TEST_ASSERT(old_res != 0, "Expecting nmsrs to be > 0");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment