Skip to content

Commit

Permalink
KVM: selftests: Generalize check_clocksource() from kvm_clock_test
Browse files Browse the repository at this point in the history
Several existing x86 selftests need to check that the underlying system
clocksource is TSC or based on TSC but every test implements its own
check. As a first step towards unification, extract check_clocksource()
from kvm_clock_test and split it into two functions: arch-neutral
'sys_get_cur_clocksource()' and x86-specific 'sys_clocksource_is_tsc()'.
Fix a couple of pre-existing issues in kvm_clock_test: memory leakage in
check_clocksource() and using TEST_ASSERT() instead of TEST_REQUIRE().
The change also makes the test fail when system clocksource can't be read
from sysfs.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Link: https://lore.kernel.org/r/20240109141121.1619463-2-vkuznets@redhat.com
[sean: eliminate if-elif pattern just to set a bool true]
Signed-off-by: Sean Christopherson <seanjc@google.com>
  • Loading branch information
vittyvk authored and sean-jc committed Jan 30, 2024
1 parent a0868e7 commit 449d0d6
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 37 deletions.
2 changes: 2 additions & 0 deletions tools/testing/selftests/kvm/include/test_util.h
Expand Up @@ -195,4 +195,6 @@ __printf(3, 4) int guest_snprintf(char *buf, int n, const char *fmt, ...);

char *strdup_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2), nonnull(1)));

char *sys_get_cur_clocksource(void);

#endif /* SELFTEST_KVM_TEST_UTIL_H */
2 changes: 2 additions & 0 deletions tools/testing/selftests/kvm/include/x86_64/processor.h
Expand Up @@ -1271,4 +1271,6 @@ void virt_map_level(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
#define PFERR_GUEST_PAGE_MASK BIT_ULL(PFERR_GUEST_PAGE_BIT)
#define PFERR_IMPLICIT_ACCESS BIT_ULL(PFERR_IMPLICIT_ACCESS_BIT)

bool sys_clocksource_is_tsc(void);

#endif /* SELFTEST_KVM_PROCESSOR_H */
25 changes: 25 additions & 0 deletions tools/testing/selftests/kvm/lib/test_util.c
Expand Up @@ -392,3 +392,28 @@ char *strdup_printf(const char *fmt, ...)

return str;
}

#define CLOCKSOURCE_PATH "/sys/devices/system/clocksource/clocksource0/current_clocksource"

char *sys_get_cur_clocksource(void)
{
char *clk_name;
struct stat st;
FILE *fp;

fp = fopen(CLOCKSOURCE_PATH, "r");
TEST_ASSERT(fp, "failed to open clocksource file, errno: %d", errno);

TEST_ASSERT(!fstat(fileno(fp), &st), "failed to stat clocksource file, errno: %d",
errno);

clk_name = malloc(st.st_size);
TEST_ASSERT(clk_name, "failed to allocate buffer to read file");

TEST_ASSERT(fgets(clk_name, st.st_size, fp), "failed to read clocksource file: %d",
ferror(fp));

fclose(fp);

return clk_name;
}
10 changes: 10 additions & 0 deletions tools/testing/selftests/kvm/lib/x86_64/processor.c
Expand Up @@ -1299,3 +1299,13 @@ void kvm_selftest_arch_init(void)
host_cpu_is_intel = this_cpu_is_intel();
host_cpu_is_amd = this_cpu_is_amd();
}

bool sys_clocksource_is_tsc(void)
{
char *clk_name = sys_get_cur_clocksource();
bool ret = !strcmp(clk_name, "tsc\n");

free(clk_name);

return ret;
}
38 changes: 1 addition & 37 deletions tools/testing/selftests/kvm/x86_64/kvm_clock_test.c
Expand Up @@ -132,42 +132,6 @@ static void enter_guest(struct kvm_vcpu *vcpu)
}
}

#define CLOCKSOURCE_PATH "/sys/devices/system/clocksource/clocksource0/current_clocksource"

static void check_clocksource(void)
{
char *clk_name;
struct stat st;
FILE *fp;

fp = fopen(CLOCKSOURCE_PATH, "r");
if (!fp) {
pr_info("failed to open clocksource file: %d; assuming TSC.\n",
errno);
return;
}

if (fstat(fileno(fp), &st)) {
pr_info("failed to stat clocksource file: %d; assuming TSC.\n",
errno);
goto out;
}

clk_name = malloc(st.st_size);
TEST_ASSERT(clk_name, "failed to allocate buffer to read file");

if (!fgets(clk_name, st.st_size, fp)) {
pr_info("failed to read clocksource file: %d; assuming TSC.\n",
ferror(fp));
goto out;
}

TEST_ASSERT(!strncmp(clk_name, "tsc\n", st.st_size),
"clocksource not supported: %s", clk_name);
out:
fclose(fp);
}

int main(void)
{
struct kvm_vcpu *vcpu;
Expand All @@ -179,7 +143,7 @@ int main(void)
flags = kvm_check_cap(KVM_CAP_ADJUST_CLOCK);
TEST_REQUIRE(flags & KVM_CLOCK_REALTIME);

check_clocksource();
TEST_REQUIRE(sys_clocksource_is_tsc());

vm = vm_create_with_one_vcpu(&vcpu, guest_main);

Expand Down

0 comments on commit 449d0d6

Please sign in to comment.