Le 24/11/2010 07:47, Christopher Samuel a écrit :
> On 22/11/10 07:48, Christopher Samuel wrote:
>
> > *** glibc detected *** /tmp/hwloc/hwloc-1.1rc2/tests/.libs/hwloc_bind:
> > free(): invalid next size (fast): 0x1001c240 ***
>
> Went and had a look at the code that was failing.  This is
> the fragement that fails:
>
> #ifdef HWLOC_HAVE_MIGRATE_PAGES
>     unsigned long *fullmask = malloc(max_os_index/HWLOC_BITS_PER_LONG *
> sizeof(long));
>     if (fullmask) {
>       memset(fullmask, max_os_index/HWLOC_BITS_PER_LONG * sizeof(long),
> 0xf);
>       err = migrate_pages(0, max_os_index+1, fullmask, linuxmask);
>       free(fullmask);
>     } else
>       err = -1;
>     if (err < 0 && (flags & HWLOC_MEMBIND_STRICT))
>       goto out_with_mask;
> #else
>
> I can get the free(fullmask); to not fail if I comment out
> the memset() and migrate_pages() calls.  If I just comment
> out the migrate_pages() then it still fails so there's
> something wrong in that calculation from the look of it.

Can you add this?
  printf("max_os_index=%u memsize=%u\n", max_os_index,
max_os_index/HWLOC_BITS_PER_LONG * sizeof(long));
If there are few numa nodes on your machine, it's supposed to print
something like 32 4 on 32bits machine and 64 8 on 64bits.

If max_os_index is wrong, the problem lies in
hwloc_linux_membind_mask_from_nodeset(). Adding a
printf("max_os_index=%d\n", max_os_index); right before /* round up ...
BITS_PER_LONG */ may help too.

Brice

Reply via email to