1#include <stdio.h>
2#include <string.h>
3
4#include "common.h"
5#include "bitmask.h"
6#include "cpuset.h"
7#include "meminfo.h"
8
9#define LIST_PRESENT_MEM_FILE	"/sys/devices/system/node/possible"
10#define LIST_ONLINE_MEM_FILE	"/sys/devices/system/node/online"
11
12int nmems;
13int mems_nbits;
14
15/*
16 * get the bitmask of the online nodes
17 *
18 * return value: 0  - success
19 * 		 -1 - failed
20 */
21int online_memmask(struct bitmask *memmask)
22{
23	FILE *fp = NULL;
24	char buf[BUFFSIZE];
25
26	if (memmask == NULL)
27		return -1;
28
29	/*
30	 * open file /sys/devices/system/node/online and get online
31	 * nodelist
32	 */
33	if ((fp = fopen(LIST_ONLINE_MEM_FILE, "r")) == NULL)
34		return -1;
35
36	if (fgets(buf, sizeof(buf), fp) == NULL) {
37		fclose(fp);
38		return -1;
39	}
40
41	fclose(fp);
42
43	/* parse present nodelist to bitmap */
44	buf[strlen(buf) - 1] = '\0';
45	if (bitmask_parselist(buf, memmask) != 0)
46		return -1;
47
48	return 0;
49}
50
51/*
52 * get the bitmask of the present nodes including offline nodes
53 *
54 * return value: 0  - success
55 * 		 -1 - failed
56 */
57int present_memmask(struct bitmask *memmask)
58{
59	FILE *fp = NULL;
60	char buf[BUFFSIZE];
61
62	if (memmask == NULL)
63		return -1;
64
65	/*
66	 * open file /sys/devices/system/node/possible and get present
67	 * nodelist
68	 */
69	if ((fp = fopen(LIST_PRESENT_MEM_FILE, "r")) == NULL)
70		return -1;
71
72	if (fgets(buf, sizeof(buf), fp) == NULL) {
73		fclose(fp);
74		return -1;
75	}
76
77	fclose(fp);
78
79	/* parse present nodelist to bitmap */
80	buf[strlen(buf) - 1] = '\0';
81	if (bitmask_parselist(buf, memmask) != 0)
82		return -1;
83
84	return 0;
85}
86
87/*
88 * get the number of the nodes including offline nodes
89 */
90int get_nmems(void)
91{
92	struct bitmask *bmp = NULL;
93	int n = 0;
94
95	/* get the bitmask's len */
96	if (mems_nbits <= 0) {
97		mems_nbits = cpuset_mems_nbits();
98		if (mems_nbits <= 0)
99			return -1;
100	}
101
102	/* allocate the space for bitmask */
103	bmp = bitmask_alloc(mems_nbits);
104	if (bmp == NULL)
105		return -1;
106
107	if (present_memmask(bmp)) {
108		bitmask_free(bmp);
109		return -1;
110	}
111
112	/* Numbwe of highest set bit +1 is the number of the nodes */
113	if (bitmask_weight(bmp) <= 0) {
114		bitmask_free(bmp);
115		return -1;
116	}
117
118	n = bitmask_last(bmp) + 1;
119	bitmask_free(bmp);
120
121	return n;
122}
123