Re: [PATCH] KVM: selftests: Add a requirement for disabling numa balancing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux