All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "TAKANO Mitsuhiro" <takano32@gmail.com>,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 3/3] perf jevents: Check the JSON keys that jevents.py never reads
Date: Tue, 10 Nov 2026 22:49:24 +0000	[thread overview]
Message-ID: <sashiko-outbox-207848@kernel.org> (raw)
In-Reply-To: <20261110222250.1864777-4-takano32@gmail.com>

Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Low] perf jevents: JsonEvent.__init__() suppresses mistyped keys
  matching a sibling hint
--

commit 618a7a7e812ef95bd110f0becbecdb78f73a1397
Author: TAKANO Mitsuhiro <takano32@gmail.com>

perf jevents: Check the JSON keys that jevents.py never reads

This commit adds a --check mode to jevents.py, a jevents-check make target,
and a shell test to report unread JSON keys that are near misses for keys
read by jevents.py, as well as metrics missing a MetricExpr.

> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> index 844fa82887bbf..3063282599a00 100755
> --- a/tools/perf/pmu-events/jevents.py
> +++ b/tools/perf/pmu-events/jevents.py
[ ... ]
> @@ -416,6 +484,42 @@ class JsonEvent:
>          raise argparse.ArgumentTypeError('Cannot find arch std event:', arch_std)
>  
>      self.event = real_event(self.name, event)
> +    # Keys of the JSON object that no code above looked at, set last so that
> +    # the copy of an architecture standard event above does not overwrite it.
> +    # A name that is a near miss for one the code reads, and whose name the
> +    # object does not carry with the same text, is almost certainly a
> +    # misspelling of it: the object lost the field the reader was looking for.
> +    # A name that is not a near miss is left alone, because a table is free to
> +    # carry metadata jevents.py has no use for.
> +    self.mistyped: Optional[Dict[str, Tuple[str, ...]]] = None
> +    if not _track:
> +      return
> +    assert isinstance(jd, _JsonObject)
> +    unread = jd.unread
> +    if unread:
> +      found = {}
> +      for key in unread:
> +        if key not in _hints:
> +          lowered = {name.lower(): name for name in _read_keys}
> +          # Two names can be equally close - RetirementLatencyMax and its Min -
> +          # and naming one of them would be a coin toss presented as an answer.
> +          match = difflib.get_close_matches(key.lower(), sorted(lowered), n=2, cutoff=0.8)
> +          _hints[key] = tuple(lowered[m] for m in match)
> +        hints = _hints[key]
> +        if not hints:
> +          continue
> +        # Nothing was lost if the object carries one of those names with the
> +        # same text: that is a table with the field twice, not a misspelling.
> +        # dict.__contains__ so that the look is not recorded as a read.
> +        lost = True
> +        for name in hints:
> +          if dict.__contains__(jd, name) and dict.get(jd, key) == dict.get(jd, name):
> +            lost = False
> +            break

[Severity: Low]
Does setting lost = False when any name in hints has the same value in jd
hide mistyped sibling keys?

Because get_close_matches() collects up to two matches (n=2), hints for a
typo in a closely-named sibling field (such as RetirementLatencyMax alongside
RetirementLatencyMin) contains both sibling names.  If both fields have the
same value on an event object and one key is mistyped, the other valid
sibling in hints matches in jd, setting lost = False so --check silently
misses the typo even though that field was dropped from the generated event.

