Re: [PATCH v6 09/11] perf/tools: Enhance JSON/metric infrastructure to handle "?"
From: kajoljain <hidden>
Date: 2020-03-27 10:06:53
Also in:
linux-perf-users, lkml
On 3/24/20 6:41 PM, Jiri Olsa wrote:
On Fri, Mar 20, 2020 at 06:24:04PM +0530, Kajol Jain wrote:quoted
Patch enhances current metric infrastructure to handle "?" in the metric expression. The "?" can be use for parameters whose value not known while creating metric events and which can be replace later at runtime to the proper value. It also add flexibility to create multiple events out of single metric event added in json file. Patch adds function 'arch_get_runtimeparam' which is a arch specific function, returns the count of metric events need to be created. By default it return 1. This infrastructure needed for hv_24x7 socket/chip level events. "hv_24x7" chip level events needs specific chip-id to which the data is requested. Function 'arch_get_runtimeparam' implemented in header.c which extract number of sockets from sysfs file "sockets" under "/sys/devices/hv_24x7/interface/". With this patch basically we are trying to create as many metric events as define by runtime_param. For that one loop is added in function 'metricgroup__add_metric', which create multiple events at run time depend on return value of 'arch_get_runtimeparam' and merge that event in 'group_list'. To achieve that we are actually passing this parameter value as part of `expr__find_other` function and changing "?" present in metric expression with this value. As in our json file, there gonna be single metric event, and out of which we are creating multiple events, I am also merging this value to the original metric name to specify parameter value. For example, command:# ./perf stat -M PowerBUS_Frequency -C 0 -I 1000 # time counts unit events 1.000101867 9,356,933 hv_24x7/pm_pb_cyc,chip=0/ # 2.3 GHz PowerBUS_Frequency_0 1.000101867 9,366,134 hv_24x7/pm_pb_cyc,chip=1/ # 2.3 GHz PowerBUS_Frequency_1 2.000314878 9,365,868 hv_24x7/pm_pb_cyc,chip=0/ # 2.3 GHz PowerBUS_Frequency_0 2.000314878 9,366,092 hv_24x7/pm_pb_cyc,chip=1/ # 2.3 GHz PowerBUS_Frequency_1 So, here _0 and _1 after PowerBUS_Frequency specify parameter value. As after adding this to group_list, again we call expr__parse in 'generic_metric' function present in util/stat-display.c. By this time again we need to pass this parameter value. So, now to get this value actually I am trying to extract it from metric name itself. Because otherwise it gonna point to last updated value present in runtime_param. And gonna match for that value only.so why can't we pass that param as integer value through the metric objects? it get's created in metricgroup__add_metric_param: - as struct egroup *eg - we can add egroup::param and store the param value there then in metricgroup__setup_events it moves to: - struct metric_expr *expr - we can add metric_expr::param to keep the param then in perf_stat__print_shadow_stats there's: - struct metric_expr *mexp loop - calling generic_metric metric - we could call it with mexp::param - and pass the param to expr__parse
Hi jiri, Thanks for the suggestion, Yes it make more sense to use like that. Will update. Thanks, Kajol
jirka