KVM: selftests: Add __open_path_or_exit() variant to provide extra help info

Add an inner __open_path_or_exit() API to let the caller provide additional
information on ENOENT to try and help the user figure out why the test is
being skipped, e.g. for files like the page_idle bitmap needed by the
access tracking perf, which is dependent on a Kconfig.

Immediately convert /dev/kvm to the new API, both as an example and because
users might not know that some architectures/setups require loading KVM.

Link: https://lore.kernel.org/r/20250516215909.2551628-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
Sean Christopherson
2025-05-16 14:59:07 -07:00
parent fcab107abe
commit 6e1cce7cda
2 changed files with 16 additions and 4 deletions

View File

@@ -253,6 +253,7 @@ struct vm_guest_mode_params {
};
extern const struct vm_guest_mode_params vm_guest_mode_params[];
int __open_path_or_exit(const char *path, int flags, const char *enoent_help);
int open_path_or_exit(const char *path, int flags);
int open_kvm_dev_path_or_exit(void);

View File

@@ -26,15 +26,26 @@ static uint32_t last_guest_seed;
static int vcpu_mmap_sz(void);
int open_path_or_exit(const char *path, int flags)
int __open_path_or_exit(const char *path, int flags, const char *enoent_help)
{
int fd;
fd = open(path, flags);
__TEST_REQUIRE(fd >= 0 || errno != ENOENT, "Cannot open %s: %s", path, strerror(errno));
TEST_ASSERT(fd >= 0, "Failed to open '%s'", path);
if (fd < 0)
goto error;
return fd;
error:
if (errno == ENOENT)
ksft_exit_skip("- Cannot open '%s': %s. %s\n",
path, strerror(errno), enoent_help);
TEST_FAIL("Failed to open '%s'", path);
}
int open_path_or_exit(const char *path, int flags)
{
return __open_path_or_exit(path, flags, "");
}
/*
@@ -48,7 +59,7 @@ int open_path_or_exit(const char *path, int flags)
*/
static int _open_kvm_dev_path_or_exit(int flags)
{
return open_path_or_exit(KVM_DEV_PATH, flags);
return __open_path_or_exit(KVM_DEV_PATH, flags, "Is KVM loaded and enabled?");
}
int open_kvm_dev_path_or_exit(void)