All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf jevents: Sort list of input files
@ 2023-03-20 20:18 Bernhard M. Wiedemann
  2023-03-20 20:48 ` Ian Rogers
  0 siblings, 1 reply; 7+ messages in thread
From: Bernhard M. Wiedemann @ 2023-03-20 20:18 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: linux-perf-users, Ian Rogers, linux-kernel, Bernhard M. Wiedemann

Without this, pmu-events.c would be generated with variations in ordering
depending on non-deterministic filesystem readdir order.

I tested that pmu-events.c still has the same number of lines
and that perf list output works.

This patch was done while working on reproducible builds for openSUSE,
but also solves issues in Debian [1] and other distributions.

[1] https://tests.reproducible-builds.org/debian/rb-pkg/unstable/i386/linux.html

Signed-off-by: Bernhard M. Wiedemann <bwiedemann@suse.de>
CC: Ian Rogers <irogers@google.com>
---
 tools/perf/pmu-events/jevents.py | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index 2bcd07ce609f..f06e1abac7c7 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -381,10 +381,13 @@ def read_json_events(path: str, topic: str) -> Sequence[JsonEvent]:
 
   return events
 
+def sorted_scandir(path: str) -> list[os.DirEntry]:
+  return sorted(os.scandir(path), key=lambda e: e.name)
+
 def preprocess_arch_std_files(archpath: str) -> None:
   """Read in all architecture standard events."""
   global _arch_std_events
-  for item in os.scandir(archpath):
+  for item in sorted_scandir(archpath):
     if item.is_file() and item.name.endswith('.json'):
       for event in read_json_events(item.path, topic=''):
         if event.name:
@@ -497,7 +500,7 @@ def preprocess_one_file(parents: Sequence[str], item: os.DirEntry) -> None:
 def process_one_file(parents: Sequence[str], item: os.DirEntry) -> None:
   """Process a JSON file during the main walk."""
   def is_leaf_dir(path: str) -> bool:
-    for item in os.scandir(path):
+    for item in sorted_scandir(path):
       if item.is_dir():
         return False
     return True
@@ -889,7 +892,7 @@ def main() -> None:
   def ftw(path: str, parents: Sequence[str],
           action: Callable[[Sequence[str], os.DirEntry], None]) -> None:
     """Replicate the directory/file walking behavior of C's file tree walk."""
-    for item in os.scandir(path):
+    for item in sorted_scandir(path):
       if _args.model != 'all' and item.is_dir():
         # Check if the model matches one in _args.model.
         if len(parents) == _args.model.split(',')[0].count('/'):
@@ -930,7 +933,7 @@ struct compact_pmu_event {
 
 """)
   archs = []
-  for item in os.scandir(_args.starting_dir):
+  for item in sorted_scandir(_args.starting_dir):
     if not item.is_dir():
       continue
     if item.name == _args.arch or _args.arch == 'all' or item.name == 'test':
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-03-21 12:39 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-20 20:18 [PATCH] perf jevents: Sort list of input files Bernhard M. Wiedemann
2023-03-20 20:48 ` Ian Rogers
2023-03-20 21:30   ` Bernhard M. Wiedemann
2023-03-20 21:39     ` Ian Rogers
2023-03-20 22:24     ` Arnaldo Carvalho de Melo
2023-03-21  6:30       ` Bernhard M. Wiedemann
2023-03-21 12:38         ` Arnaldo Carvalho de Melo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.