Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: exit with 0 status code when tests cannot be run

Right now, skipped tests are returning a failure exit code if /dev/kvm does
not exists. Consistently return a zero status code so that various scripts
over the interwebs do not complain. Also return a zero status code if
the KVM_CAP_SYNC_REGS capability is not present, and hardcode in the
test the register kinds that are covered (rather than just using whatever
value of KVM_SYNC_X86_VALID_FIELDS is provided by the kernel headers).

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

+43 -20
+1 -1
tools/testing/selftests/kvm/Makefile
··· 15 15 16 16 INSTALL_HDR_PATH = $(top_srcdir)/usr 17 17 LINUX_HDR_PATH = $(INSTALL_HDR_PATH)/include/ 18 - CFLAGS += -O2 -g -std=gnu99 -I$(LINUX_HDR_PATH) -Iinclude -I$(<D) 18 + CFLAGS += -O2 -g -std=gnu99 -I$(LINUX_HDR_PATH) -Iinclude -I$(<D) -I.. 19 19 20 20 # After inclusion, $(OUTPUT) is defined and 21 21 # $(TEST_GEN_PROGS) starts with $(OUTPUT)/
+1
tools/testing/selftests/kvm/include/test_util.h
··· 19 19 #include <errno.h> 20 20 #include <unistd.h> 21 21 #include <fcntl.h> 22 + #include "kselftest.h" 22 23 23 24 ssize_t test_write(int fd, const void *buf, size_t count); 24 25 ssize_t test_read(int fd, void *buf, size_t count);
+8 -8
tools/testing/selftests/kvm/lib/kvm_util.c
··· 50 50 int kvm_fd; 51 51 52 52 kvm_fd = open(KVM_DEV_PATH, O_RDONLY); 53 - TEST_ASSERT(kvm_fd >= 0, "open %s failed, rc: %i errno: %i", 54 - KVM_DEV_PATH, kvm_fd, errno); 53 + if (kvm_fd < 0) 54 + exit(KSFT_SKIP); 55 55 56 56 ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, cap); 57 57 TEST_ASSERT(ret != -1, "KVM_CHECK_EXTENSION IOCTL failed,\n" ··· 91 91 92 92 vm->mode = mode; 93 93 kvm_fd = open(KVM_DEV_PATH, perm); 94 - TEST_ASSERT(kvm_fd >= 0, "open %s failed, rc: %i errno: %i", 95 - KVM_DEV_PATH, kvm_fd, errno); 94 + if (kvm_fd < 0) 95 + exit(KSFT_SKIP); 96 96 97 97 /* Create VM. */ 98 98 vm->fd = ioctl(kvm_fd, KVM_CREATE_VM, NULL); ··· 418 418 419 419 cpuid = allocate_kvm_cpuid2(); 420 420 kvm_fd = open(KVM_DEV_PATH, O_RDONLY); 421 - TEST_ASSERT(kvm_fd >= 0, "open %s failed, rc: %i errno: %i", 422 - KVM_DEV_PATH, kvm_fd, errno); 421 + if (kvm_fd < 0) 422 + exit(KSFT_SKIP); 423 423 424 424 ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_CPUID, cpuid); 425 425 TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_CPUID failed %d %d\n", ··· 675 675 int dev_fd, ret; 676 676 677 677 dev_fd = open(KVM_DEV_PATH, O_RDONLY); 678 - TEST_ASSERT(dev_fd >= 0, "%s open %s failed, rc: %i errno: %i", 679 - __func__, KVM_DEV_PATH, dev_fd, errno); 678 + if (dev_fd < 0) 679 + exit(KSFT_SKIP); 680 680 681 681 ret = ioctl(dev_fd, KVM_GET_VCPU_MMAP_SIZE, NULL); 682 682 TEST_ASSERT(ret >= sizeof(struct kvm_run),
+31 -9
tools/testing/selftests/kvm/sync_regs_test.c
··· 85 85 { 86 86 } 87 87 88 + #define TEST_SYNC_FIELDS (KVM_SYNC_X86_REGS|KVM_SYNC_X86_SREGS|KVM_SYNC_X86_EVENTS) 89 + #define INVALID_SYNC_FIELD 0x80000000 90 + 88 91 int main(int argc, char *argv[]) 89 92 { 90 93 struct kvm_vm *vm; ··· 101 98 setbuf(stdout, NULL); 102 99 103 100 cap = kvm_check_cap(KVM_CAP_SYNC_REGS); 104 - TEST_ASSERT((unsigned long)cap == KVM_SYNC_X86_VALID_FIELDS, 105 - "KVM_CAP_SYNC_REGS (0x%x) != KVM_SYNC_X86_VALID_FIELDS (0x%lx)\n", 106 - cap, KVM_SYNC_X86_VALID_FIELDS); 101 + if ((cap & TEST_SYNC_FIELDS) != TEST_SYNC_FIELDS) { 102 + fprintf(stderr, "KVM_CAP_SYNC_REGS not supported, skipping test\n"); 103 + exit(KSFT_SKIP); 104 + } 105 + if ((cap & INVALID_SYNC_FIELD) != 0) { 106 + fprintf(stderr, "The \"invalid\" field is not invalid, skipping test\n"); 107 + exit(KSFT_SKIP); 108 + } 107 109 108 110 /* Create VM */ 109 111 vm = vm_create_default(VCPU_ID, guest_code); ··· 116 108 run = vcpu_state(vm, VCPU_ID); 117 109 118 110 /* Request reading invalid register set from VCPU. */ 119 - run->kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS << 1; 111 + run->kvm_valid_regs = INVALID_SYNC_FIELD; 112 + rv = _vcpu_run(vm, VCPU_ID); 113 + TEST_ASSERT(rv < 0 && errno == EINVAL, 114 + "Invalid kvm_valid_regs did not cause expected KVM_RUN error: %d\n", 115 + rv); 116 + vcpu_state(vm, VCPU_ID)->kvm_valid_regs = 0; 117 + 118 + run->kvm_valid_regs = INVALID_SYNC_FIELD | TEST_SYNC_FIELDS; 120 119 rv = _vcpu_run(vm, VCPU_ID); 121 120 TEST_ASSERT(rv < 0 && errno == EINVAL, 122 121 "Invalid kvm_valid_regs did not cause expected KVM_RUN error: %d\n", ··· 131 116 vcpu_state(vm, VCPU_ID)->kvm_valid_regs = 0; 132 117 133 118 /* Request setting invalid register set into VCPU. */ 134 - run->kvm_dirty_regs = KVM_SYNC_X86_VALID_FIELDS << 1; 119 + run->kvm_dirty_regs = INVALID_SYNC_FIELD; 120 + rv = _vcpu_run(vm, VCPU_ID); 121 + TEST_ASSERT(rv < 0 && errno == EINVAL, 122 + "Invalid kvm_dirty_regs did not cause expected KVM_RUN error: %d\n", 123 + rv); 124 + vcpu_state(vm, VCPU_ID)->kvm_dirty_regs = 0; 125 + 126 + run->kvm_dirty_regs = INVALID_SYNC_FIELD | TEST_SYNC_FIELDS; 135 127 rv = _vcpu_run(vm, VCPU_ID); 136 128 TEST_ASSERT(rv < 0 && errno == EINVAL, 137 129 "Invalid kvm_dirty_regs did not cause expected KVM_RUN error: %d\n", ··· 147 125 148 126 /* Request and verify all valid register sets. */ 149 127 /* TODO: BUILD TIME CHECK: TEST_ASSERT(KVM_SYNC_X86_NUM_FIELDS != 3); */ 150 - run->kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS; 128 + run->kvm_valid_regs = TEST_SYNC_FIELDS; 151 129 rv = _vcpu_run(vm, VCPU_ID); 152 130 TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, 153 131 "Unexpected exit reason: %u (%s),\n", ··· 168 146 run->s.regs.sregs.apic_base = 1 << 11; 169 147 /* TODO run->s.regs.events.XYZ = ABC; */ 170 148 171 - run->kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS; 149 + run->kvm_valid_regs = TEST_SYNC_FIELDS; 172 150 run->kvm_dirty_regs = KVM_SYNC_X86_REGS | KVM_SYNC_X86_SREGS; 173 151 rv = _vcpu_run(vm, VCPU_ID); 174 152 TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, ··· 194 172 /* Clear kvm_dirty_regs bits, verify new s.regs values are 195 173 * overwritten with existing guest values. 196 174 */ 197 - run->kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS; 175 + run->kvm_valid_regs = TEST_SYNC_FIELDS; 198 176 run->kvm_dirty_regs = 0; 199 177 run->s.regs.regs.r11 = 0xDEADBEEF; 200 178 rv = _vcpu_run(vm, VCPU_ID); ··· 233 211 * with kvm_sync_regs values. 234 212 */ 235 213 run->kvm_valid_regs = 0; 236 - run->kvm_dirty_regs = KVM_SYNC_X86_VALID_FIELDS; 214 + run->kvm_dirty_regs = TEST_SYNC_FIELDS; 237 215 run->s.regs.regs.r11 = 0xBBBB; 238 216 rv = _vcpu_run(vm, VCPU_ID); 239 217 TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
+2 -2
tools/testing/selftests/kvm/vmx_tsc_adjust_test.c
··· 189 189 struct kvm_cpuid_entry2 *entry = kvm_get_supported_cpuid_entry(1); 190 190 191 191 if (!(entry->ecx & CPUID_VMX)) { 192 - printf("nested VMX not enabled, skipping test"); 193 - return 0; 192 + fprintf(stderr, "nested VMX not enabled, skipping test\n"); 193 + exit(KSFT_SKIP); 194 194 } 195 195 196 196 vm = vm_create_default_vmx(VCPU_ID, (void *) l1_guest_code);