diff --git a/kernel/include/init.h b/kernel/include/init.h index 57f31f53..3e8d74e6 100644 --- a/kernel/include/init.h +++ b/kernel/include/init.h @@ -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); diff --git a/kernel/init.c b/kernel/init.c index 6c080d7f..23777770 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -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(); diff --git a/kernel/mem.c b/kernel/mem.c index 4e0a2e8a..ca447665 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -40,6 +40,8 @@ #include #include #include +#include +#include //#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) diff --git a/lib/include/ihk/page_alloc.h b/lib/include/ihk/page_alloc.h index d844b46e..d11ebd9c 100644 --- a/lib/include/ihk/page_alloc.h +++ b/lib/include/ihk/page_alloc.h @@ -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; diff --git a/lib/include/limits.h b/lib/include/limits.h index 552236b5..ffab95b9 100644 --- a/lib/include/limits.h +++ b/lib/include/limits.h @@ -17,4 +17,8 @@ #define INT_MIN -0x80000000 #define IOV_MAX 1024 +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + #endif diff --git a/lib/page_alloc.c b/lib/page_alloc.c index 86d1a069..e3b89d90 100644 --- a/lib/page_alloc.c +++ b/lib/page_alloc.c @@ -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);