diff --git a/executer/kernel/mcctrl/mcctrl.h b/executer/kernel/mcctrl/mcctrl.h index b96539d3..11d1b161 100644 --- a/executer/kernel/mcctrl/mcctrl.h +++ b/executer/kernel/mcctrl/mcctrl.h @@ -243,9 +243,12 @@ struct cpu_topology { struct list_head cache_list; }; +#define NODE_DISTANCE_S_SIZE 1024 + struct node_topology { struct ihk_node_topology *saved; int mckernel_numa_id; + char mckernel_numa_distance_s[NODE_DISTANCE_S_SIZE]; cpumask_t cpumap; struct list_head chain; diff --git a/executer/kernel/mcctrl/sysfs_files.c b/executer/kernel/mcctrl/sysfs_files.c index 6239f74f..dbc4de10 100644 --- a/executer/kernel/mcctrl/sysfs_files.c +++ b/executer/kernel/mcctrl/sysfs_files.c @@ -680,9 +680,31 @@ static int setup_node_files(struct mcctrl_usrdata *udp) list_for_each_entry(p, &udp->node_topology_list, chain) { struct sysfs_handle handle; int cpu; + int node; + size_t offset = 0; param.nbits = nr_cpumask_bits; param.ptr = &p->cpumap; + for (node = 0; node < udp->mem_info->n_numa_nodes; ++node) { + if (node > 0) { + offset += snprintf(&p->mckernel_numa_distance_s[offset], + NODE_DISTANCE_S_SIZE - offset, "%s", " "); + } + offset += snprintf(&p->mckernel_numa_distance_s[offset], + NODE_DISTANCE_S_SIZE - offset, "%d", + node_distance( + mckernel_numa_2_linux_numa(udp, p->mckernel_numa_id), + mckernel_numa_2_linux_numa(udp, node) + )); + } + offset += snprintf(&p->mckernel_numa_distance_s[offset], + NODE_DISTANCE_S_SIZE - offset, "%s", "\n"); + + sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_s, + p->mckernel_numa_distance_s, 0444, + "/sys/devices/system/node/node%d/distance", + p->mckernel_numa_id); + sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_pb, ¶m, 0444, "/sys/devices/system/node/node%d/cpumap", p->mckernel_numa_id); diff --git a/lib/include/ihk/mm.h b/lib/include/ihk/mm.h index 4df658df..c8e7c39e 100644 --- a/lib/include/ihk/mm.h +++ b/lib/include/ihk/mm.h @@ -171,6 +171,7 @@ uint64_t ihk_mc_pt_virt_to_pagemap(struct page_table *pt, unsigned long virt); int ihk_mc_get_nr_numa_nodes(void); struct smp_coreset; int ihk_mc_get_numa_node(int id, int *linux_numa_id, int *type); +int ihk_mc_get_numa_distance(int i, int j); int ihk_mc_get_nr_memory_chunks(void); int ihk_mc_get_memory_chunk(int id, unsigned long *start,