In addition, json.load() already collapses identically-spelled duplicate JSON
keys into a single dictionary entry that is removed from jd.unread when read,
so any key remaining in jd.unread is spelled differently from every key
jevents.py reads and suppresses a misspelled duplicate key whenever the valid
key has the same value.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261110222250.1864777-1-takano32@gmail.com?part=3

  reply	other threads:[~2026-11-10 22:49 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-10 22:22 [PATCH 0/3] perf jevents: Report the JSON keys that jevents.py never reads TAKANO Mitsuhiro
2026-11-10 22:22 ` [PATCH 1/3] perf jevents: Name the metric when a MetricExpr is missing TAKANO Mitsuhiro
2026-11-10 22:44   ` sashiko-bot
2026-11-10 22:22 ` [PATCH 2/3] perf jevents: Make the model argument optional TAKANO Mitsuhiro
2026-11-10 22:43   ` sashiko-bot
2026-11-10 22:22 ` [PATCH 3/3] perf jevents: Check the JSON keys that jevents.py never reads TAKANO Mitsuhiro
2026-11-10 22:49   ` sashiko-bot [this message]
2026-11-11  2:33     ` TAKANO Mitsuhiro
2026-11-11  2:34 ` [PATCH v2 0/3] perf jevents: Report " TAKANO Mitsuhiro
2026-11-11  2:34   ` [PATCH v2 1/3] perf jevents: Name the metric when a MetricExpr is missing TAKANO Mitsuhiro
2026-11-11  3:05     ` sashiko-bot
2026-11-11  2:34   ` [PATCH v2 2/3] perf jevents: Make the model argument optional TAKANO Mitsuhiro
2026-11-11  3:15     ` sashiko-bot
2026-11-11  2:34   ` [PATCH v2 3/3] perf jevents: Check the JSON keys that jevents.py never reads TAKANO Mitsuhiro
2026-11-11  3:31     ` sashiko-bot
2026-11-11  3:43   ` [PATCH v3 0/3] perf jevents: Report " TAKANO Mitsuhiro
2026-11-11  3:43     ` [PATCH v3 1/3] perf jevents: Name the metric when a MetricExpr is missing TAKANO Mitsuhiro
2026-11-11  3:54       ` sashiko-bot
2026-11-11  3:43     ` [PATCH v3 2/3] perf jevents: Make the model argument optional TAKANO Mitsuhiro
2026-11-11  3:50       ` sashiko-bot
2026-11-11  3:43     ` [PATCH v3 3/3] perf jevents: Check the JSON keys that jevents.py never reads TAKANO Mitsuhiro
2026-11-11  3:59       ` sashiko-bot
2026-11-11  4:10     ` [PATCH v4 0/3] perf jevents: Report " TAKANO Mitsuhiro
2026-11-11  4:10       ` [PATCH v4 1/3] perf jevents: Name the metric when a MetricExpr is missing TAKANO Mitsuhiro
2026-11-11  4:22         ` sashiko-bot
2026-11-11  4:10       ` [PATCH v4 2/3] perf jevents: Make the model argument optional TAKANO Mitsuhiro
2026-11-11  4:16         ` sashiko-bot
2026-11-11  4:10       ` [PATCH v4 3/3] perf jevents: Check the JSON keys that jevents.py never reads TAKANO Mitsuhiro
2026-11-11  4:19         ` sashiko-bot
2026-11-11 13:26       ` [PATCH v5 0/3] perf jevents: Check the JSON keys a table may carry TAKANO Mitsuhiro
2026-11-11 13:26         ` [PATCH v5 1/3] perf jevents: Name the metric when a MetricExpr is missing TAKANO Mitsuhiro
2026-11-11 14:11           ` sashiko-bot
2026-11-11 13:26         ` [PATCH v5 2/3] perf jevents: Make the model argument optional TAKANO Mitsuhiro
2026-11-11 14:05           ` sashiko-bot
2026-11-11 13:26         ` [PATCH v5 3/3] perf jevents: Check the JSON keys a table may carry TAKANO Mitsuhiro
2026-11-11 14:12           ` sashiko-bot
2026-11-11 15:09         ` [PATCH v6 0/3] " TAKANO Mitsuhiro
2026-11-11 15:09           ` [PATCH v6 1/3] perf jevents: Name the metric and the file when a MetricExpr is missing TAKANO Mitsuhiro
2026-11-11 16:17             ` sashiko-bot
2026-11-11 15:09           ` [PATCH v6 2/3] perf jevents: Make the model argument optional TAKANO Mitsuhiro
2026-11-11 16:28             ` sashiko-bot
2026-11-11 15:09           ` [PATCH v6 3/3] perf jevents: Check the JSON keys a table may carry TAKANO Mitsuhiro
2026-11-11 16:36             ` sashiko-bot
2026-11-12 16:28           ` [PATCH v7 0/1] perf jevents: Check the keys of the JSON tables TAKANO Mitsuhiro
2026-11-12 16:28             ` [PATCH v7 1/1] " TAKANO Mitsuhiro
2026-11-12 16:38               ` sashiko-bot
2026-11-12 17:32             ` [PATCH v8 0/1] " TAKANO Mitsuhiro
2026-11-12 17:32               ` [PATCH v8 1/1] " TAKANO Mitsuhiro
2026-11-12 17:46                 ` sashiko-bot
2026-11-12 22:25               ` [PATCH v9 0/1] " TAKANO Mitsuhiro
2026-11-12 22:25                 ` [PATCH v9 1/1] " TAKANO Mitsuhiro
2026-11-12 22:35                   ` sashiko-bot

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=sashiko-outbox-207848@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=takano32@gmail.com \
    /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 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.