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
prev parent 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