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 sched_init(void);
|
||||||
extern void pc_ap_init(void);
|
extern void pc_ap_init(void);
|
||||||
extern void cpu_sysfs_setup(void);
|
extern void cpu_sysfs_setup(void);
|
||||||
|
extern void numa_sysfs_setup(void);
|
||||||
extern void rusage_sysfs_setup(void);
|
extern void rusage_sysfs_setup(void);
|
||||||
extern void status_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)
|
static void populate_sysfs(void)
|
||||||
{
|
{
|
||||||
cpu_sysfs_setup();
|
cpu_sysfs_setup();
|
||||||
|
numa_sysfs_setup();
|
||||||
#ifdef ENABLE_RUSAGE
|
#ifdef ENABLE_RUSAGE
|
||||||
rusage_sysfs_setup();
|
rusage_sysfs_setup();
|
||||||
status_sysfs_setup();
|
status_sysfs_setup();
|
||||||
|
|||||||
43
kernel/mem.c
43
kernel/mem.c
@@ -40,6 +40,8 @@
|
|||||||
#include <rusage.h>
|
#include <rusage.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
#include <profile.h>
|
#include <profile.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sysfs.h>
|
||||||
|
|
||||||
//#define DEBUG_PRINT_MEM
|
//#define DEBUG_PRINT_MEM
|
||||||
|
|
||||||
@@ -1147,6 +1149,7 @@ static void numa_init(void)
|
|||||||
mcs_lock_init(&memory_nodes[i].lock);
|
mcs_lock_init(&memory_nodes[i].lock);
|
||||||
memory_nodes[i].min_addr = 0xFFFFFFFFFFFFFFFF;
|
memory_nodes[i].min_addr = 0xFFFFFFFFFFFFFFFF;
|
||||||
memory_nodes[i].max_addr = 0;
|
memory_nodes[i].max_addr = 0;
|
||||||
|
memory_nodes[i].nr_pages = 0;
|
||||||
memory_nodes[i].nr_free_pages = 0;
|
memory_nodes[i].nr_free_pages = 0;
|
||||||
#endif
|
#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_SHIFT (10)
|
||||||
#define PHYS_PAGE_HASH_SIZE (1 << PHYS_PAGE_HASH_SHIFT)
|
#define PHYS_PAGE_HASH_SIZE (1 << PHYS_PAGE_HASH_SHIFT)
|
||||||
#define PHYS_PAGE_HASH_MASK (PHYS_PAGE_HASH_SIZE - 1)
|
#define PHYS_PAGE_HASH_MASK (PHYS_PAGE_HASH_SIZE - 1)
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ struct ihk_mc_numa_node {
|
|||||||
struct rb_root free_chunks;
|
struct rb_root free_chunks;
|
||||||
mcs_lock_node_t lock;
|
mcs_lock_node_t lock;
|
||||||
|
|
||||||
|
unsigned long nr_pages;
|
||||||
unsigned long nr_free_pages;
|
unsigned long nr_free_pages;
|
||||||
unsigned long min_addr;
|
unsigned long min_addr;
|
||||||
unsigned long max_addr;
|
unsigned long max_addr;
|
||||||
|
|||||||
@@ -17,4 +17,8 @@
|
|||||||
#define INT_MIN -0x80000000
|
#define INT_MIN -0x80000000
|
||||||
#define IOV_MAX 1024
|
#define IOV_MAX 1024
|
||||||
|
|
||||||
|
#ifndef PATH_MAX
|
||||||
|
#define PATH_MAX 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -595,6 +595,7 @@ int ihk_numa_add_free_pages(struct ihk_mc_numa_node *node,
|
|||||||
if (addr + size > node->max_addr)
|
if (addr + size > node->max_addr)
|
||||||
node->max_addr = addr + size;
|
node->max_addr = addr + size;
|
||||||
|
|
||||||
|
node->nr_pages += (size >> PAGE_SHIFT);
|
||||||
node->nr_free_pages += (size >> PAGE_SHIFT);
|
node->nr_free_pages += (size >> PAGE_SHIFT);
|
||||||
dkprintf("%s: added free pages 0x%lx:%lu\n",
|
dkprintf("%s: added free pages 0x%lx:%lu\n",
|
||||||
__FUNCTION__, addr, size);
|
__FUNCTION__, addr, size);
|
||||||
|
|||||||
Reference in New Issue
Block a user