[<prev] [next>] [day] [month] [year] [list]
Message-Id: <20250227041522.1734260-1-mlevitsk@redhat.com>
Date: Wed, 26 Feb 2025 23:15:22 -0500
From: Maxim Levitsky <mlevitsk@...hat.com>
To: kvm@...r.kernel.org
Cc: Shuah Khan <shuah@...nel.org>,
James Houghton <jthoughton@...gle.com>,
Muhammad Usama Anjum <usama.anjum@...labora.com>,
Anup Patel <anup@...infault.org>,
Maxim Levitsky <mlevitsk@...hat.com>,
Claudio Imbrenda <imbrenda@...ux.ibm.com>,
Paolo Bonzini <pbonzini@...hat.com>,
Sean Christopherson <seanjc@...gle.com>,
linux-kernel@...r.kernel.org,
linux-kselftest@...r.kernel.org,
Oliver Upton <oliver.upton@...ux.dev>
Subject: [PATCH] KVM: selftests: access_tracking_perf_test: add option to skip the sanity check
Add an option to skip sanity check of number of still idle pages,
and force it on, in case hypervisor or NUMA balancing
is detected.
Signed-off-by: Maxim Levitsky <mlevitsk@...hat.com>
---
.../selftests/kvm/access_tracking_perf_test.c | 23 +++++++++++++++++--
.../testing/selftests/kvm/include/test_util.h | 1 +
tools/testing/selftests/kvm/lib/test_util.c | 22 ++++++++++++++++++
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tools/testing/selftests/kvm/access_tracking_perf_test.c
index 3c7defd34f56..eafaecf086c4 100644
--- a/tools/testing/selftests/kvm/access_tracking_perf_test.c
+++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c
@@ -65,6 +65,8 @@ static int vcpu_last_completed_iteration[KVM_MAX_VCPUS];
/* Whether to overlap the regions of memory vCPUs access. */
static bool overlap_memory_access;
+static bool skip_sanity_check;
+
struct test_params {
/* The backing source for the region of memory. */
enum vm_mem_backing_src_type backing_src;
@@ -185,7 +187,7 @@ static void mark_vcpu_memory_idle(struct kvm_vm *vm,
*/
if (still_idle >= pages / 10) {
#ifdef __x86_64__
- TEST_ASSERT(this_cpu_has(X86_FEATURE_HYPERVISOR),
+ TEST_ASSERT(skip_sanity_check,
"vCPU%d: Too many pages still idle (%lu out of %lu)",
vcpu_idx, still_idle, pages);
#endif
@@ -342,6 +344,8 @@ static void help(char *name)
printf(" -v: specify the number of vCPUs to run.\n");
printf(" -o: Overlap guest memory accesses instead of partitioning\n"
" them into a separate region of memory for each vCPU.\n");
+ printf(" -u: Skip check that after dirtying the guest memory, most (90%%) of\n"
+ "it is reported as dirty again");
backing_src_help("-s");
puts("");
exit(0);
@@ -359,7 +363,7 @@ int main(int argc, char *argv[])
guest_modes_append_default();
- while ((opt = getopt(argc, argv, "hm:b:v:os:")) != -1) {
+ while ((opt = getopt(argc, argv, "hm:b:v:os:u")) != -1) {
switch (opt) {
case 'm':
guest_modes_cmdline(optarg);
@@ -376,6 +380,9 @@ int main(int argc, char *argv[])
case 's':
params.backing_src = parse_backing_src_type(optarg);
break;
+ case 'u':
+ skip_sanity_check = true;
+ break;
case 'h':
default:
help(argv[0]);
@@ -386,6 +393,18 @@ int main(int argc, char *argv[])
page_idle_fd = open("/sys/kernel/mm/page_idle/bitmap", O_RDWR);
__TEST_REQUIRE(page_idle_fd >= 0,
"CONFIG_IDLE_PAGE_TRACKING is not enabled");
+
+
+ if (skip_sanity_check == false) {
+ if (this_cpu_has(X86_FEATURE_HYPERVISOR)) {
+ printf("Skipping idle page count sanity check, because the test is run nested\n");
+ skip_sanity_check = true;
+ } else if (is_numa_balancing_enabled()) {
+ printf("Skipping idle page count sanity check, because NUMA balance is enabled\n");
+ skip_sanity_check = true;
+ }
+ }
+
close(page_idle_fd);
for_each_guest_mode(run_test, ¶ms);
diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
index 3e473058849f..1bc9b0a92427 100644
--- a/tools/testing/selftests/kvm/include/test_util.h
+++ b/tools/testing/selftests/kvm/include/test_util.h
@@ -153,6 +153,7 @@ bool is_backing_src_hugetlb(uint32_t i);
void backing_src_help(const char *flag);
enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
long get_run_delay(void);
+bool is_numa_balancing_enabled(void);
/*
* Whether or not the given source type is shared memory (as opposed to
diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
index 8ed0b74ae837..1271863613fa 100644
--- a/tools/testing/selftests/kvm/lib/test_util.c
+++ b/tools/testing/selftests/kvm/lib/test_util.c
@@ -163,6 +163,28 @@ size_t get_trans_hugepagesz(void)
return size;
}
+
+bool is_numa_balancing_enabled(void)
+{
+ int ret;
+ int val;
+ struct stat statbuf;
+ FILE *f;
+
+ ret = stat("/proc/sys/kernel/numa_balancing", &statbuf);
+ TEST_ASSERT(ret == 0 || (ret == -1 && errno == ENOENT),
+ "Error in stating /proc/sys/kernel/numa_balancing");
+
+ if (ret != 0)
+ return false;
+
+ f = fopen("/proc/sys/kernel/numa_balancing", "r");
+ ret = fscanf(f, "%d", &val);
+
+ TEST_ASSERT(val == 0 || val == 1, "Unexpected value in /proc/sys/kernel/numa_balancing");
+ return val == 1;
+}
+
size_t get_def_hugetlb_pagesz(void)
{
char buf[64];
--
2.26.3
Powered by blists - more mailing lists