[PATCH] fixup! selftests/mm: check MADV_COLD and MADV_PAGEOUT range handling

Gregory Price (Meta) posted 1 patch an hour ago
tools/testing/selftests/mm/madvise.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
[PATCH] fixup! selftests/mm: check MADV_COLD and MADV_PAGEOUT range handling
Posted by Gregory Price (Meta) an hour ago
Sashiko fixup for patch 3/8

This is largely an overly aggressive fix for systems with >1024 cpus,
but it's simple enough and can just be squashed.

sched_getcpu() can return a CPU number at or above CPU_SETSIZE on large
systems. CPU_SET() ignores such a number, so the fixed-size mask stays
empty, sched_setaffinity() fails with EINVAL, and every test that pins
itself fails. Size the mask to the CPU number with CPU_ALLOC() instead.

Signed-off-by: Gregory Price (Meta) <gourry@gourry.net>
---
 tools/testing/selftests/mm/madvise.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/mm/madvise.c b/tools/testing/selftests/mm/madvise.c
index d59c03ec8191..3f361bcf1039 100644
--- a/tools/testing/selftests/mm/madvise.c
+++ b/tools/testing/selftests/mm/madvise.c
@@ -224,12 +224,18 @@ static bool pageout_until_evicted(struct __test_metadata *_metadata,
 static void pin_to_current_cpu(struct __test_metadata *_metadata)
 {
 	int cpu = sched_getcpu();
-	cpu_set_t mask;
+	cpu_set_t *mask;
+	size_t size;
 
 	ASSERT_GE(cpu, 0);
-	CPU_ZERO(&mask);
-	CPU_SET(cpu, &mask);
-	ASSERT_EQ(sched_setaffinity(0, sizeof(mask), &mask), 0);
+	/* CPU numbers can exceed CPU_SETSIZE, so size the mask to fit. */
+	mask = CPU_ALLOC(cpu + 1);
+	ASSERT_NE(mask, NULL);
+	size = CPU_ALLOC_SIZE(cpu + 1);
+	CPU_ZERO_S(size, mask);
+	CPU_SET_S(cpu, size, mask);
+	ASSERT_EQ(sched_setaffinity(0, size, mask), 0);
+	CPU_FREE(mask);
 }
 
 static bool page_is_present(int pagemap_fd, char *addr)
-- 
2.56.0