Commit e205952d authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf jevents: Validate that all names given an Event



Validate they exist in a JSON file from one directory found from one
directory above the model's JSON directory.

This avoids broken fallback encodings being created.

Signed-off-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarThomas Falcon <thomas.falcon@intel.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Benjamin Gray <bgray@linux.ibm.com>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Edward Baker <edward.baker@intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Leo Yan <leo.yan@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sandipan Das <sandipan.das@amd.com>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: Xu Yang <xu.yang_2@nxp.com>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 82e53e7a
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -11,12 +11,14 @@ from typing import Dict, List, Optional, Set, Tuple, Union
all_pmus = set()
all_events = set()
experimental_events = set()
all_events_all_models = set()

def LoadEvents(directory: str) -> None:
  """Populate a global set of all known events for the purpose of validating Event names"""
  global all_pmus
  global all_events
  global experimental_events
  global all_events_all_models
  all_events = {
      "context\\-switches",
      "cpu\\-cycles",
@@ -42,6 +44,20 @@ def LoadEvents(directory: str) -> None:
        # The generated directory may be the same as the input, which
        # causes partial json files. Ignore errors.
        pass
  all_events_all_models = all_events.copy()
  for root, dirs, files in os.walk(directory + ".."):
    for filename in files:
      if filename.endswith(".json"):
        try:
          for x in json.load(open(f"{root}/{filename}")):
            if "EventName" in x:
              all_events_all_models.add(x["EventName"])
            elif "ArchStdEvent" in x:
              all_events_all_models.add(x["ArchStdEvent"])
        except json.decoder.JSONDecodeError:
          # The generated directory may be the same as the input, which
          # causes partial json files. Ignore errors.
          pass


def CheckPmu(name: str) -> bool:
@@ -64,6 +80,25 @@ def CheckEvent(name: str) -> bool:

  return name in all_events

def CheckEveryEvent(*names: str) -> None:
  """Check all the events exist in at least one json file"""
  global all_events_all_models
  if len(all_events_all_models) == 0:
    assert len(names) == 1, f"Cannot determine valid events in {names}"
    # No events loaded so assume any event is good.
    return

  for name in names:
    # Remove trailing modifier.
    if ':' in name:
      name = name[:name.find(':')]
    elif '/' in name:
      name = name[:name.find('/')]
      if any([name.startswith(x) for x in ['amd', 'arm', 'cpu', 'msr', 'power']]):
        continue
    if name not in all_events_all_models:
      raise Exception(f"Is {name} a named json event?")


def IsExperimentalEvent(name: str) -> bool:
  global experimental_events
@@ -403,6 +438,7 @@ class Event(Expression):

  def __init__(self, *args: str):
    error = ""
    CheckEveryEvent(*args)
    for name in args:
      if CheckEvent(name):
        self.name = _FixEscapes(name)