| #include <stdio.h> |
| #include <string.h> |
| |
| #include "common.h" |
| #include "bitmask.h" |
| #include "cpuset.h" |
| #include "meminfo.h" |
| |
| #define LIST_PRESENT_MEM_FILE "/sys/devices/system/node/possible" |
| #define LIST_ONLINE_MEM_FILE "/sys/devices/system/node/online" |
| |
| int nmems; |
| int mems_nbits; |
| |
| /* |
| * get the bitmask of the online nodes |
| * |
| * return value: 0 - success |
| * -1 - failed |
| */ |
| int online_memmask(struct bitmask *memmask) |
| { |
| FILE *fp = NULL; |
| char buf[BUFFSIZE]; |
| |
| if (memmask == NULL) |
| return -1; |
| |
| /* |
| * open file /sys/devices/system/node/online and get online |
| * nodelist |
| */ |
| if ((fp = fopen(LIST_ONLINE_MEM_FILE, "r")) == NULL) |
| return -1; |
| |
| if (fgets(buf, sizeof(buf), fp) == NULL) { |
| fclose(fp); |
| return -1; |
| } |
| |
| fclose(fp); |
| |
| /* parse present nodelist to bitmap */ |
| buf[strlen(buf) - 1] = '\0'; |
| if (bitmask_parselist(buf, memmask) != 0) |
| return -1; |
| |
| return 0; |
| } |
| |
| /* |
| * get the bitmask of the present nodes including offline nodes |
| * |
| * return value: 0 - success |
| * -1 - failed |
| */ |
| int present_memmask(struct bitmask *memmask) |
| { |
| FILE *fp = NULL; |
| char buf[BUFFSIZE]; |
| |
| if (memmask == NULL) |
| return -1; |
| |
| /* |
| * open file /sys/devices/system/node/possible and get present |
| * nodelist |
| */ |
| if ((fp = fopen(LIST_PRESENT_MEM_FILE, "r")) == NULL) |
| return -1; |
| |
| if (fgets(buf, sizeof(buf), fp) == NULL) { |
| fclose(fp); |
| return -1; |
| } |
| |
| fclose(fp); |
| |
| /* parse present nodelist to bitmap */ |
| buf[strlen(buf) - 1] = '\0'; |
| if (bitmask_parselist(buf, memmask) != 0) |
| return -1; |
| |
| return 0; |
| } |
| |
| /* |
| * get the number of the nodes including offline nodes |
| */ |
| int get_nmems(void) |
| { |
| struct bitmask *bmp = NULL; |
| int n = 0; |
| |
| /* get the bitmask's len */ |
| if (mems_nbits <= 0) { |
| mems_nbits = cpuset_mems_nbits(); |
| if (mems_nbits <= 0) |
| return -1; |
| } |
| |
| /* allocate the space for bitmask */ |
| bmp = bitmask_alloc(mems_nbits); |
| if (bmp == NULL) |
| return -1; |
| |
| if (present_memmask(bmp)) { |
| bitmask_free(bmp); |
| return -1; |
| } |
| |
| /* Numbwe of highest set bit +1 is the number of the nodes */ |
| if (bitmask_weight(bmp) <= 0) { |
| bitmask_free(bmp); |
| return -1; |
| } |
| |
| n = bitmask_last(bmp) + 1; |
| bitmask_free(bmp); |
| |
| return n; |
| } |