pmu: implement event mapping function.

Change-Id: Iac1ec99152b17a19dba0bf1a35f07724b8abc5a1
This commit is contained in:
TOIDA,Suguru
2019-04-09 10:03:11 +09:00
parent 3e267e24cb
commit 06af2d62c6
6 changed files with 27 additions and 11 deletions

View File

@ -29,6 +29,9 @@ struct arm_pmu {
int (*get_event_idx)(int num_events, unsigned long used_mask, int (*get_event_idx)(int num_events, unsigned long used_mask,
unsigned long config); unsigned long config);
int (*map_event)(uint32_t, uint64_t); int (*map_event)(uint32_t, uint64_t);
int (*map_hw_event)(uint64_t config);
int (*map_cache_event)(uint64_t config);
int (*map_raw_event)(uint64_t config);
void (*enable_user_access_pmu_regs)(void); void (*enable_user_access_pmu_regs)(void);
void (*disable_user_access_pmu_regs)(void); void (*disable_user_access_pmu_regs)(void);
struct per_cpu_arm_pmu *per_cpu; struct per_cpu_arm_pmu *per_cpu;

View File

@ -86,18 +86,10 @@ void arm64_disable_user_access_pmu_regs(void)
cpu_pmu.disable_user_access_pmu_regs(); cpu_pmu.disable_user_access_pmu_regs();
} }
extern unsigned int *arm64_march_perfmap;
static int __ihk_mc_perfctr_init(int counter, uint32_t type, uint64_t config, int mode) static int __ihk_mc_perfctr_init(int counter, uint32_t type, uint64_t config, int mode)
{ {
int ret = -1; int ret = -1;
unsigned long config_base = 0; unsigned long config_base = 0;
int mapping;
mapping = cpu_pmu.map_event(type, config);
if (mapping < 0) {
return mapping;
}
ret = cpu_pmu.disable_counter(counter); ret = cpu_pmu.disable_counter(counter);
if (ret < 0) { if (ret < 0) {
@ -113,7 +105,7 @@ static int __ihk_mc_perfctr_init(int counter, uint32_t type, uint64_t config, in
if (ret) { if (ret) {
return ret; return ret;
} }
config_base |= (unsigned long)mapping; config_base |= config;
cpu_pmu.write_evtype(counter, config_base); cpu_pmu.write_evtype(counter, config_base);
return ret; return ret;
} }

View File

@ -363,6 +363,23 @@ static int armv8_pmuv3_map_event(uint32_t type, uint64_t config)
return __armv8_pmuv3_map_event(type, config, NULL, NULL); return __armv8_pmuv3_map_event(type, config, NULL, NULL);
} }
static int armv8_pmuv3_map_hw_event(uint64_t config)
{
return __armv8_pmuv3_map_event(PERF_TYPE_HARDWARE, config, NULL, NULL);
}
static int armv8_pmuv3_map_cache_event(uint64_t config)
{
return __armv8_pmuv3_map_event(PERF_TYPE_HW_CACHE, config, NULL, NULL);
}
static int armv8_pmuv3_map_raw_event(uint64_t config)
{
return __armv8_pmuv3_map_event(PERF_TYPE_RAW, config, NULL, NULL);
}
/* @ref.impl linux-v4.15-rc3 arch/arm64/kernel/perf_event.c */ /* @ref.impl linux-v4.15-rc3 arch/arm64/kernel/perf_event.c */
static inline uint32_t armv8pmu_pmcr_read(void) static inline uint32_t armv8pmu_pmcr_read(void)
{ {
@ -741,6 +758,9 @@ int armv8pmu_init(struct arm_pmu* cpu_pmu)
cpu_pmu->write_evtype = armv8pmu_write_evtype; cpu_pmu->write_evtype = armv8pmu_write_evtype;
cpu_pmu->get_event_idx = armv8pmu_get_event_idx; cpu_pmu->get_event_idx = armv8pmu_get_event_idx;
cpu_pmu->map_event = armv8_pmuv3_map_event; cpu_pmu->map_event = armv8_pmuv3_map_event;
cpu_pmu->map_hw_event = armv8_pmuv3_map_hw_event;
cpu_pmu->map_cache_event = armv8_pmuv3_map_cache_event;
cpu_pmu->map_raw_event = armv8_pmuv3_map_raw_event;
cpu_pmu->enable_user_access_pmu_regs = cpu_pmu->enable_user_access_pmu_regs =
armv8pmu_enable_user_access_pmu_regs; armv8pmu_enable_user_access_pmu_regs;
cpu_pmu->disable_user_access_pmu_regs = cpu_pmu->disable_user_access_pmu_regs =

2
ihk

Submodule ihk updated: 9a7bb111e7...9a15ade2ab

View File

@ -4094,7 +4094,7 @@ static int mc_perf_event_alloc(struct mc_perf_event **out,
extra_config = ihk_mc_hw_cache_extra_reg_map(attr->config); extra_config = ihk_mc_hw_cache_extra_reg_map(attr->config);
break; break;
case PERF_TYPE_RAW : case PERF_TYPE_RAW :
val = attr->config; val = ihk_mc_raw_event_map(attr->config);
break; break;
default: default:

View File

@ -86,6 +86,7 @@ unsigned long ihk_mc_get_extra_reg_event(int id);
unsigned long ihk_mc_hw_event_map(unsigned long hw_event); unsigned long ihk_mc_hw_event_map(unsigned long hw_event);
unsigned long ihk_mc_hw_cache_event_map(unsigned long hw_cache_event); unsigned long ihk_mc_hw_cache_event_map(unsigned long hw_cache_event);
unsigned long ihk_mc_hw_cache_extra_reg_map(unsigned long hw_cache_event); unsigned long ihk_mc_hw_cache_extra_reg_map(unsigned long hw_cache_event);
unsigned long ihk_mc_raw_event_map(unsigned long raw_event);
/* returns the 'prev' argument of the call that caused the switch to the context returned. */ /* returns the 'prev' argument of the call that caused the switch to the context returned. */
void *ihk_mc_switch_context(ihk_mc_kernel_context_t *old_ctx, void *ihk_mc_switch_context(ihk_mc_kernel_context_t *old_ctx,