Commit 90053634 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

perf pmu-events: Make the metric_constraint an enum

Rename metric_constraint to event_grouping to better explain what the
variable is used for. Switch to use an enum for encoding instead of a
string. Rather than just no constraint/grouping information or
"NO_NMI_WATCHDOG", have 4 enum values. The values encode whether to
group or not, and two cases where the behavior is dependent on either
the NMI watchdog being enabled or SMT being enabled.
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Eduard Zingerman <eddyz87@gmail.com>
Cc: Florian Fischer <florian.fischer@muhq.space>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Sandipan Das <sandipan.das@amd.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-stm32@st-md-mailman.stormreply.com
Link: https://lore.kernel.org/r/20230219092848.639226-9-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 207f7df7
...@@ -51,8 +51,8 @@ _json_event_attributes = [ ...@@ -51,8 +51,8 @@ _json_event_attributes = [
# Attributes that are in pmu_metric rather than pmu_event. # Attributes that are in pmu_metric rather than pmu_event.
_json_metric_attributes = [ _json_metric_attributes = [
'metric_name', 'metric_group', 'metric_constraint', 'metric_expr', 'desc', 'metric_name', 'metric_group', 'metric_expr', 'desc',
'long_desc', 'unit', 'compat', 'aggr_mode' 'long_desc', 'unit', 'compat', 'aggr_mode', 'event_grouping'
] ]
def removesuffix(s: str, suffix: str) -> str: def removesuffix(s: str, suffix: str) -> str:
...@@ -204,6 +204,18 @@ class JsonEvent: ...@@ -204,6 +204,18 @@ class JsonEvent:
} }
return aggr_mode_to_enum[aggr_mode] return aggr_mode_to_enum[aggr_mode]
def convert_metric_constraint(metric_constraint: str) -> Optional[str]:
"""Returns the metric_event_groups enum value associated with the JSON string."""
if not metric_constraint:
return None
metric_constraint_to_enum = {
'NO_GROUP_EVENTS': '1',
'NO_GROUP_EVENTS_NMI': '2',
'NO_NMI_WATCHDOG': '2',
'NO_GROUP_EVENTS_SMT': '3',
}
return metric_constraint_to_enum[metric_constraint]
def lookup_msr(num: str) -> Optional[str]: def lookup_msr(num: str) -> Optional[str]:
"""Converts the msr number, or first in a list to the appropriate event field.""" """Converts the msr number, or first in a list to the appropriate event field."""
if not num: if not num:
...@@ -288,7 +300,7 @@ class JsonEvent: ...@@ -288,7 +300,7 @@ class JsonEvent:
self.deprecated = jd.get('Deprecated') self.deprecated = jd.get('Deprecated')
self.metric_name = jd.get('MetricName') self.metric_name = jd.get('MetricName')
self.metric_group = jd.get('MetricGroup') self.metric_group = jd.get('MetricGroup')
self.metric_constraint = jd.get('MetricConstraint') self.event_grouping = convert_metric_constraint(jd.get('MetricConstraint'))
self.metric_expr = None self.metric_expr = None
if 'MetricExpr' in jd: if 'MetricExpr' in jd:
self.metric_expr = metric.ParsePerfJson(jd['MetricExpr']).Simplify() self.metric_expr = metric.ParsePerfJson(jd['MetricExpr']).Simplify()
...@@ -678,7 +690,7 @@ static void decompress_event(int offset, struct pmu_event *pe) ...@@ -678,7 +690,7 @@ static void decompress_event(int offset, struct pmu_event *pe)
{ {
\tconst char *p = &big_c_string[offset]; \tconst char *p = &big_c_string[offset];
""") """)
enum_attributes = ['aggr_mode', 'deprecated', 'perpkg'] enum_attributes = ['aggr_mode', 'deprecated', 'event_grouping', 'perpkg']
for attr in _json_event_attributes: for attr in _json_event_attributes:
_args.output_file.write(f'\n\tpe->{attr} = ') _args.output_file.write(f'\n\tpe->{attr} = ')
if attr in enum_attributes: if attr in enum_attributes:
......
...@@ -11,6 +11,29 @@ enum aggr_mode_class { ...@@ -11,6 +11,29 @@ enum aggr_mode_class {
PerCore PerCore
}; };
/**
* enum metric_event_groups - How events within a pmu_metric should be grouped.
*/
enum metric_event_groups {
/**
* @MetricGroupEvents: Default, group events within the metric.
*/
MetricGroupEvents = 0,
/**
* @MetricNoGroupEvents: Don't group events for the metric.
*/
MetricNoGroupEvents = 1,
/**
* @MetricNoGroupEventsNmi: Don't group events for the metric if the NMI
* watchdog is enabled.
*/
MetricNoGroupEventsNmi = 2,
/**
* @MetricNoGroupEventsSmt: Don't group events for the metric if SMT is
* enabled.
*/
MetricNoGroupEventsSmt = 3,
};
/* /*
* Describe each PMU event. Each CPU has a table of PMU events. * Describe each PMU event. Each CPU has a table of PMU events.
*/ */
...@@ -33,10 +56,10 @@ struct pmu_metric { ...@@ -33,10 +56,10 @@ struct pmu_metric {
const char *metric_expr; const char *metric_expr;
const char *unit; const char *unit;
const char *compat; const char *compat;
const char *metric_constraint;
const char *desc; const char *desc;
const char *long_desc; const char *long_desc;
enum aggr_mode_class aggr_mode; enum aggr_mode_class aggr_mode;
enum metric_event_groups event_grouping;
}; };
struct pmu_events_table; struct pmu_events_table;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "pmu.h" #include "pmu.h"
#include "pmu-hybrid.h" #include "pmu-hybrid.h"
#include "print-events.h" #include "print-events.h"
#include "smt.h"
#include "expr.h" #include "expr.h"
#include "rblist.h" #include "rblist.h"
#include <string.h> #include <string.h>
...@@ -168,16 +169,20 @@ static void metric__watchdog_constraint_hint(const char *name, bool foot) ...@@ -168,16 +169,20 @@ static void metric__watchdog_constraint_hint(const char *name, bool foot)
static bool metric__group_events(const struct pmu_metric *pm) static bool metric__group_events(const struct pmu_metric *pm)
{ {
if (!pm->metric_constraint) switch (pm->event_grouping) {
case MetricNoGroupEvents:
return false;
case MetricNoGroupEventsNmi:
if (!sysctl__nmi_watchdog_enabled())
return true; return true;
if (!strcmp(pm->metric_constraint, "NO_NMI_WATCHDOG") &&
sysctl__nmi_watchdog_enabled()) {
metric__watchdog_constraint_hint(pm->metric_name, /*foot=*/false); metric__watchdog_constraint_hint(pm->metric_name, /*foot=*/false);
return false; return false;
} case MetricNoGroupEventsSmt:
return !smt_on();
case MetricGroupEvents:
default:
return true; return true;
}
} }
static void metric__free(struct metric *m) static void metric__free(struct metric *m)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment