Linux Perf Users
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>,
	James Clark <james.clark@linaro.org>,
	Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 1/1] perf: Fix Python 3.6 build breakage in jevents.py and util/setup.py
Date: Fri, 25 Sep 2026 23:14:43 +0200	[thread overview]
Message-ID: <arbkQymeBZ0ja6sc@x2> (raw)
In-Reply-To: <CAP-5=fVXxUEYSfWb=AExGQoZ7w7FqGhD8Ga1+hjwF3gTZfsbpA@mail.gmail.com>

On Fri, Sep 25, 2026 at 01:57:06PM -0700, Ian Rogers wrote:
> On Fri, Sep 25, 2026 at 1:47 PM Arnaldo Carvalho de Melo
> <acme@kernel.org> wrote:
> >
> > perf's build still accepts Python 3.6: Makefile.config only rejects
> > interpreters older than 3.6 and jevents.py keeps its own removesuffix()
> > shim for it, but two recently added constructs are evaluated when the
> > module or the function is defined and only work on newer interpreters.
> 
> Could we remove the shim and bump the minimum Python version to 3.9 to
> be in line with the rest of the kernel build?
> https://github.com/torvalds/linux/blob/master/Documentation/process/changes.rst

Since RHEL8 based systems will still be in use for a long time and new
perf versions can be useful in solving problems in such systems, maybe
we should keep the support on 3.6 as is now :-\

This patch is not that big and fixes the only cases where python 3.6 was
breaking, so maybe this is not unreasonable to do.

- Arnaldo
 
