ihk_os_getrusage(): Compile LWK-specific results in mcctrl
1. User asks mcctrl for the result via ihk_os_getrusage() with passing void * 2. mcctrl compiles the results and passes them to the user 3. User interprets it by using the type defined in the LWK-specific header
This commit is contained in:
@ -4,6 +4,7 @@ ARCH ?= @ARCH@
|
||||
src = @abs_srcdir@
|
||||
KMODDIR=@KMODDIR@
|
||||
BINDIR=@BINDIR@
|
||||
INCLUDEDIR=@INCLUDEDIR@
|
||||
IHK_BASE=$(src)/../../../../ihk
|
||||
|
||||
obj-m += mcctrl.o
|
||||
@ -13,7 +14,7 @@ obj-m += mcctrl.o
|
||||
ifeq ($(ARCH), arm64)
|
||||
ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) -I$(IHK_BASE)/include -I$(IHK_BASE)/include/arch/$(ARCH) -I$(src)/../../include -I$(src)/arch/$(ARCH)/include -DMCEXEC_PATH=\"$(BINDIR)/mcexec\" -I@abs_builddir@
|
||||
else
|
||||
ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) -I$(IHK_BASE)/include -I$(IHK_BASE)/include/arch/$(ARCH) -I$(src)/../../include -mcmodel=kernel -mno-red-zone -DMCEXEC_PATH=\"$(BINDIR)/mcexec\" -I@abs_builddir@
|
||||
ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) -I$(IHK_BASE)/include -I$(IHK_BASE)/include/arch/$(ARCH) -I$(src)/../../../kernel/include -I$(src)/../../include -mcmodel=kernel -mno-red-zone -DMCEXEC_PATH=\"$(BINDIR)/mcexec\" -I@abs_builddir@ -I@abs_builddir@/../../../
|
||||
endif
|
||||
|
||||
mcctrl-y := driver.o control.o ikc.o syscall.o procfs.o binfmt_mcexec.o
|
||||
@ -37,3 +38,5 @@ clean:
|
||||
install:
|
||||
mkdir -p -m 755 $(KMODDIR)
|
||||
install -m 644 mcctrl.ko $(KMODDIR)
|
||||
mkdir -p -m 755 $(INCLUDEDIR)/mckernel
|
||||
install -m 644 $(src)/../../include/ihklib_rusage.h $(INCLUDEDIR)/mckernel/ihklib_rusage.h
|
||||
|
||||
@ -45,6 +45,8 @@
|
||||
#include "../../../config.h"
|
||||
#include "mcctrl.h"
|
||||
#include <ihk/ihk_host_user.h>
|
||||
#include <rusage.h>
|
||||
#include <ihklib_rusage.h>
|
||||
|
||||
//#define DEBUG
|
||||
|
||||
@ -2194,6 +2196,77 @@ void mcctrl_perf_ack(ihk_os_t os, struct ikc_scd_packet *packet)
|
||||
|
||||
}
|
||||
|
||||
/* Compose LWK-specific rusage structure */
|
||||
long mcctrl_getrusage(ihk_os_t ihk_os, struct getrusage_desc *__user _desc)
|
||||
{
|
||||
struct getrusage_desc desc;
|
||||
struct rusage_global *rusage_global = ihk_os_get_rusage(ihk_os);
|
||||
struct mckernel_rusage *rusage = NULL;
|
||||
int ret = 0;
|
||||
int i;
|
||||
unsigned long ut;
|
||||
unsigned long st;
|
||||
|
||||
ret = copy_from_user(&desc, _desc, sizeof(struct getrusage_desc));
|
||||
if (ret != 0) {
|
||||
printk("%s: copy_from_user failed\n", __FUNCTION__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rusage = kmalloc(sizeof(struct mckernel_rusage), GFP_KERNEL);
|
||||
if (!rusage) {
|
||||
printk("%s: kmalloc failed\n", __FUNCTION__);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memset(rusage, 0, sizeof(struct mckernel_rusage));
|
||||
|
||||
/* Compile statistics */
|
||||
for (i = 0; i < IHK_MAX_NUM_PGSIZES; i++) {
|
||||
rusage->memory_stat_rss[i] = rusage_global->memory_stat_rss[i];
|
||||
rusage->memory_stat_mapped_file[i] = rusage_global->memory_stat_mapped_file[i];
|
||||
}
|
||||
rusage->memory_max_usage = rusage_global->memory_max_usage;
|
||||
rusage->memory_kmem_usage = rusage_global->memory_kmem_usage;
|
||||
rusage->memory_kmem_max_usage = rusage_global->memory_kmem_max_usage;
|
||||
for (i = 0; i < rusage_global->num_numa_nodes; i++) {
|
||||
rusage->memory_numa_stat[i] = rusage_global->memory_numa_stat[i];
|
||||
}
|
||||
for (ut = 0, st = 0, i = 0; i < rusage_global->num_processors; i++) {
|
||||
unsigned long wt;
|
||||
|
||||
wt = rusage_global->cpu[i].user_tsc * rusage_global->ns_per_tsc / 1000;
|
||||
ut += wt;
|
||||
st += rusage_global->cpu[i].system_tsc * rusage_global->ns_per_tsc / 1000;
|
||||
rusage->cpuacct_usage_percpu[i] = wt;
|
||||
}
|
||||
rusage->cpuacct_stat_system = st / 10000000;
|
||||
rusage->cpuacct_stat_user = ut / 10000000;
|
||||
rusage->cpuacct_usage = ut;
|
||||
|
||||
rusage->num_threads = rusage_global->num_threads;
|
||||
rusage->max_num_threads = rusage_global->max_num_threads;
|
||||
|
||||
if (desc.size_rusage > sizeof(struct mckernel_rusage)) {
|
||||
printk("%s: desc.size_rusage=%ld > sizeof(struct mckernel_rusage)=%ld\n", __FUNCTION__, desc.size_rusage, sizeof(struct mckernel_rusage));
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = copy_to_user(desc.rusage, rusage, desc.size_rusage);
|
||||
if (ret != 0) {
|
||||
printk("%s: copy_to_user failed\n", __FUNCTION__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
if (rusage) {
|
||||
kfree(rusage);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
extern void *get_user_sp(void);
|
||||
extern void set_user_sp(unsigned long);
|
||||
extern void restore_fs(unsigned long fs);
|
||||
@ -2797,6 +2870,9 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
|
||||
case IHK_OS_AUX_PERF_DESTROY:
|
||||
return mcctrl_perf_destroy(os);
|
||||
|
||||
case IHK_OS_GETRUSAGE:
|
||||
return mcctrl_getrusage(os, (struct getrusage_desc *)arg);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -97,6 +97,7 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
||||
{ .request = IHK_OS_AUX_PERF_ENABLE, .func = mcctrl_ioctl },
|
||||
{ .request = IHK_OS_AUX_PERF_DISABLE, .func = mcctrl_ioctl },
|
||||
{ .request = IHK_OS_AUX_PERF_DESTROY, .func = mcctrl_ioctl },
|
||||
{ .request = IHK_OS_GETRUSAGE, .func = mcctrl_ioctl },
|
||||
};
|
||||
|
||||
static struct ihk_os_kernel_call_handler mcctrl_kernel_handlers = {
|
||||
|
||||
@ -490,4 +490,9 @@ struct ihk_perf_event_attr{
|
||||
unsigned exclude_idle:1;
|
||||
};
|
||||
|
||||
struct getrusage_desc {
|
||||
void* rusage;
|
||||
size_t size_rusage;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user