Kernel KVM virtualization development
 help / color / mirror / Atom feed
From: "Garg, Shivank" <shivankg@amd.com>
To: "seanjc@google.com" <seanjc@google.com>
Cc: "jmattson@google.com" <jmattson@google.com>,
	"david@kernel.org" <david@kernel.org>,
	"ackerleytng@google.com" <ackerleytng@google.com>,
	"pshier@google.com" <pshier@google.com>,
	"shuah@kernel.org" <shuah@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-kselftest@vger.kernel.org"
	<linux-kselftest@vger.kernel.org>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>,
	"ricarkol@google.com" <ricarkol@google.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH v2 4/4] KVM: selftests: use allowed NUMA nodes in guest_memfd_test
Date: Sat, 5 Sep 2026 19:45:20 +0000	[thread overview]
Message-ID: <c796b93b682bf90c8ea1bad517d7a8fbdbf83619.camel@amd.com> (raw)
In-Reply-To: <apcLPJerTWENV6iD@google.com>

On Tue, 2026-09-01 at 10:28 -0700, Sean Christopherson wrote:
> On Tue, Sep 01, 2026, Shivank Garg wrote:
> > guest_memfd_test assumes that nodes 0 and 1 exist and have memory.
> > is_multi_numa_node_system() only checks that the maximum node ID is
> > nonzero, which is not enough for sparse or memoryless nodes.
> > 
> > Select the required nodes from MPOL_F_MEMS_ALLOWED instead. Use the full
> > nodemask width plus one to mbind(), and let test_mbind() run when only
> > one memory node is available.
> 
> Please split this into at least three patches.
> 
>   1. Refactor guest_memfd_test.c to prepare for using nodes other than 0 and 1.
>   2. Fix test_mbind().
>   3. Fix test_numa_allocation().
>   4. If necessary, do additional cleanups in numaif.h
> 
> As is, this is extremely difficult to review, e.g. without staring intently, I
> can't tell what's refactoring and what's actually a functional change.
> 
Agreed, will split this patch.

