blob: fa7762f02cc0bfe9c37d64e5768a586429b900e0 [file] [log] [blame]
#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;
}