NUMA: expose correct /sys/devices/system/node/nodeX/meminfo

This commit is contained in:
Balazs Gerofi
2017-07-07 00:22:25 +09:00
parent 72e3f5ee50
commit 0f58e9e77d
6 changed files with 51 additions and 0 deletions

View File

@ -30,6 +30,7 @@ extern void init_host_ikc2mckernel(void);
extern void sched_init(void);
extern void pc_ap_init(void);
extern void cpu_sysfs_setup(void);
extern void numa_sysfs_setup(void);
extern void rusage_sysfs_setup(void);
extern void status_sysfs_setup(void);

View File

@ -350,6 +350,7 @@ static void setup_remote_snooping_samples(void)
static void populate_sysfs(void)
{
cpu_sysfs_setup();
numa_sysfs_setup();
#ifdef ENABLE_RUSAGE
rusage_sysfs_setup();
status_sysfs_setup();

View File

@ -40,6 +40,8 @@
#include <rusage.h>
#include <syscall.h>
#include <profile.h>
#include <limits.h>
#include <sysfs.h>
//#define DEBUG_PRINT_MEM
@ -1147,6 +1149,7 @@ static void numa_init(void)
mcs_lock_init(&memory_nodes[i].lock);
memory_nodes[i].min_addr = 0xFFFFFFFFFFFFFFFF;
memory_nodes[i].max_addr = 0;
memory_nodes[i].nr_pages = 0;
memory_nodes[i].nr_free_pages = 0;
#endif
@ -1268,6 +1271,46 @@ static void numa_distances_init()
}
}
static ssize_t numa_sysfs_show_meminfo(struct sysfs_ops *ops,
void *instance, void *buf, size_t size)
{
struct ihk_mc_numa_node *node =
(struct ihk_mc_numa_node *)instance;
char *sbuf = (char *)buf;
int len = 0;
#ifdef IHK_RBTREE_ALLOCATOR
len += snprintf(&sbuf[len], size - len, "Node %d MemTotal:%15d kB\n",
node->id, node->nr_pages << 2);
len += snprintf(&sbuf[len], size - len, "Node %d MemFree:%16d kB\n",
node->id, node->nr_free_pages << 2);
len += snprintf(&sbuf[len], size - len, "Node %d MemUsed:%16d kB\n",
node->id, (node->nr_pages - node->nr_free_pages) << 2);
#endif
return len;
}
struct sysfs_ops numa_sysfs_meminfo = {
.show = &numa_sysfs_show_meminfo,
};
void numa_sysfs_setup(void) {
int i;
int error;
char path[PATH_MAX];
for (i = 0; i < ihk_mc_get_nr_numa_nodes(); ++i) {
sprintf(path, "/sys/devices/system/node/node%d/meminfo", i);
error = sysfs_createf(&numa_sysfs_meminfo, &memory_nodes[i],
0444, path);
if (error) {
kprintf("%s: ERROR: creating %s\n", __FUNCTION__, path);
}
}
}
#define PHYS_PAGE_HASH_SHIFT (10)
#define PHYS_PAGE_HASH_SIZE (1 << PHYS_PAGE_HASH_SHIFT)
#define PHYS_PAGE_HASH_MASK (PHYS_PAGE_HASH_SIZE - 1)

View File

@ -44,6 +44,7 @@ struct ihk_mc_numa_node {
struct rb_root free_chunks;
mcs_lock_node_t lock;
unsigned long nr_pages;
unsigned long nr_free_pages;
unsigned long min_addr;
unsigned long max_addr;

View File

@ -17,4 +17,8 @@
#define INT_MIN -0x80000000
#define IOV_MAX 1024
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
#endif

View File

@ -595,6 +595,7 @@ int ihk_numa_add_free_pages(struct ihk_mc_numa_node *node,
if (addr + size > node->max_addr)
node->max_addr = addr + size;
node->nr_pages += (size >> PAGE_SHIFT);
node->nr_free_pages += (size >> PAGE_SHIFT);
dkprintf("%s: added free pages 0x%lx:%lu\n",
__FUNCTION__, addr, size);