> Actually, looking at the xAPIC IPI test more, what you proposed in patch 3 is in
> the general direction of what we want, but needs to be more than just a wrapper
> for get_mempolicy() to be useful.  Specificaly, if it fills the mask *and* returns
> the number of nodes found, then it's more generically useful.  And if we also add
> an API to get the next (exclusive) node, then we can cut down on the amount of
> copy+paste without forcing tests to use the "array of one-bit nodemasks" approach
> that the xAPIC test uses.
> 
> E.g. the below get_numa_node_ids() is basically just copy+paste from the xAPIC
> test, except that it returns an array of nodes instead of an array of nodemasks.
> The fact that you felt compelled to copy+paste instead of adding an API is quite
> telling: using an array of nodemasks/nodes is inflexible and really only works if
> a test wants to target exactly one node.  It's also annoying to extract to a generic
> API without ending up with a brittle API.  E.g. if the API where to take the a mask
> and an array, it would either have to be a macro or take a struct to ensure the
> array can hold all possible masks.
> 
> I'm planning on adding these in the series to also add MAXNODE_FOR_MASK().
> 
> static inline int kvm_get_numa_memory_nodes(unsigned long *nodemask)
> {
> 	int r;
> 
> 	*nodemask = 0;
> 
> 	r = get_mempolicy(NULL, nodemask, MAXNODE_FOR_MASK(*nodemask), 0,
> 			  MPOL_F_MEMS_ALLOWED);
> 	TEST_ASSERT(!r || errno == ENOSYS || errno == EPERM,
> 		    "Unexpected get_mempolicy() failure");
> 	return __builtin_popcountl(*nodemask);
> }
> 
> /*
>  * Return the node ID of the next NUMA node in the mask, starting at @from+1.
>  * Guarantees a node is found, and that the found node is not @from.  Pass -1
>  * to find the first node in the mask.
>  */
> static inline int kvm_get_next_numa_node(unsigned long nodemask, int from)
> {
> 	const unsigned long nr_bits = BITS_PER_TYPE(nodemask);
> 	int to;
> 
> 	to = find_next_bit(&nodemask, nr_bits, from + 1);
> 	if (to == nr_bits)
> 		to = find_next_bit(&nodemask, nr_bits, 0);
> 
> 	TEST_ASSERT(to != nr_bits && to != from,
> 		    "Unabled to find second NUMA node (from = %d, to = %d)", from, to);
> 	return to;
> }
> 
> > The sysfs helpers for finding maxnode are no longer needed.
> 
> This is an observation, not a proper changelog sentence.
> 
> > Signed-off-by: Shivank Garg <shivankg@amd.com>
> > ---
> >  tools/testing/selftests/kvm/guest_memfd_test.c | 86 +++++++++++++++++---------
> >  tools/testing/selftests/kvm/include/numaif.h   | 52 ----------------
> >  2 files changed, 58 insertions(+), 80 deletions(-)
> > 
> > diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c
> > index 2233d871a38f..aee80dda6229 100644
> > --- a/tools/testing/selftests/kvm/guest_memfd_test.c
> > +++ b/tools/testing/selftests/kvm/guest_memfd_test.c
> > @@ -76,33 +76,53 @@ static void test_mmap_supported(int fd, size_t total_size)
> >  	kvm_munmap(mem, total_size);
> >  }
> >  
> > +/*
> > + * Fill @nids with the first @nr_nids nodes in the allowed mask.
> > + * Return false if the mask contains fewer than @nr_nids nodes.
> > + */
> > +static bool get_numa_node_ids(int *nids, int nr_nids)
> > +{
> > +	unsigned long nodemask = get_numa_mem_nodes();
> > +	unsigned long nid;
> > +	int nr_found = 0;
> > +
> > +	for_each_set_bit(nid, &nodemask, BITS_PER_TYPE(nodemask)) {
> > +		nids[nr_found++] = nid;
> > +		if (nr_found == nr_nids)
> > +			return true;
> > +	}
> > +
> > +	return false;
> > +}
> > +
> >  static void test_mbind(int fd, size_t total_size)
> >  {
> > -	const unsigned long nodemask_0 = 1; /* nid: 0 */
> > -	unsigned long nodemask = 0;
> > -	unsigned long maxnode = BITS_PER_TYPE(nodemask);
> > +	unsigned long nodemask, bind_nodemask;
> > +	unsigned long maxnode = BITS_PER_TYPE(nodemask) + 1;
> >  	int policy;
> >  	char *mem;
> > +	int nid;
> >  	int ret;
> >  
> > -	if (!is_multi_numa_node_system())
> > +	if (!get_numa_node_ids(&nid, 1))
> 
> This is not functionally equivalent.  The existing test requires multiple NUMA
> nodes, whereas this will now succeed if there's exactly one node.  That could be
> totally fine, but it needs to be isolated and explained in its own patch.

Sure.

Thanks,
Shivank

      reply	other threads:[~2026-09-05 19:45 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-01  8:22 [PATCH v2 0/4] KVM: guest_memfd: fix NUMA selftests Shivank Garg
2026-09-01  8:22 ` [PATCH v2 1/4] KVM: selftests: fix maxnode arguments in xapic_ipi_test Shivank Garg
2026-09-01 15:04   ` Sean Christopherson
2026-09-05  9:10     ` Garg, Shivank
2026-09-01  8:22 ` [PATCH v2 2/4] KVM: selftests: use BITS_PER_TYPE() for NUMA masks Shivank Garg
2026-09-01  8:22 ` [PATCH v2 3/4] KVM: selftests: add get_numa_mem_nodes() Shivank Garg
2026-09-01 15:06   ` Sean Christopherson
2026-09-05 18:52     ` Garg, Shivank
2026-09-01  8:22 ` [PATCH v2 4/4] KVM: selftests: use allowed NUMA nodes in guest_memfd_test Shivank Garg
2026-09-01  8:39   ` sashiko-bot
2026-09-01  9:38     ` Garg, Shivank
2026-09-01 15:07       ` Sean Christopherson
2026-09-01 17:28   ` Sean Christopherson
2026-09-05 19:45     ` Garg, Shivank [this message]

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=c796b93b682bf90c8ea1bad517d7a8fbdbf83619.camel@amd.com \
    --to=shivankg@amd.com \
    --cc=ackerleytng@google.com \
    --cc=david@kernel.org \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=pshier@google.com \
    --cc=ricarkol@google.com \
    --cc=seanjc@google.com \
    --cc=shuah@kernel.org \
    /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