/* TODO: seems to be right, but doesn't seem to be working (EINVAL), even after * aligning the range on 64K... */ static int hwloc_aix_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { subrange_t subrange; rsid_t rsid = { .at_subrange = &subrange }; uint_t aix_policy; int ret; fprintf(stderr,"yop\n"); if ((flags & (HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_STRICT)) == (HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_STRICT)) { errno = ENOSYS; return -1; } subrange.su_offset = (uintptr_t) addr; subrange.su_length = len; subrange.su_rstype = R_RSET; if (hwloc_aix_membind_policy_from_hwloc(&aix_policy, policy)) return -1; if (hwloc_aix_prepare_membind(topology, &subrange.su_rsid.at_rset, nodeset, flags)) return -1; subrange.su_policy = aix_policy; ret = ra_attachrset(R_SUBRANGE, rsid, subrange.su_rsid.at_rset, 0); rs_free(subrange.su_rsid.at_rset); return ret; }
static void * hwloc_aix_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { void *ret; rsid_t rsid; uint_t aix_policy; if (hwloc_aix_membind_policy_from_hwloc(&aix_policy, policy)) return hwloc_alloc_or_fail(topology, len, flags); if (hwloc_aix_prepare_membind(topology, &rsid.at_rset, nodeset, flags)) return hwloc_alloc_or_fail(topology, len, flags); ret = ra_mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0, R_RSET, rsid, aix_policy); rs_free(rsid.at_rset); return ret; }
/* TODO: seems to be right, but doesn't seem to be working (EINVAL), even after * aligning the range on 64K... */ static int hwloc_aix_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { subrange_t subrange; rsid_t rsid = { .at_subrange = &subrange }; uint_t aix_policy; int ret; fprintf(stderr,"yop\n"); if ((flags & (HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_STRICT)) == (HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_STRICT)) { errno = ENOSYS; return -1; } subrange.su_offset = (uintptr_t) addr; subrange.su_length = len; subrange.su_rstype = R_RSET; if (hwloc_aix_membind_policy_from_hwloc(&aix_policy, policy)) return -1; if (hwloc_aix_prepare_membind(topology, &subrange.su_rsid.at_rset, nodeset, flags)) return -1; subrange.su_policy = aix_policy; res = ra_attachrset(R_SUBRANGE, rsid, subrange.su_rsid.at_rset, 0); if (res < 0 && errno == EPERM) { /* EPERM may mean that one thread has ben bound with bindprocessor(). * Unbind the entire process (we can't unbind individual threads) * and try again. * FIXME: actually check that this EPERM can happen */ bindprocessor(BINDPROCESS, getpid(), PROCESSOR_CLASS_ANY); res = ra_attachrset(R_SUBRANGE, rsid, subrange.su_rsid.at_rset, 0); } rs_free(subrange.su_rsid.at_rset); return ret; }