From: Tao Su <tao1.su@linux.intel.com>
To: Sean Christopherson <seanjc@google.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, shuah@kernel.org,
yi1.lai@intel.com
Subject: Re: [PATCH] KVM: selftests: Add a requirement for disabling numa balancing
Date: Thu, 18 Jan 2024 13:43:32 +0800 [thread overview]
Message-ID: <Zai6hJgTRegDaSfx@linux.bj.intel.com> (raw)
In-Reply-To: <ZafuSNu3ThHY8rfG@google.com>
On Wed, Jan 17, 2024 at 07:12:08AM -0800, Sean Christopherson wrote:
[...]
> > diff --git a/tools/testing/selftests/kvm/x86_64/dirty_log_page_splitting_test.c b/tools/testing/selftests/kvm/x86_64/dirty_log_page_splitting_test.c
> > index 634c6bfcd572..f2c796111d83 100644
> > --- a/tools/testing/selftests/kvm/x86_64/dirty_log_page_splitting_test.c
> > +++ b/tools/testing/selftests/kvm/x86_64/dirty_log_page_splitting_test.c
> > @@ -212,10 +212,21 @@ static void help(char *name)
> >
> > int main(int argc, char *argv[])
> > {
> > + FILE *f;
> > int opt;
> > + int ret, numa_balancing;
> >
> > TEST_REQUIRE(get_kvm_param_bool("eager_page_split"));
> > TEST_REQUIRE(get_kvm_param_bool("tdp_mmu"));
> > + f = fopen("/proc/sys/kernel/numa_balancing", "r");
> > + if (f) {
> > + ret = fscanf(f, "%d", &numa_balancing);
> > + TEST_ASSERT(ret == 1, "Error reading numa_balancing");
> > + TEST_ASSERT(!numa_balancing, "please run "
> > + "'echo 0 > /proc/sys/kernel/numa_balancing'");
>
> If we go this route, this should be a TEST_REQUIRE(), not a TEST_ASSERT(). The
> test hasn't failed, rather it has detected an incompatible setup.
Yes, previously I wanted to print a more user-friendly prompt, but TEST_REQUIRE()
can’t customize the output…
>
> Something isn't right though. The test defaults to HugeTLB, and the invocation
> in the changelog doesn't override the backing source. That suggests that NUMA
> auto-balancing is zapping HugeTLB VMAs, which AFAIK shouldn't happen, e.g. this
> code in task_numa_work() should cause such VMAs to be skipped:
>
> if (!vma_migratable(vma) || !vma_policy_mof(vma) ||
> is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_MIXEDMAP)) {
> trace_sched_skip_vma_numa(mm, vma, NUMAB_SKIP_UNSUITABLE);
> continue;
> }
>
> And the test already warns the user if they opt to use something other than
> HugeTLB.
>
> if (!is_backing_src_hugetlb(backing_src)) {
> pr_info("This test will only work reliably with HugeTLB memory. "
> "It can work with THP, but that is best effort.\n");
> }
>
> If the test is defaulting to something other than HugeTLB, then we should fix
> that in the test. If the kernel is doing NUMA balancing on HugeTLB VMAs, then
> we should fix that in the kernel.
HugeTLB VMAs are not affected by NUMA auto-balancing through my observation, but
the backing sources of the test code and per-vCPU stacks are not Huge TLB, e.g.
__vm_create() invokes
vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, 0);
So, some pages are possible to be migrated.
In dirty_log_page_splitting_test, if sleep 3s before enabling dirty logging:
--- a/tools/testing/selftests/kvm/x86_64/dirty_log_page_splitting_test.c
+++ b/tools/testing/selftests/kvm/x86_64/dirty_log_page_splitting_test.c
@@ -124,6 +124,7 @@ static void run_test(enum vm_guest_mode mode, void *unused)
memstress_start_vcpu_threads(VCPUS, vcpu_worker);
run_vcpu_iteration(vm);
+ sleep(3);
get_page_stats(vm, &stats_populated, "populating memory");
/* Enable dirty logging */
I got these logs:
# ./x86_64/dirty_log_page_splitting_test
Testing guest mode: PA-bits:ANY, VA-bits:48, 4K pages
__vm_create: mode='PA-bits:ANY, VA-bits:48, 4K pages' pages='2710'
Guest physical address width detected: 52
guest physical test memory: [0xfffff7fe00000, 0xfffffffe00000)
Added VCPU 0 with test mem gpa [fffff7fe00000, fffffffe00000)
Added VCPU 1 with test mem gpa [fffff7fe00000, fffffffe00000)
Page stats after populating memory: 4K: 0 2M: 1024 1G: 0 huge: 1024
Page stats after enabling dirty logging: 4K: 524288 2M: 0 1G: 0 huge: 0
Page stats after dirtying memory: 4K: 525334 2M: 0 1G: 0 huge: 0
Page stats after dirtying memory: 4K: 525334 2M: 0 1G: 0 huge: 0
Page stats after disabling dirty logging: 4K: 1046 2M: 0 1G: 0 huge: 0
Page stats after repopulating memory: 4K: 1046 2M: 1024 1G: 0 huge: 1024
==== Test Assertion Failure ====
x86_64/dirty_log_page_splitting_test.c:196: stats_populated.pages_4k == stats_repopulated.pages_4k
pid=2660413 tid=2660413 errno=0 - Success
1 0x0000000000402d4b: run_test at dirty_log_page_splitting_test.c:196 (discriminator 1)
2 0x0000000000403724: for_each_guest_mode at guest_modes.c:100
3 0x00000000004024ef: main at dirty_log_page_splitting_test.c:246
4 0x00007fd72c229d8f: ?? ??:0
5 0x00007fd72c229e3f: ?? ??:0
6 0x00000000004025b4: _start at ??:?
0 != 0x416 (stats_populated.pages_4k != stats_repopulated.pages_4k)
Thanks,
Tao
next prev parent reply other threads:[~2024-01-18 5:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-17 6:44 [PATCH] KVM: selftests: Add a requirement for disabling numa balancing Tao Su
2024-01-17 15:12 ` Sean Christopherson
2024-01-18 5:43 ` Tao Su [this message]
2024-01-18 17:33 ` Sean Christopherson
2024-01-19 6:05 ` Tao Su
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zai6hJgTRegDaSfx@linux.bj.intel.com \
--to=tao1.su@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=shuah@kernel.org \
--cc=yi1.lai@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox