summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/kvm/include
diff options
context:
space:
mode:
authorSean Christopherson <seanjc@google.com>2026-09-02 17:16:23 -0700
committerSean Christopherson <seanjc@google.com>2026-09-11 09:35:50 -0700
commit0be096bbc9cc7734b9aa82f62b4a5b44bd884540 (patch)
tree6c9d10ec8b8da9addf659ae7063d14dc4fd08c2d /tools/testing/selftests/kvm/include
parent3a2a37d2d48e6844dde61032faf130400fad5312 (diff)
KVM: selftests: Add common helper to get mask+number of usable memory NUMA nodes
Extract and slightly adopt the xAPIC IPI test's logic for getting the mask and number of usable memory NUMA nodes into a common helper. To allow for friendlier behavior when the underlying kernel doesn't support NUMA, or the test was run without sufficient permissions, zero out the mask and return "zero nodes" if get_mempolicy() fails with ENOSYS or EPERM respectively. I.e. allow tests to skip (sub)tests instead of throwing an assert. Suggested-by: Shivank Garg <shivankg@amd.com> Reviewed-by: Shivank Garg <shivankg@amd.com> Link: https://patch.msgid.link/20260903001625.2792367-6-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
Diffstat (limited to 'tools/testing/selftests/kvm/include')
-rw-r--r--tools/testing/selftests/kvm/include/numaif.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/tools/testing/selftests/kvm/include/numaif.h b/tools/testing/selftests/kvm/include/numaif.h
index 299dddff2729..0945500c6322 100644
--- a/tools/testing/selftests/kvm/include/numaif.h
+++ b/tools/testing/selftests/kvm/include/numaif.h
@@ -41,6 +41,19 @@ KVM_SYSCALL_DEFINE(mbind, 6, void *, addr, unsigned long, size, int, mode,
*/
#define MAXNODE_FOR_MASK(mask) (BITS_PER_TYPE(mask) + 1)
+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