NUMA: use IHK CPU and NUMA mappings for sysfs entries

This commit is contained in:
Balazs Gerofi
2016-10-13 18:55:59 +09:00
parent 167ea67dee
commit b068fde9cd
8 changed files with 182 additions and 245 deletions

View File

@@ -1766,44 +1766,6 @@ void arch_start_pvclock(void)
return; return;
} /* arch_start_pvclock() */ } /* arch_start_pvclock() */
static struct cpu_mapping *cpu_mapping = NULL;
int arch_get_cpu_mapping(struct cpu_mapping **buf, int *nelemsp)
{
int error;
size_t size;
int npages;
struct cpu_mapping *mapping;
int cpu;
struct x86_cpu_local_variables *v;
if (!cpu_mapping) {
size = sizeof(*mapping) * num_processors;
npages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
mapping = ihk_mc_alloc_pages(npages, IHK_MC_AP_NOWAIT);
if (!mapping) {
error = -ENOMEM;
ekprintf("arch_get_cpu_mapping:allocate_pages failed. %d\n", error);
goto out;
}
for (cpu = 0; cpu < num_processors; ++cpu) {
v = get_x86_cpu_local_variable(cpu);
mapping[cpu].cpu_number = cpu;
mapping[cpu].hw_id = v->apic_id;
}
cpu_mapping = mapping;
}
error = 0;
*buf = cpu_mapping;
*nelemsp = num_processors;
out:
return error;
} /* arch_get_cpu_mapping() */
#define KVM_CPUID_SIGNATURE 0x40000000 #define KVM_CPUID_SIGNATURE 0x40000000
int running_on_kvm(void) { int running_on_kvm(void) {

View File

@@ -204,7 +204,8 @@ if [ "$enable_mcoverlay" == "yes" ]; then
if [ ! -e /tmp/mcos/mcos0_proc_work ]; then mkdir -p /tmp/mcos/mcos0_proc_work; fi if [ ! -e /tmp/mcos/mcos0_proc_work ]; then mkdir -p /tmp/mcos/mcos0_proc_work; fi
if ! mount -t mcoverlay mcoverlay -o lowerdir=/proc/mcos0:/proc,upperdir=/tmp/mcos/mcos0_proc_upper,workdir=/tmp/mcos/mcos0_proc_work,nocopyupw,nofscheck /tmp/mcos/mcos0_proc; then echo "error: mount /tmp/mcos/mcos0_proc" >&2; exit 1; fi if ! mount -t mcoverlay mcoverlay -o lowerdir=/proc/mcos0:/proc,upperdir=/tmp/mcos/mcos0_proc_upper,workdir=/tmp/mcos/mcos0_proc_work,nocopyupw,nofscheck /tmp/mcos/mcos0_proc; then echo "error: mount /tmp/mcos/mcos0_proc" >&2; exit 1; fi
mount --make-rprivate /proc mount --make-rprivate /proc
while [ ! -e /sys/devices/virtual/mcos/mcos0/sys ]
while [ ! -e /sys/devices/virtual/mcos/mcos0/sys/devices/system/node ]
do do
sleep 1 sleep 1
done done
@@ -218,6 +219,20 @@ if [ "$enable_mcoverlay" == "yes" ]; then
rm -rf /tmp/mcos/mcos0_sys/devices/system/cpu/$cpuid rm -rf /tmp/mcos/mcos0_sys/devices/system/cpu/$cpuid
fi fi
done done
for nodeid in `find /sys/devices/system/node/* -maxdepth 0 -name "node[0123456789]*" -printf "%f "`; do
if [ ! -e "/sys/devices/virtual/mcos/mcos0/sys/devices/system/node/$nodeid" ]; then
rm -rf /tmp/mcos/mcos0_sys/devices/system/node/$nodeid
else
# Delete non-existent symlinks
for cpuid in `find /sys/devices/system/node/$nodeid/* -maxdepth 0 -name "cpu[0123456789]*" -printf "%f "`; do
if [ ! -e "/sys/devices/virtual/mcos/mcos0/sys/devices/system/node/$nodeid/$cpuid" ]; then
rm -f /tmp/mcos/mcos0_sys/devices/system/node/$nodeid/$cpuid
fi
done
rm -f /tmp/mcos/mcos0_sys/devices/system/node/$nodeid/memory*
fi
done
for cpuid in `find /sys/bus/cpu/devices/* -maxdepth 0 -name "cpu[0123456789]*" -printf "%f "`; do for cpuid in `find /sys/bus/cpu/devices/* -maxdepth 0 -name "cpu[0123456789]*" -printf "%f "`; do
if [ ! -e "/sys/devices/virtual/mcos/mcos0/sys/bus/cpu/devices/$cpuid" ]; then if [ ! -e "/sys/devices/virtual/mcos/mcos0/sys/bus/cpu/devices/$cpuid" ]; then
rm -rf /tmp/mcos/mcos0_sys/bus/cpu/devices/$cpuid rm -rf /tmp/mcos/mcos0_sys/bus/cpu/devices/$cpuid

View File

@@ -99,10 +99,6 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
get_vdso_info(__os, pisp->arg); get_vdso_info(__os, pisp->arg);
break; break;
case SCD_MSG_REPLY_GET_CPU_MAPPING:
reply_get_cpu_mapping(pisp->arg);
break;
default: default:
printk(KERN_ERR "mcctrl:syscall_packet_handler:" printk(KERN_ERR "mcctrl:syscall_packet_handler:"
"unknown message (%d.%d.%d.%d.%d.%#lx)\n", "unknown message (%d.%d.%d.%d.%d.%#lx)\n",
@@ -315,27 +311,32 @@ static struct ihk_ikc_listen_param listen_param2 = {
int prepare_ikc_channels(ihk_os_t os) int prepare_ikc_channels(ihk_os_t os)
{ {
struct ihk_cpu_info *info; struct mcctrl_usrdata *usrdata;
struct mcctrl_usrdata *usrdata;
int i; int i;
usrdata = kzalloc(sizeof(struct mcctrl_usrdata), GFP_KERNEL); usrdata = kzalloc(sizeof(struct mcctrl_usrdata), GFP_KERNEL);
usrdata->cpu_info = ihk_os_get_cpu_info(os);
usrdata->mem_info = ihk_os_get_memory_info(os);
if (!usrdata->cpu_info || !usrdata->mem_info) {
printk("Error: cannot obtain OS CPU and memory information.\n");
return -EINVAL;
}
usrdata->mcctrl_doorbell_va = (void *)__get_free_page(GFP_KERNEL); usrdata->mcctrl_doorbell_va = (void *)__get_free_page(GFP_KERNEL);
usrdata->mcctrl_doorbell_pa = virt_to_phys(usrdata->mcctrl_doorbell_va); usrdata->mcctrl_doorbell_pa = virt_to_phys(usrdata->mcctrl_doorbell_va);
info = ihk_os_get_cpu_info(os); if (usrdata->cpu_info->n_cpus < 1) {
if (!info) {
printk("Error: cannot retrieve CPU info.\n");
return -EINVAL;
}
if (info->n_cpus < 1) {
printk("Error: # of cpu is invalid.\n"); printk("Error: # of cpu is invalid.\n");
return -EINVAL; return -EINVAL;
} }
usrdata->num_channels = info->n_cpus + 1; usrdata->num_channels = usrdata->cpu_info->n_cpus + 1;
usrdata->channels = kzalloc(sizeof(struct mcctrl_channel) * usrdata->num_channels, usrdata->channels = kzalloc(sizeof(struct mcctrl_channel) *
GFP_KERNEL); usrdata->num_channels,
GFP_KERNEL);
if (!usrdata->channels) { if (!usrdata->channels) {
printk("Error: cannot allocate channels.\n"); printk("Error: cannot allocate channels.\n");
return -ENOMEM; return -ENOMEM;

View File

@@ -59,8 +59,8 @@
#define SCD_MSG_CLEANUP_PROCESS 0x9 #define SCD_MSG_CLEANUP_PROCESS 0x9
#define SCD_MSG_GET_VDSO_INFO 0xa #define SCD_MSG_GET_VDSO_INFO 0xa
#define SCD_MSG_GET_CPU_MAPPING 0xc //#define SCD_MSG_GET_CPU_MAPPING 0xc
#define SCD_MSG_REPLY_GET_CPU_MAPPING 0xd //#define SCD_MSG_REPLY_GET_CPU_MAPPING 0xd
#define SCD_MSG_PROCFS_CREATE 0x10 #define SCD_MSG_PROCFS_CREATE 0x10
#define SCD_MSG_PROCFS_DELETE 0x11 #define SCD_MSG_PROCFS_DELETE 0x11
@@ -226,11 +226,6 @@ static inline int sysfs_inited(struct sysfsm_data *sdp)
return !!(sdp->sysfs_buf); return !!(sdp->sysfs_buf);
} /* sysfs_inited() */ } /* sysfs_inited() */
struct cpu_mapping {
int cpu_number;
int hw_id;
};
struct cache_topology { struct cache_topology {
struct ihk_cache_topology *saved; struct ihk_cache_topology *saved;
cpumask_t shared_cpu_map; cpumask_t shared_cpu_map;
@@ -239,8 +234,9 @@ struct cache_topology {
}; };
struct cpu_topology { struct cpu_topology {
struct cpu_mapping *cpu_mapping; //struct mcctrl_usrdata *udp;
struct ihk_cpu_topology *saved; struct ihk_cpu_topology *saved;
int mckernel_cpu_id;
cpumask_t core_siblings; cpumask_t core_siblings;
cpumask_t thread_siblings; cpumask_t thread_siblings;
@@ -250,6 +246,7 @@ struct cpu_topology {
struct node_topology { struct node_topology {
struct ihk_node_topology *saved; struct ihk_node_topology *saved;
int mckernel_numa_id;
cpumask_t cpumap; cpumask_t cpumap;
struct list_head chain; struct list_head chain;
@@ -282,10 +279,8 @@ struct mcctrl_usrdata {
void **keys; void **keys;
struct sysfsm_data sysfsm_data; struct sysfsm_data sysfsm_data;
unsigned long cpu_online[CPU_LONGS]; unsigned long cpu_online[CPU_LONGS];
int cpu_mapping_elems; struct ihk_cpu_info *cpu_info;
int padding; struct ihk_mem_info *mem_info;
struct cpu_mapping *cpu_mapping;
long cpu_mapping_pa;
struct list_head cpu_topology_list; struct list_head cpu_topology_list;
struct list_head node_topology_list; struct list_head node_topology_list;
}; };

View File

@@ -18,7 +18,7 @@
#include "mcctrl.h" #include "mcctrl.h"
#include "sysfs_msg.h" #include "sysfs_msg.h"
#define dprintk(...) do { if (0) printk(KERN_DEBUG __VA_ARGS__); } while (0) #define dprintk(...) do { if (0) printk(__VA_ARGS__); } while (0)
#define wprintk(...) do { if (1) printk(KERN_WARNING __VA_ARGS__); } while (0) #define wprintk(...) do { if (1) printk(KERN_WARNING __VA_ARGS__); } while (0)
#define eprintk(...) do { if (1) printk(KERN_ERR __VA_ARGS__); } while (0) #define eprintk(...) do { if (1) printk(KERN_ERR __VA_ARGS__); } while (0)

View File

@@ -18,7 +18,7 @@
#include "mcctrl.h" #include "mcctrl.h"
#include "sysfs_msg.h" #include "sysfs_msg.h"
#define dprintk(...) do { if (0) printk(KERN_DEBUG __VA_ARGS__); } while (0) #define dprintk(...) do { if (0) printk(__VA_ARGS__); } while (0)
#define wprintk(...) do { if (1) printk(KERN_WARNING __VA_ARGS__); } while (0) #define wprintk(...) do { if (1) printk(KERN_WARNING __VA_ARGS__); } while (0)
#define eprintk(...) do { if (1) printk(KERN_ERR __VA_ARGS__); } while (0) #define eprintk(...) do { if (1) printk(KERN_ERR __VA_ARGS__); } while (0)
@@ -187,141 +187,117 @@ static void free_cpu_topology(struct mcctrl_usrdata *udp)
return; return;
} /* free_cpu_topology() */ } /* free_cpu_topology() */
static void free_cpu_mapping(struct mcctrl_usrdata *udp)
{
ihk_device_t dev = ihk_os_to_dev(udp->os);
size_t size;
size = udp->cpu_mapping_elems * sizeof(struct cpu_mapping);
ihk_device_unmap_virtual(dev, udp->cpu_mapping, size);
ihk_device_unmap_memory(dev, udp->cpu_mapping_pa, size);
return;
} /* free_cpu_mapping() */
void free_topology_info(ihk_os_t os) void free_topology_info(ihk_os_t os)
{ {
struct mcctrl_usrdata *udp = ihk_host_os_get_usrdata(os); struct mcctrl_usrdata *udp = ihk_host_os_get_usrdata(os);
free_node_topology(udp); free_node_topology(udp);
free_cpu_topology(udp); free_cpu_topology(udp);
free_cpu_mapping(udp);
return; return;
} /* free_topology_info() */ } /* free_topology_info() */
void reply_get_cpu_mapping(long req_pa) /*
* CPU and NUMA node mapping conversion functions.
*/
static int mckernel_cpu_2_linux_cpu(struct mcctrl_usrdata *udp, int cpu_id)
{ {
struct get_cpu_mapping_req *req = phys_to_virt(req_pa); return (cpu_id < udp->cpu_info->n_cpus) ?
udp->cpu_info->mapping[cpu_id] : -1;
}
req->busy = 0; static int mckernel_cpu_2_hw_id(struct mcctrl_usrdata *udp, int cpu_id)
wake_up(&req->wq);
return;
} /* reply_get_cpu_mapping() */
static int get_cpu_mapping(struct mcctrl_usrdata *udp)
{ {
int error; return (cpu_id < udp->cpu_info->n_cpus) ?
ihk_device_t dev = ihk_os_to_dev(udp->os); udp->cpu_info->hw_ids[cpu_id] : -1;
struct get_cpu_mapping_req *req = NULL; }
struct ikc_scd_packet packet;
size_t size;
dprintk("get_cpu_mapping(%p)\n", udp); static int linux_cpu_2_mckernel_cpu(struct mcctrl_usrdata *udp, int cpu_id)
req = kmalloc(sizeof(*req), GFP_KERNEL);
if (!req) {
error = -ENOMEM;
eprintk("mcctrl:get_cpu_mapping:kmalloc failed. %d\n", error);
goto out;
}
req->busy = 1;
req->error = -1;
init_waitqueue_head(&req->wq);
packet.msg = SCD_MSG_GET_CPU_MAPPING;
packet.arg = virt_to_phys(req);
#define GET_CPU_MAPPING_CPU 0
error = mcctrl_ikc_send(udp->os, GET_CPU_MAPPING_CPU, &packet);
if (error) {
eprintk("mcctrl:get_cpu_mapping:"
"mcctrl_ikc_send failed. %d\n", error);
goto out;
}
error = wait_event_interruptible(req->wq, !req->busy);
if (error) {
eprintk("mcctrl:get_cpu_mapping:"
"wait_event_interruptible failed. %d\n", error);
req = NULL; /* XXX */
goto out;
}
if (req->error) {
error = req->error;
eprintk("mcctrl:get_cpu_mapping:"
"SCD_MSG_GET_CPU_MAPPING failed. %d\n", error);
goto out;
}
size = req->buf_elems * sizeof(struct cpu_mapping);
udp->cpu_mapping_elems = req->buf_elems;
udp->cpu_mapping_pa = ihk_device_map_memory(dev, req->buf_rpa, size);
udp->cpu_mapping = ihk_device_map_virtual(
dev, udp->cpu_mapping_pa, size, NULL, 0);
error = 0;
out:
dprintk("get_cpu_mapping(%p): %d\n", udp, error);
kfree(req);
return error;
} /* get_cpu_mapping() */
static int hwid_to_cpu(struct mcctrl_usrdata *udp, int hw_id)
{ {
int i; int i;
for (i = 0; i < udp->cpu_mapping_elems; ++i) { for (i = 0; i < udp->cpu_info->n_cpus; ++i) {
if (udp->cpu_mapping[i].hw_id == hw_id) { if (udp->cpu_info->mapping[i] == cpu_id)
return udp->cpu_mapping[i].cpu_number; return i;
}
return -1;
}
#if 0
static int hw_id_2_mckernel_cpu(struct mcctrl_usrdata *udp, int hw_id)
{
int i;
for (i = 0; i < udp->cpu_info->n_cpus; ++i) {
if (udp->cpu_info->hw_ids[i] == hw_id) {
return i;
} }
} }
return -1; return -1;
} }
static int hw_id_2_linux_cpu(struct mcctrl_usrdata *udp, int hw_id)
{
int i;
for (i = 0; i < udp->cpu_info->n_cpus; ++i) {
if (udp->cpu_info->hw_ids[i] == hw_id) {
return mckernel_cpu_2_linux_cpu(udp, i);
}
}
return -1;
}
static int linux_cpu_2_hw_id(struct mcctrl_usrdata *udp, int cpu)
{
int mckernel_cpu = linux_cpu_2_mckernel_cpu(udp, cpu);
return (mckernel_cpu >= 0 && mckernel_cpu < udp->cpu_info->n_cpus) ?
udp->cpu_info->hw_ids[mckernel_cpu] : -1;
}
#endif
static int mckernel_numa_2_linux_numa(struct mcctrl_usrdata *udp, int numa_id)
{
return (numa_id < udp->mem_info->n_numa_nodes) ?
udp->mem_info->numa_mapping[numa_id] : -1;
}
static int linux_numa_2_mckernel_numa(struct mcctrl_usrdata *udp, int numa_id)
{
int i;
for (i = 0; i < udp->mem_info->n_numa_nodes; ++i) {
if (udp->mem_info->numa_mapping[i] == numa_id)
return i;
}
return -1;
}
static int translate_cpumap(struct mcctrl_usrdata *udp, static int translate_cpumap(struct mcctrl_usrdata *udp,
cpumask_t *linmap, cpumask_t *mckmap) cpumask_t *linmap, cpumask_t *mckmap)
{ {
int error; int error;
ihk_device_t dev = ihk_os_to_dev(udp->os);
int lincpu; int lincpu;
int hw_id;
int mckcpu; int mckcpu;
dprintk("translate_cpumap(%p,%p,%p)\n", udp, linmap, mckmap); dprintk("translate_cpumap(%p,%p,%p)\n", udp, linmap, mckmap);
cpumask_clear(mckmap); cpumask_clear(mckmap);
for_each_cpu(lincpu, linmap) { for_each_cpu(lincpu, linmap) {
hw_id = ihk_device_linux_cpu_to_hw_id(dev, lincpu); mckcpu = linux_cpu_2_mckernel_cpu(udp, lincpu);
if (hw_id < 0) {
error = hw_id;
eprintk("mcctrl:translate_cpumap:"
"ihk_device_linux_cpu_to_hw_id failed."
" %d\n", error);
goto out;
}
mckcpu = hwid_to_cpu(udp, hw_id);
if (mckcpu >= 0) { if (mckcpu >= 0) {
cpumask_set_cpu(mckcpu, mckmap); cpumask_set_cpu(mckcpu, mckmap);
} }
} }
error = 0; error = 0;
out:
dprintk("translate_cpumap(%p,%p,%p): %d\n", udp, linmap, mckmap, error); dprintk("translate_cpumap(%p,%p,%p): %d\n", udp, linmap, mckmap, error);
return error; return error;
} /* translate_cpumap() */ } /* translate_cpumap() */
@@ -361,7 +337,7 @@ out:
return (error)? ERR_PTR(error): topo; return (error)? ERR_PTR(error): topo;
} /* get_cache_topology() */ } /* get_cache_topology() */
static struct cpu_topology *get_cpu_topology_one(struct mcctrl_usrdata *udp, static struct cpu_topology *get_one_cpu_topology(struct mcctrl_usrdata *udp,
int index) int index)
{ {
int error; int error;
@@ -370,41 +346,43 @@ static struct cpu_topology *get_cpu_topology_one(struct mcctrl_usrdata *udp,
struct cache_topology *cache; struct cache_topology *cache;
struct ihk_cache_topology *saved_cache; struct ihk_cache_topology *saved_cache;
dprintk("get_cpu_topology_one(%p,%d)\n", udp, index); dprintk("get_one_cpu_topology(%p,%d)\n", udp, index);
topology = kmalloc(sizeof(*topology), GFP_KERNEL); topology = kmalloc(sizeof(*topology), GFP_KERNEL);
if (!topology) { if (!topology) {
error = -ENOMEM; error = -ENOMEM;
eprintk("mcctrl:get_cpu_topology_one:" eprintk("mcctrl:get_one_cpu_topology:"
"kmalloc failed. %d\n", error); "kmalloc failed. %d\n", error);
goto out; goto out;
} }
INIT_LIST_HEAD(&topology->cache_list); INIT_LIST_HEAD(&topology->cache_list);
topology->cpu_mapping = &udp->cpu_mapping[index]; topology->mckernel_cpu_id = index;
topology->saved = ihk_device_get_cpu_topology(dev,
mckernel_cpu_2_hw_id(udp, index));
topology->saved = ihk_device_get_cpu_topology(
dev, topology->cpu_mapping->hw_id);
if (IS_ERR(topology->saved)) { if (IS_ERR(topology->saved)) {
error = PTR_ERR(topology->saved); error = PTR_ERR(topology->saved);
eprintk("mcctrl:get_cpu_topology_one:" eprintk("mcctrl:get_one_cpu_topology:"
"ihk_device_get_cpu_topology failed. %d\n", "ihk_device_get_cpu_topology failed. %d\n",
error); error);
goto out; goto out;
} }
error = translate_cpumap(udp, &topology->saved->core_siblings, error = translate_cpumap(udp,
&topology->saved->core_siblings,
&topology->core_siblings); &topology->core_siblings);
if (error) { if (error) {
eprintk("mcctrl:get_cpu_topology_one:" eprintk("mcctrl:get_one_cpu_topology:"
"translate_cpumap(core_siblings) failed." "translate_cpumap(core_siblings) failed."
" %d\n", error); " %d\n", error);
goto out; goto out;
} }
error = translate_cpumap(udp, &topology->saved->thread_siblings, error = translate_cpumap(udp,
&topology->saved->thread_siblings,
&topology->thread_siblings); &topology->thread_siblings);
if (error) { if (error) {
eprintk("mcctrl:get_cpu_topology_one:" eprintk("mcctrl:get_one_cpu_topology:"
"translate_cpumap(thread_siblings) failed." "translate_cpumap(thread_siblings) failed."
" %d\n", error); " %d\n", error);
goto out; goto out;
@@ -415,7 +393,7 @@ static struct cpu_topology *get_cpu_topology_one(struct mcctrl_usrdata *udp,
cache = get_cache_topology(udp, topology, saved_cache); cache = get_cache_topology(udp, topology, saved_cache);
if (IS_ERR(cache)) { if (IS_ERR(cache)) {
error = PTR_ERR(cache); error = PTR_ERR(cache);
eprintk("mcctrl:get_cpu_topology_one:" eprintk("mcctrl:get_one_cpu_topology:"
"get_cache_topology failed. %d\n", "get_cache_topology failed. %d\n",
error); error);
goto out; goto out;
@@ -429,10 +407,10 @@ out:
if (error && !IS_ERR_OR_NULL(topology)) { if (error && !IS_ERR_OR_NULL(topology)) {
free_cpu_topology_one(udp, topology); free_cpu_topology_one(udp, topology);
} }
dprintk("get_cpu_topology_one(%p,%d): %d %p\n", dprintk("get_one_cpu_topology(%p,%d): %d %p\n",
udp, index, error, topology); udp, index, error, topology);
return (error)? ERR_PTR(error): topology; return (error)? ERR_PTR(error): topology;
} /* get_cpu_topology_one() */ } /* get_one_cpu_topology() */
static int get_cpu_topology(struct mcctrl_usrdata *udp) static int get_cpu_topology(struct mcctrl_usrdata *udp)
{ {
@@ -441,12 +419,12 @@ static int get_cpu_topology(struct mcctrl_usrdata *udp)
struct cpu_topology *topology; struct cpu_topology *topology;
dprintk("get_cpu_topology(%p)\n", udp); dprintk("get_cpu_topology(%p)\n", udp);
for (index = 0; index < udp->cpu_mapping_elems; ++index) { for (index = 0; index < udp->cpu_info->n_cpus; ++index) {
topology = get_cpu_topology_one(udp, index); topology = get_one_cpu_topology(udp, index);
if (IS_ERR(topology)) { if (IS_ERR(topology)) {
error = PTR_ERR(topology); error = PTR_ERR(topology);
eprintk("mcctrl:get_cpu_topology:" eprintk("mcctrl:get_cpu_topology: "
"get_cpu_topology_one failed. %d\n", "get_one_cpu_topology failed. %d\n",
error); error);
goto out; goto out;
} }
@@ -460,15 +438,15 @@ out:
return error; return error;
} /* get_cpu_topology() */ } /* get_cpu_topology() */
static void setup_one_cache_files(struct mcctrl_usrdata *udp, static void setup_cpu_sysfs_cache_files(struct mcctrl_usrdata *udp,
struct cpu_topology *cpu, struct cache_topology *cache) struct cpu_topology *cpu, struct cache_topology *cache)
{ {
char *prefix = "/sys/devices/system/cpu"; char *prefix = "/sys/devices/system/cpu";
int cpu_number = cpu->cpu_mapping->cpu_number; int cpu_number = cpu->mckernel_cpu_id;
int index = cache->saved->index; int index = cache->saved->index;
struct sysfsm_bitmap_param param; struct sysfsm_bitmap_param param;
dprintk("setup_one_cache_files(%p,%p,%p)\n", udp, cpu, cache); dprintk("setup_cpu_sysfs_cache_files(%p,%p,%p)\n", udp, cpu, cache);
sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_d64, sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_d64,
&cache->saved->level, 0444, &cache->saved->level, 0444,
@@ -509,19 +487,19 @@ static void setup_one_cache_files(struct mcctrl_usrdata *udp,
"%s/cpu%d/cache/index%d/shared_cpu_list", "%s/cpu%d/cache/index%d/shared_cpu_list",
prefix, cpu_number, index); prefix, cpu_number, index);
dprintk("setup_one_cache_files(%p,%p,%p):\n", udp, cpu, cache); dprintk("setup_cpu_sysfs_cache_files(%p,%p,%p):\n", udp, cpu, cache);
return; return;
} /* setup_one_cache_files() */ } /* setup_cpu_sysfs_cache_files() */
static void setup_one_cpu_files(struct mcctrl_usrdata *udp, static void setup_cpu_sysfs_files(struct mcctrl_usrdata *udp,
struct cpu_topology *cpu) struct cpu_topology *cpu)
{ {
char *prefix = "/sys/devices/system/cpu"; char *prefix = "/sys/devices/system/cpu";
int cpu_number = cpu->cpu_mapping->cpu_number; int cpu_number = cpu->mckernel_cpu_id;
struct sysfsm_bitmap_param param; struct sysfsm_bitmap_param param;
struct cache_topology *cache; struct cache_topology *cache;
dprintk("setup_one_cpu_files(%p,%p)\n", udp, cpu); dprintk("setup_cpu_sysfs_files(%p,%p)\n", udp, cpu);
sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_d32, sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_d32,
&cpu->saved->physical_package_id, 0444, &cpu->saved->physical_package_id, 0444,
@@ -553,41 +531,33 @@ static void setup_one_cpu_files(struct mcctrl_usrdata *udp,
prefix, cpu_number); prefix, cpu_number);
list_for_each_entry(cache, &cpu->cache_list, chain) { list_for_each_entry(cache, &cpu->cache_list, chain) {
setup_one_cache_files(udp, cpu, cache); setup_cpu_sysfs_cache_files(udp, cpu, cache);
} }
dprintk("setup_one_cpu_files(%p,%p):\n", udp, cpu); dprintk("setup_cpu_sysfs_files(%p,%p):\n", udp, cpu);
return; return;
} /* setup_one_cpu_files() */ } /* setup_cpu_sysfs_files() */
static void setup_cpu_files(struct mcctrl_usrdata *udp) static void setup_cpus_sysfs_files(struct mcctrl_usrdata *udp)
{ {
int error; int error;
struct cpu_topology *cpu; struct cpu_topology *cpu;
dprintk("setup_cpu_file(%p)\n", udp);
error = get_cpu_mapping(udp);
if (error) {
eprintk("mcctrl:setup_cpu_files:"
"get_cpu_mapping failed. %d\n", error);
goto out;
}
error = get_cpu_topology(udp); error = get_cpu_topology(udp);
if (error) { if (error) {
eprintk("mcctrl:setup_cpu_files:" eprintk("mcctrl:setup_cpus_sysfs_files:"
"get_cpu_topology failed. %d\n", error); "get_cpu_topology failed. %d\n", error);
goto out; goto out;
} }
list_for_each_entry(cpu, &udp->cpu_topology_list, chain) { list_for_each_entry(cpu, &udp->cpu_topology_list, chain) {
setup_one_cpu_files(udp, cpu); setup_cpu_sysfs_files(udp, cpu);
} }
error = 0; error = 0;
out: out:
dprintk("setup_cpu_file(%p):\n", udp); dprintk("setup_cpu_file(%p):\n", udp);
return; return;
} /* setup_cpu_files() */ } /* setup_cpus_sysfs_files() */
static struct node_topology *get_one_node_topology(struct mcctrl_usrdata *udp, static struct node_topology *get_one_node_topology(struct mcctrl_usrdata *udp,
struct ihk_node_topology *saved) struct ihk_node_topology *saved)
@@ -629,8 +599,10 @@ static int get_node_topology(struct mcctrl_usrdata *udp)
struct node_topology *topology; struct node_topology *topology;
dprintk("get_node_topology(%p)\n", udp); dprintk("get_node_topology(%p)\n", udp);
for (node = 0; ; ++node) { for (node = 0; node < udp->mem_info->n_numa_nodes; ++node) {
saved = ihk_device_get_node_topology(dev, node); saved = ihk_device_get_node_topology(dev,
mckernel_numa_2_linux_numa(udp, node));
if (IS_ERR(saved)) { if (IS_ERR(saved)) {
break; break;
} }
@@ -647,6 +619,8 @@ static int get_node_topology(struct mcctrl_usrdata *udp)
goto out; goto out;
} }
topology->mckernel_numa_id = node;
list_add(&topology->chain, &udp->node_topology_list); list_add(&topology->chain, &udp->node_topology_list);
} }
@@ -671,15 +645,39 @@ static int setup_node_files(struct mcctrl_usrdata *udp)
} }
list_for_each_entry(p, &udp->node_topology_list, chain) { list_for_each_entry(p, &udp->node_topology_list, chain) {
struct sysfs_handle handle;
int cpu;
param.nbits = nr_cpumask_bits; param.nbits = nr_cpumask_bits;
param.ptr = &p->cpumap; param.ptr = &p->cpumap;
sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_pb, &param, 0444, sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_pb, &param, 0444,
"/sys/devices/system/node/node%d/cpumap", "/sys/devices/system/node/node%d/cpumap",
p->saved->node_number); p->mckernel_numa_id);
sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_pbl, &param, 0444, sysfsm_createf(udp->os, SYSFS_SNOOPING_OPS_pbl, &param, 0444,
"/sys/devices/system/node/node%d/cpulist", "/sys/devices/system/node/node%d/cpulist",
p->saved->node_number); p->mckernel_numa_id);
/* Add CPU symlinks for this node */
for (cpu = 0; cpu < udp->cpu_info->n_cpus; ++cpu) {
if (linux_numa_2_mckernel_numa(udp,
cpu_to_node(mckernel_cpu_2_linux_cpu(udp, cpu)))
!= p->mckernel_numa_id) {
continue;
}
error = sysfsm_lookupf(udp->os, &handle,
"/sys/devices/system/cpu/cpu%d", cpu);
if (error) {
panic("sysfsm_lookupf(CPU in node)");
}
error = sysfsm_symlinkf(udp->os, handle,
"/sys/devices/system/node/node%d/cpu%d",
p->mckernel_numa_id, cpu);
if (error) {
panic("sysfsm_symlinkf(CPU in node)");
}
}
} }
error = 0; error = 0;
@@ -1026,9 +1024,9 @@ void setup_sysfs_files(ihk_os_t os)
panic("sysfsm_unlinkf"); panic("sysfsm_unlinkf");
} }
setup_local_snooping_samples(os); //setup_local_snooping_samples(os);
setup_local_snooping_files(os); setup_local_snooping_files(os);
setup_cpu_files(udp); setup_cpus_sysfs_files(udp);
setup_node_files(udp); setup_node_files(udp);
setup_pci_files(udp); setup_pci_files(udp);

View File

@@ -534,31 +534,6 @@ extern void process_procfs_request(unsigned long rarg);
extern void terminate_host(int pid); extern void terminate_host(int pid);
extern void debug_log(long); extern void debug_log(long);
static void req_get_cpu_mapping(long req_rpa)
{
size_t mapsize;
size_t size;
int npages;
long phys;
struct get_cpu_mapping_req *req;
struct cpu_mapping *buf;
size = sizeof(*req);
mapsize = size + (req_rpa & (PAGE_SIZE - 1));
npages = (mapsize + PAGE_SIZE - 1) >> PAGE_SHIFT;
phys = ihk_mc_map_memory(NULL, req_rpa, size);
req = ihk_mc_map_virtual(phys, npages, PTATTR_WRITABLE);
req->error = arch_get_cpu_mapping(&buf, &req->buf_elems);
if (!req->error) {
req->buf_rpa = virt_to_phys(buf);
}
ihk_mc_unmap_virtual(req, npages, 0);
ihk_mc_unmap_memory(NULL, phys, size);
return;
} /* req_get_cpu_mapping() */
static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
void *__packet, void *ihk_os) void *__packet, void *ihk_os)
{ {
@@ -687,15 +662,6 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
ret = 0; ret = 0;
break; break;
case SCD_MSG_GET_CPU_MAPPING:
req_get_cpu_mapping(packet->arg);
pckt.msg = SCD_MSG_REPLY_GET_CPU_MAPPING;
pckt.arg = packet->arg;
syscall_channel_send(c, &pckt);
ret = 0;
break;
default: default:
kprintf("syscall_pakcet_handler:unknown message " kprintf("syscall_pakcet_handler:unknown message "
"(%d.%d.%d.%d.%d.%#lx)\n", "(%d.%d.%d.%d.%d.%#lx)\n",

View File

@@ -320,7 +320,7 @@ static void setup_remote_snooping_samples(void)
static void populate_sysfs(void) static void populate_sysfs(void)
{ {
cpu_sysfs_setup(); cpu_sysfs_setup();
setup_remote_snooping_samples(); //setup_remote_snooping_samples();
} /* populate_sysfs() */ } /* populate_sysfs() */
int host_ikc_inited = 0; int host_ikc_inited = 0;