Fix test/prefered Couple of bugs here: - First the kernel errors out of the nodemask is < MAXNUMNODES, so have to discover that at runtime. There's no function in libnuma for this (perhaps there should be one?), so i wrote one here. - The loop set the node in the wrong mask, breaking the test Signed-off-by: Andi Kleen <ak@xxxxxxxxxxxxxxx> diff -urp numactl-2.0.2/test/prefered.c numactl-2.0.2-hack//test/prefered.c --- numactl-2.0.2/test/prefered.c 2008-08-05 16:36:58.000000000 +0200 +++ numactl-2.0.2-hack//test/prefered.c 2009-01-10 06:30:11.000000000 +0100 @@ -6,20 +6,38 @@ #include <assert.h> #include <unistd.h> #include <stdlib.h> +#include <errno.h> #define err(x) perror(x),exit(1) +/* Discover MAX_NUMNODE of the kernel */ +int max_numnode(void) +{ + int v; + unsigned size = 128; + struct bitmask *mask = numa_bitmask_alloc(size); + while (get_mempolicy(NULL, mask->maskp, mask->size, &v, MPOL_F_ADDR) < 0 && + errno == EINVAL) { + numa_bitmask_free(mask); + size <<= 1; + } + numa_bitmask_free(mask); + printf("size %d\n", size); + return size; +} + int main(void) { int max = numa_max_node(); + int maxmask = max_numnode(); struct bitmask *nodes, *mask; int pagesize = getpagesize(); int i; int pol; int node; int err = 0; - nodes = numa_bitmask_alloc(max+1); - mask = numa_bitmask_alloc(max+1); + nodes = numa_bitmask_alloc(maxmask); + mask = numa_bitmask_alloc(maxmask); for (i = max; i >= 0; --i) { char *mem = mmap(NULL, pagesize*(max+1), PROT_READ|PROT_WRITE, @@ -33,9 +51,9 @@ int main(void) numa_bitmask_clearall(nodes); numa_bitmask_clearall(mask); - numa_bitmask_setbit(mask, i); + numa_bitmask_setbit(nodes, i); if (mbind(adr, pagesize, MPOL_PREFERRED, nodes->maskp, nodes->size, 0) < 0) err("mbind"); -- ak@xxxxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-numa" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html