From fd8bed670ef88120f5a8540a300939ee105e3b39 Mon Sep 17 00:00:00 2001 From: "Shiratori, Takehiro" Date: Tue, 16 Oct 2018 17:15:43 +0900 Subject: [PATCH] ihk_os_setperfevent: Return number of registered events In addition to that, mcctrl_perf_set is modified so that it updates usrdata->perf_event_num with number of registered events. Change-Id: I3f343176f55b06d3baab0b0fe34e240f39706cf6 Fujitsu: POSTK_DEBUG_TEMP_FIX_80 --- executer/include/uprotocol.h | 1 + executer/kernel/mcctrl/control.c | 42 ++++++++++++++++++++++++++++---- kernel/host.c | 22 +++++++++++------ kernel/include/syscall.h | 1 + 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/executer/include/uprotocol.h b/executer/include/uprotocol.h index e0ef63e1..d2b44310 100644 --- a/executer/include/uprotocol.h +++ b/executer/include/uprotocol.h @@ -277,6 +277,7 @@ enum perf_ctrl_type { struct perf_ctrl_desc { enum perf_ctrl_type ctrl_type; + int err; union { /* for SET, GET */ struct { diff --git a/executer/kernel/mcctrl/control.c b/executer/kernel/mcctrl/control.c index 148dd052..956935bd 100644 --- a/executer/kernel/mcctrl/control.c +++ b/executer/kernel/mcctrl/control.c @@ -2125,6 +2125,9 @@ struct mcctrl_perf_ctrl_desc { #define wakeup_desc_of_perf_desc(_desc) \ (&container_of((_desc), struct mcctrl_perf_ctrl_desc, desc)->wakeup) +/* Note that usrdata->perf_event_num is updated with # of registered + * events + */ long mcctrl_perf_set(ihk_os_t os, struct ihk_perf_event_attr *__user arg) { struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os); @@ -2135,6 +2138,8 @@ long mcctrl_perf_set(ihk_os_t os, struct ihk_perf_event_attr *__user arg) int ret = 0; int i = 0, j = 0; int need_free; + int num_registered = 0; + int err = 0; for (i = 0; i < usrdata->perf_event_num; i++) { ret = copy_from_user(&attr, &arg[i], @@ -2153,6 +2158,7 @@ long mcctrl_perf_set(ihk_os_t os, struct ihk_perf_event_attr *__user arg) memset(perf_desc, '\0', sizeof(struct perf_ctrl_desc)); perf_desc->ctrl_type = PERF_CTRL_SET; + perf_desc->err = 0; perf_desc->target_cntr = i; perf_desc->config = attr.config; perf_desc->exclude_kernel = attr.exclude_kernel; @@ -2174,12 +2180,22 @@ long mcctrl_perf_set(ihk_os_t os, struct ihk_perf_event_attr *__user arg) kfree(perf_desc); return ret; } + + err = perf_desc->err; + if (err != 0) { + break; + } } + if (err == 0) { + num_registered++; + } kfree(perf_desc); } - return usrdata->perf_event_num; + usrdata->perf_event_num = num_registered; + + return num_registered; } long mcctrl_perf_get(ihk_os_t os, unsigned long *__user arg) @@ -2202,6 +2218,7 @@ long mcctrl_perf_get(ihk_os_t os, unsigned long *__user arg) memset(perf_desc, '\0', sizeof(struct perf_ctrl_desc)); perf_desc->ctrl_type = PERF_CTRL_GET; + perf_desc->err = 0; perf_desc->target_cntr = i; memset(&isp, '\0', sizeof(struct ikc_scd_packet)); @@ -2221,7 +2238,9 @@ long mcctrl_perf_get(ihk_os_t os, unsigned long *__user arg) return ret; } - value_sum += perf_desc->read_value; + if (perf_desc->err == 0) { + value_sum += perf_desc->read_value; + } } kfree(perf_desc); if (copy_to_user(&arg[i], &value_sum, sizeof(unsigned long))) { @@ -2241,7 +2260,7 @@ long mcctrl_perf_enable(ihk_os_t os) struct ikc_scd_packet isp; struct perf_ctrl_desc *perf_desc; struct ihk_cpu_info *info = ihk_os_get_cpu_info(os); - unsigned int cntr_mask = 0; + unsigned long cntr_mask = 0; int ret = 0; int i = 0, j = 0; int need_free; @@ -2256,6 +2275,7 @@ long mcctrl_perf_enable(ihk_os_t os) memset(perf_desc, '\0', sizeof(struct perf_ctrl_desc)); perf_desc->ctrl_type = PERF_CTRL_ENABLE; + perf_desc->err = 0; perf_desc->target_cntr_mask = cntr_mask; memset(&isp, '\0', sizeof(struct ikc_scd_packet)); @@ -2275,6 +2295,12 @@ long mcctrl_perf_enable(ihk_os_t os) return -EINVAL; } + if (perf_desc->err < 0) { + ret = perf_desc->err; + kfree(perf_desc); + return ret; + } + } kfree(perf_desc); @@ -2287,13 +2313,13 @@ long mcctrl_perf_disable(ihk_os_t os) struct ikc_scd_packet isp; struct perf_ctrl_desc *perf_desc; struct ihk_cpu_info *info = ihk_os_get_cpu_info(os); - unsigned int cntr_mask = 0; + unsigned long cntr_mask = 0; int ret = 0; int i = 0, j = 0; int need_free; for (i = 0; i < usrdata->perf_event_num; i++) { - cntr_mask |= 1 << i; + cntr_mask |= 1UL << i; } perf_desc = kmalloc(sizeof(struct mcctrl_perf_ctrl_desc), GFP_KERNEL); if (!perf_desc) { @@ -2302,6 +2328,7 @@ long mcctrl_perf_disable(ihk_os_t os) memset(perf_desc, '\0', sizeof(struct perf_ctrl_desc)); perf_desc->ctrl_type = PERF_CTRL_DISABLE; + perf_desc->err = 0; perf_desc->target_cntr_mask = cntr_mask; memset(&isp, '\0', sizeof(struct ikc_scd_packet)); @@ -2320,6 +2347,11 @@ long mcctrl_perf_disable(ihk_os_t os) return -EINVAL; } + if (perf_desc->err < 0) { + ret = perf_desc->err; + kfree(perf_desc); + return ret; + } } kfree(perf_desc); diff --git a/kernel/host.c b/kernel/host.c index 65aec685..adad70bc 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -711,17 +711,26 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, if (!pcd->exclude_user) { mode |= PERFCTR_USER_MODE; } - ihk_mc_perfctr_init_raw(pcd->target_cntr, pcd->config, mode); - ihk_mc_perfctr_stop(1 << pcd->target_cntr); - ihk_mc_perfctr_reset(pcd->target_cntr); + + ret = ihk_mc_perfctr_init_raw(pcd->target_cntr, pcd->config, mode); + if (ret != 0) { + break; + } + + ret = ihk_mc_perfctr_stop(1 << pcd->target_cntr); + if (ret != 0) { + break; + } + + ret = ihk_mc_perfctr_reset(pcd->target_cntr); break; case PERF_CTRL_ENABLE: - ihk_mc_perfctr_start(pcd->target_cntr_mask); + ret = ihk_mc_perfctr_start(pcd->target_cntr_mask); break; case PERF_CTRL_DISABLE: - ihk_mc_perfctr_stop(pcd->target_cntr_mask); + ret = ihk_mc_perfctr_stop(pcd->target_cntr_mask); break; case PERF_CTRL_GET: @@ -736,12 +745,11 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, ihk_mc_unmap_memory(NULL, pp, sizeof(struct perf_ctrl_desc)); pckt.msg = SCD_MSG_PERF_ACK; - pckt.err = 0; + pckt.err = ret; pckt.arg = packet->arg; pckt.reply = packet->reply; ihk_ikc_send(resp_channel, &pckt, 0); - ret = 0; break; case SCD_MSG_CPU_RW_REG: diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index 7ddef9b1..77a1e639 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -533,6 +533,7 @@ enum perf_ctrl_type { struct perf_ctrl_desc { enum perf_ctrl_type ctrl_type; + int err; union { /* for SET, GET */ struct {