/* * Parse the string @a maskStr containing a hex number (with or without * leading "0x") and set nodemask accordingly. * * If the sting is not a valid hex number, each bit in nodemask becomes set. */ static void parseNUMAmask(struct bitmask *nodemask, char *maskStr, int32_t rank) { char *mask, *curchar, *endptr; size_t len; uint32_t curbit; uint16_t i, j, digit; mask = maskStr; if (strncmp(maskStr, "0x", 2) == 0) { /* skip "0x", treat always as hex */ mask += 2; } mask = ustrdup(mask); /* gets destroyed */ len = strlen(mask); curchar = mask + (len - 1); curbit = 0; for (i = len; i > 0; i--) { digit = strtol(curchar, &endptr, 16); if (*endptr != '\0') { mlog("%s: error parsing memory mask '%s'\n", __func__, maskStr); goto error; } for (j = 0; j < 4; j++) { if (digit & (1 << j)) { if ((long int)(curbit + j) > numa_max_node()) { mlog("%s: invalid memory mask entry '%s' for rank %d\n", __func__, maskStr, rank); fprintf(stderr, "Invalid memory mask entry '%s' for rank" " %d\n", maskStr, rank); goto error; } if (numa_bitmask_isbitset(numa_get_mems_allowed(), curbit + j)) { numa_bitmask_setbit(nodemask, curbit + j); } else { mlog("%s: setting bit %u in memory mask not allowed in" " rank %d\n", __func__, curbit + j, rank); fprintf(stderr, "Not allowed to set bit %u in memory mask" " of rank %d\n", curbit + j, rank); } } } curbit += 4; *curchar = '\0'; curchar--; } ufree(mask); return; error: ufree(mask); numa_bitmask_setall(nodemask); }
void open_mmap() { int ret = posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); assert(ret==0); data = (T *)mmap(NULL, sizeof(T) * length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); struct bitmask *bmask=numa_allocate_nodemask(); numa_bitmask_setall(bmask); numa_tonodemask_memory(data,sizeof(T)*length,bmask); numa_free_nodemask(bmask); assert(data!=MAP_FAILED); is_open = true; }