> Thanks,
> Ian
> 
> > PEP 585's list[...] became subscriptable in Python 3.9, so the module
> > level annotations in jevents.py make Kbuild die at import time:
> >
> >   TypeError: 'type' object is not subscriptable
> >   make[3]: *** [pmu-events/Build:176: .../test-empty-pmu-events.c] Error 1
> >
> > as seen on almalinux:8 with its python3.6.8, and the list[str]
> > parameters of util/setup.py's functions fail the same way when the
> > python binding is built.
> >
> > ProcessPoolExecutor(initializer=, initargs=) was added in Python 3.7,
> > so generating pmu-events.c dies when the pool is created.
> >
> > Use the typing generics that exist on every supported interpreter and
> > only pass initializer/initargs when the interpreter has them: on 3.6
> > the default fork start method already leaves the worker processes with
> > the parent's _arch_std_events, which is what _init_worker() sets up
> > for spawn semantics.
> >
> > Tested with Python 3.6.15: make -C tools/perf completes, generating
> > pmu-events.c and the python binding.
> >
> > Fixes: cda907c2c3f99 ("perf jevents: Add python type annotations")
> > Fixes: 1fa8d81be1eb ("perf python: Clean up and restructure setup.py")
> > Fixes: eaab2eb09dc2 ("perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py")
> > Assisted-by: LLM
> > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> > ---
> >  tools/perf/pmu-events/jevents.py | 24 +++++++++++++++---------
> >  tools/perf/util/setup.py         |  5 +++--
> >  2 files changed, 18 insertions(+), 11 deletions(-)
> >
> > diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> > index 074daae5308b110b..bdc89ec197680c1b 100755
> > --- a/tools/perf/pmu-events/jevents.py
> > +++ b/tools/perf/pmu-events/jevents.py
> > @@ -8,19 +8,19 @@ import json
> >  import metric
> >  import os
> >  import sys
> > -from typing import (Callable, Dict, Optional, Sequence, Set, Tuple)
> > +from typing import (Any, Callable, Dict, List, Optional, Sequence, Set, Tuple)
> >  import collections
> >
> >  # Global command line arguments.
> >  _args = None
> >  # List of regular event tables.
> > -_event_tables: list[str] = []
> > +_event_tables: List[str] = []
> >  # List of event tables generated from "/sys" directories.
> > -_sys_event_tables: list[str] = []
> > +_sys_event_tables: List[str] = []
> >  # List of regular metric tables.
> > -_metric_tables: list[str] = []
> > +_metric_tables: List[str] = []
> >  # List of metric tables generated from "/sys" directories.
> > -_sys_metric_tables: list[str] = []
> > +_sys_metric_tables: List[str] = []
> >  # Mapping between sys event table names and sys metric table names.
> >  _sys_event_table_to_metric_table_mapping = {}
> >  # Map from an event name to an architecture standard
> > @@ -28,11 +28,11 @@ _sys_event_table_to_metric_table_mapping = {}
> >  # f'{_args.starting_dir}/{_args.arch}' directory.
> >  _arch_std_events: Dict[str, "JsonEvent"] = {}
> >  # Events to write out when the table is closed
> > -_pending_events: list["JsonEvent"] = []
> > +_pending_events: List["JsonEvent"] = []
> >  # Name of events table to be written out
> >  _pending_events_tblname: Optional[str] = None
> >  # Metrics to write out when the table is closed
> > -_pending_metrics: list["JsonEvent"] = []
> > +_pending_metrics: List["JsonEvent"] = []
> >  # Name of metrics table to be written out
> >  _pending_metrics_tblname: Optional[str] = None
> >  # Global BigCString shared by all structures.
> > @@ -1556,9 +1556,15 @@ struct pmu_table_entry {
> >      preprocess_arch_std_files(arch_path)
> >      ftw(arch_path, [], collect_json)
> >
> > +  # ProcessPoolExecutor's initializer/initargs need Python 3.7, on 3.6 the
> > +  # fork start method already leaves the workers with the parent's
> > +  # _arch_std_events, i.e. what _init_worker would set up.
> > +  executor_kwargs: Dict[str, Any] = {}
> > +  if sys.version_info >= (3, 7):
> > +    executor_kwargs = dict(initializer=_init_worker,
> > +                           initargs=(_arch_std_events,))
> >    with concurrent.futures.ProcessPoolExecutor(max_workers=_parallel_worker_count(len(tasks)),
> > -                                              initializer=_init_worker,
> > -                                              initargs=(_arch_std_events,)) as executor:
> > +                                              **executor_kwargs) as executor:
> >      for path, topic, events in executor.map(_parallel_read_json_events, tasks):
> >        _json_cache[(path, topic)] = events
> >
> > diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py
> > index 8380980ade4c486f..ad904b374ec6eaba 100644
> > --- a/tools/perf/util/setup.py
> > +++ b/tools/perf/util/setup.py
> > @@ -11,13 +11,14 @@ import shlex
> >  import shutil
> >  import subprocess
> >  import sysconfig
> > +from typing import List
> >
> >  from setuptools import setup, Extension
> >  from setuptools.command.build_ext import build_ext as _build_ext
> >  from setuptools.command.install_lib import install_lib as _install_lib
> >
> >
> > -def clang_has_option(cc: str, cc_args: list[str], src_feature_tests: str, option: str) -> bool:
> > +def clang_has_option(cc: str, cc_args: List[str], src_feature_tests: str, option: str) -> bool:
> >      """Check if clang supports a specific option.
> >
> >      Args:
> > @@ -47,7 +48,7 @@ def clang_has_option(cc: str, cc_args: list[str], src_feature_tests: str, option
> >      return not any(any(error in line for error in error_substrings) for line in cc_output)
> >
> >
> > -def filter_clang_options(cc: str, cc_args: list[str], src_feature_tests: str) -> None:
> > +def filter_clang_options(cc: str, cc_args: List[str], src_feature_tests: str) -> None:
> >      """Filter out unsupported clang options from sysconfig CFLAGS and OPT.
> >
> >      Args:
> > --
> > 2.55.0
> >

  reply	other threads:[~2026-09-25 21:14 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-25 20:47 [PATCH 1/1] perf: Fix Python 3.6 build breakage in jevents.py and util/setup.py Arnaldo Carvalho de Melo
2026-09-25 20:54 ` sashiko-bot
2026-09-25 20:57 ` Ian Rogers
2026-09-25 21:14   ` Arnaldo Carvalho de Melo [this message]
2026-09-25 21:29     ` Ian Rogers
2026-09-25 21:52       ` Arnaldo Carvalho de Melo
2026-09-25 22:20         ` Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=arbkQymeBZ0ja6sc@x2 \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=irogers@google.com \
    --cc=james.clark@linaro.org \
    --cc=jolsa@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=namhyung@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox