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