NUMA: expose correct /sys/devices/system/node/nodeX/meminfo
This commit is contained in:
@ -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);
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
43
kernel/mem.c
43
kernel/mem.c
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -17,4 +17,8 @@
|
||||
#define INT_MIN -0x80000000
|
||||
#define IOV_MAX 1024
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 4096
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user