Rather than manually configuring an evsel, switch to using
parse_events for greater commonality with the rest of the perf code.
Reviewed-by: Howard Chu <howardchu95@gmail.com>
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/python/tracepoint.py | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
index bba68a6d4515..38b2b6d11f64 100755
--- a/tools/perf/python/tracepoint.py
+++ b/tools/perf/python/tracepoint.py
@@ -5,24 +5,23 @@
import perf
-class tracepoint(perf.evsel):
- def __init__(self, sys, name):
- config = perf.tracepoint(sys, name)
- perf.evsel.__init__(self,
- type = perf.TYPE_TRACEPOINT,
- config = config,
- freq = 0, sample_period = 1, wakeup_events = 1,
- sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU | perf.SAMPLE_RAW | perf.SAMPLE_TIME)
-
def main():
- tp = tracepoint("sched", "sched_switch")
cpus = perf.cpu_map()
threads = perf.thread_map(-1)
+ evlist = perf.parse_events("sched:sched_switch", cpus, threads)
+ # Disable tracking of mmaps and similar that are unnecessary.
+ for ev in evlist:
+ ev.tracking = False
+ # Configure evsels with default record options.
+ evlist.config()
+ # Simplify the sample_type and read_format of evsels
+ for ev in evlist:
+ ev.sample_type = ev.sample_type & ~perf.SAMPLE_IP
+ ev.read_format = 0
- evlist = perf.evlist(cpus, threads)
- evlist.add(tp)
evlist.open()
evlist.mmap()
+ evlist.enable();
while True:
evlist.poll(timeout = -1)
--
2.48.1.711.g2feabab25a-goog
On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote:
> Rather than manually configuring an evsel, switch to using
> parse_events for greater commonality with the rest of the perf code.
>
> Reviewed-by: Howard Chu <howardchu95@gmail.com>
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/perf/python/tracepoint.py | 23 +++++++++++------------
> 1 file changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
> index bba68a6d4515..38b2b6d11f64 100755
> --- a/tools/perf/python/tracepoint.py
> +++ b/tools/perf/python/tracepoint.py
> @@ -5,24 +5,23 @@
>
> import perf
>
> -class tracepoint(perf.evsel):
> - def __init__(self, sys, name):
> - config = perf.tracepoint(sys, name)
> - perf.evsel.__init__(self,
> - type = perf.TYPE_TRACEPOINT,
> - config = config,
> - freq = 0, sample_period = 1, wakeup_events = 1,
> - sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU | perf.SAMPLE_RAW | perf.SAMPLE_TIME)
> -
> def main():
> - tp = tracepoint("sched", "sched_switch")
> cpus = perf.cpu_map()
> threads = perf.thread_map(-1)
> + evlist = perf.parse_events("sched:sched_switch", cpus, threads)
> + # Disable tracking of mmaps and similar that are unnecessary.
> + for ev in evlist:
> + ev.tracking = False
> + # Configure evsels with default record options.
> + evlist.config()
I think the default option uses frequency of 4000 but tracepoints want
to use period of 1. Also I'm not sure if it sets the proper sample type
bits namely PERF_SAMPLE_RAW.
Thanks,
Namhyung
> + # Simplify the sample_type and read_format of evsels
> + for ev in evlist:
> + ev.sample_type = ev.sample_type & ~perf.SAMPLE_IP
> + ev.read_format = 0
>
> - evlist = perf.evlist(cpus, threads)
> - evlist.add(tp)
> evlist.open()
> evlist.mmap()
> + evlist.enable();
>
> while True:
> evlist.poll(timeout = -1)
> --
> 2.48.1.711.g2feabab25a-goog
>
On Mon, Mar 10, 2025 at 3:17 PM Namhyung Kim <namhyung@kernel.org> wrote:
>
> On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote:
> > Rather than manually configuring an evsel, switch to using
> > parse_events for greater commonality with the rest of the perf code.
> >
> > Reviewed-by: Howard Chu <howardchu95@gmail.com>
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> > tools/perf/python/tracepoint.py | 23 +++++++++++------------
> > 1 file changed, 11 insertions(+), 12 deletions(-)
> >
> > diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
> > index bba68a6d4515..38b2b6d11f64 100755
> > --- a/tools/perf/python/tracepoint.py
> > +++ b/tools/perf/python/tracepoint.py
> > @@ -5,24 +5,23 @@
> >
> > import perf
> >
> > -class tracepoint(perf.evsel):
> > - def __init__(self, sys, name):
> > - config = perf.tracepoint(sys, name)
> > - perf.evsel.__init__(self,
> > - type = perf.TYPE_TRACEPOINT,
> > - config = config,
> > - freq = 0, sample_period = 1, wakeup_events = 1,
> > - sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU | perf.SAMPLE_RAW | perf.SAMPLE_TIME)
> > -
> > def main():
> > - tp = tracepoint("sched", "sched_switch")
> > cpus = perf.cpu_map()
> > threads = perf.thread_map(-1)
> > + evlist = perf.parse_events("sched:sched_switch", cpus, threads)
> > + # Disable tracking of mmaps and similar that are unnecessary.
> > + for ev in evlist:
> > + ev.tracking = False
> > + # Configure evsels with default record options.
> > + evlist.config()
>
> I think the default option uses frequency of 4000 but tracepoints want
> to use period of 1. Also I'm not sure if it sets the proper sample type
> bits namely PERF_SAMPLE_RAW.
I used trace to ensure they matched. Fwiw, the sample_period for a
tracepoint is set to 1 in evsel__newtp_idx:
https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/util/evsel.c?h=perf-tools-next#n621
and the evsel__config won't overwrite an already set sample_period:
https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/util/evsel.c?h=perf-tools-next#n1341
Thanks, Ian
> Thanks,
> Namhyung
>
>
> > + # Simplify the sample_type and read_format of evsels
> > + for ev in evlist:
> > + ev.sample_type = ev.sample_type & ~perf.SAMPLE_IP
> > + ev.read_format = 0
> >
> > - evlist = perf.evlist(cpus, threads)
> > - evlist.add(tp)
> > evlist.open()
> > evlist.mmap()
> > + evlist.enable();
> >
> > while True:
> > evlist.poll(timeout = -1)
> > --
> > 2.48.1.711.g2feabab25a-goog
> >
On Mon, Mar 10, 2025 at 04:40:36PM -0700, Ian Rogers wrote:
> On Mon, Mar 10, 2025 at 3:17 PM Namhyung Kim <namhyung@kernel.org> wrote:
> >
> > On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote:
> > > Rather than manually configuring an evsel, switch to using
> > > parse_events for greater commonality with the rest of the perf code.
> > >
> > > Reviewed-by: Howard Chu <howardchu95@gmail.com>
> > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > ---
> > > tools/perf/python/tracepoint.py | 23 +++++++++++------------
> > > 1 file changed, 11 insertions(+), 12 deletions(-)
> > >
> > > diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
> > > index bba68a6d4515..38b2b6d11f64 100755
> > > --- a/tools/perf/python/tracepoint.py
> > > +++ b/tools/perf/python/tracepoint.py
> > > @@ -5,24 +5,23 @@
> > >
> > > import perf
> > >
> > > -class tracepoint(perf.evsel):
> > > - def __init__(self, sys, name):
> > > - config = perf.tracepoint(sys, name)
> > > - perf.evsel.__init__(self,
> > > - type = perf.TYPE_TRACEPOINT,
> > > - config = config,
> > > - freq = 0, sample_period = 1, wakeup_events = 1,
> > > - sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU | perf.SAMPLE_RAW | perf.SAMPLE_TIME)
> > > -
> > > def main():
> > > - tp = tracepoint("sched", "sched_switch")
> > > cpus = perf.cpu_map()
> > > threads = perf.thread_map(-1)
> > > + evlist = perf.parse_events("sched:sched_switch", cpus, threads)
> > > + # Disable tracking of mmaps and similar that are unnecessary.
> > > + for ev in evlist:
> > > + ev.tracking = False
> > > + # Configure evsels with default record options.
> > > + evlist.config()
> >
> > I think the default option uses frequency of 4000 but tracepoints want
> > to use period of 1. Also I'm not sure if it sets the proper sample type
> > bits namely PERF_SAMPLE_RAW.
>
> I used trace to ensure they matched. Fwiw, the sample_period for a
> tracepoint is set to 1 in evsel__newtp_idx:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/util/evsel.c?h=perf-tools-next#n621
> and the evsel__config won't overwrite an already set sample_period:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/util/evsel.c?h=perf-tools-next#n1341
Ok, it only sets the default value and it will use the attr from
evsel__newtp_idx(). Thanks for checking this.
Thanks,
Namhyung
> >
> >
> > > + # Simplify the sample_type and read_format of evsels
> > > + for ev in evlist:
> > > + ev.sample_type = ev.sample_type & ~perf.SAMPLE_IP
> > > + ev.read_format = 0
> > >
> > > - evlist = perf.evlist(cpus, threads)
> > > - evlist.add(tp)
> > > evlist.open()
> > > evlist.mmap()
> > > + evlist.enable();
> > >
> > > while True:
> > > evlist.poll(timeout = -1)
> > > --
> > > 2.48.1.711.g2feabab25a-goog
> > >
On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote:
> Rather than manually configuring an evsel, switch to using
> parse_events for greater commonality with the rest of the perf code.
>
> Reviewed-by: Howard Chu <howardchu95@gmail.com>
> Signed-off-by: Ian Rogers <irogers@google.com>
Now will all in place I'm trying to test it and I am getting some
strange results:
root@number:/home/acme/git/perf-tools-next# tools/perf/python/tracepoint.py
<SNIP lots of seemingly ok lines>
time 78318710956557 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x1 ==> next_comm=swapper/14 next_pid=0 next_prio=120
time 78318720082300 prev_comm=swapper/16 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:8 next_pid=1752774 next_prio=120
time 78318706232435 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/21 next_pid=0 next_prio=120
time 78318708202121 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/25 next_pid=0 next_prio=120
time 78318748346989 prev_comm=swapper/26 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=gnome-terminal- next_pid=3551 next_prio=120
Traceback (most recent call last):
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 47, in <module>
main()
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 42, in main
event.next_comm,
^^^^^^^^^^^^^^^
AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
root@number:/home/acme/git/perf-tools-next#
But it shouldn't get there as there is this check:
if not isinstance(event, perf.sample_event):
continue
:-\
Trying to debug that...
- Arnaldo
On Mon, Mar 10, 2025 at 06:15:42PM -0300, Arnaldo Carvalho de Melo wrote: > On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote: > > Rather than manually configuring an evsel, switch to using > > parse_events for greater commonality with the rest of the perf code. > > > > Reviewed-by: Howard Chu <howardchu95@gmail.com> > > Signed-off-by: Ian Rogers <irogers@google.com> > > Now will all in place I'm trying to test it and I am getting some > strange results: > > root@number:/home/acme/git/perf-tools-next# tools/perf/python/tracepoint.py > <SNIP lots of seemingly ok lines> > time 78318710956557 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x1 ==> next_comm=swapper/14 next_pid=0 next_prio=120 > time 78318720082300 prev_comm=swapper/16 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:8 next_pid=1752774 next_prio=120 > time 78318706232435 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/21 next_pid=0 next_prio=120 > time 78318708202121 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/25 next_pid=0 next_prio=120 > time 78318748346989 prev_comm=swapper/26 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=gnome-terminal- next_pid=3551 next_prio=120 > Traceback (most recent call last): > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 47, in <module> > main() > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 42, in main > event.next_comm, > ^^^^^^^^^^^^^^^ > AttributeError: 'perf.sample_event' object has no attribute 'next_comm' > root@number:/home/acme/git/perf-tools-next# > > But it shouldn't get there as there is this check: > > if not isinstance(event, perf.sample_event): > continue > > > :-\ > > Trying to debug that... And it doesn't seem related to your series, I checked and v6.13 has the same problem, I nuked the build dir, etc. - Arnaldo
On Mon, Mar 10, 2025 at 2:16 PM Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > > On Mon, Mar 10, 2025 at 06:15:42PM -0300, Arnaldo Carvalho de Melo wrote: > > On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote: > > > Rather than manually configuring an evsel, switch to using > > > parse_events for greater commonality with the rest of the perf code. > > > > > > Reviewed-by: Howard Chu <howardchu95@gmail.com> > > > Signed-off-by: Ian Rogers <irogers@google.com> > > > > Now will all in place I'm trying to test it and I am getting some > > strange results: > > > > root@number:/home/acme/git/perf-tools-next# tools/perf/python/tracepoint.py > > <SNIP lots of seemingly ok lines> > > time 78318710956557 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x1 ==> next_comm=swapper/14 next_pid=0 next_prio=120 > > time 78318720082300 prev_comm=swapper/16 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:8 next_pid=1752774 next_prio=120 > > time 78318706232435 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/21 next_pid=0 next_prio=120 > > time 78318708202121 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/25 next_pid=0 next_prio=120 > > time 78318748346989 prev_comm=swapper/26 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=gnome-terminal- next_pid=3551 next_prio=120 > > Traceback (most recent call last): > > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 47, in <module> > > main() > > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 42, in main > > event.next_comm, > > ^^^^^^^^^^^^^^^ > > AttributeError: 'perf.sample_event' object has no attribute 'next_comm' > > root@number:/home/acme/git/perf-tools-next# > > > > But it shouldn't get there as there is this check: > > > > if not isinstance(event, perf.sample_event): > > continue > > > > > > :-\ > > > > Trying to debug that... > > And it doesn't seem related to your series, I checked and v6.13 has the > same problem, I nuked the build dir, etc. Right. I'd seen the same issue. Thanks, Ian
On Mon, Mar 10, 2025 at 02:17:59PM -0700, Ian Rogers wrote:
> On Mon, Mar 10, 2025 at 2:16 PM Arnaldo Carvalho de Melo
> <acme@kernel.org> wrote:
> >
> > On Mon, Mar 10, 2025 at 06:15:42PM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote:
> > > > Rather than manually configuring an evsel, switch to using
> > > > parse_events for greater commonality with the rest of the perf code.
> > > >
> > > > Reviewed-by: Howard Chu <howardchu95@gmail.com>
> > > > Signed-off-by: Ian Rogers <irogers@google.com>
> > >
> > > Now will all in place I'm trying to test it and I am getting some
> > > strange results:
> > >
> > > root@number:/home/acme/git/perf-tools-next# tools/perf/python/tracepoint.py
> > > <SNIP lots of seemingly ok lines>
> > > time 78318710956557 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x1 ==> next_comm=swapper/14 next_pid=0 next_prio=120
> > > time 78318720082300 prev_comm=swapper/16 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:8 next_pid=1752774 next_prio=120
> > > time 78318706232435 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/21 next_pid=0 next_prio=120
> > > time 78318708202121 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/25 next_pid=0 next_prio=120
> > > time 78318748346989 prev_comm=swapper/26 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=gnome-terminal- next_pid=3551 next_prio=120
> > > Traceback (most recent call last):
> > > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 47, in <module>
> > > main()
> > > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 42, in main
> > > event.next_comm,
> > > ^^^^^^^^^^^^^^^
> > > AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
> > > root@number:/home/acme/git/perf-tools-next#
> > >
> > > But it shouldn't get there as there is this check:
> > >
> > > if not isinstance(event, perf.sample_event):
> > > continue
> > >
> > >
> > > :-\
> > >
> > > Trying to debug that...
> >
> > And it doesn't seem related to your series, I checked and v6.13 has the
> > same problem, I nuked the build dir, etc.
>
> Right. I'd seen the same issue.
time 79411977132102 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/12 next_pid=0 next_prio=120
{ type: sample }
time 79411977200343 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/16 next_pid=0 next_prio=120
{ type: sample }
time 79411964535268 prev_comm=kworker/u112:14 prev_pid=810939 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/17 next_pid=0 next_prio=120
{ type: sample }
time 79411964746511 prev_comm=swapper/18 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:12 next_pid=2109251 next_prio=120
{ type: sample }
Traceback (most recent call last):
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 48, in <module>
main()
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 43, in main
event.next_comm,
^^^^^^^^^^^^^^^
AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
root@number:/home/acme/git/perf-tools-next#
And it says it is a sample...
Well, ran out of time, will try later or early tomorrow, will also try
to review the syscalltbl series and Howard's off cpu profiling.
- Arnaldo
On Mon, Mar 10, 2025 at 06:28:01PM -0300, Arnaldo Carvalho de Melo wrote:
> On Mon, Mar 10, 2025 at 02:17:59PM -0700, Ian Rogers wrote:
> > On Mon, Mar 10, 2025 at 2:16 PM Arnaldo Carvalho de Melo
> > <acme@kernel.org> wrote:
> > >
> > > On Mon, Mar 10, 2025 at 06:15:42PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > On Fri, Feb 28, 2025 at 02:23:08PM -0800, Ian Rogers wrote:
> > > > > Rather than manually configuring an evsel, switch to using
> > > > > parse_events for greater commonality with the rest of the perf code.
> > > > >
> > > > > Reviewed-by: Howard Chu <howardchu95@gmail.com>
> > > > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > >
> > > > Now will all in place I'm trying to test it and I am getting some
> > > > strange results:
> > > >
> > > > root@number:/home/acme/git/perf-tools-next# tools/perf/python/tracepoint.py
> > > > <SNIP lots of seemingly ok lines>
> > > > time 78318710956557 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x1 ==> next_comm=swapper/14 next_pid=0 next_prio=120
> > > > time 78318720082300 prev_comm=swapper/16 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:8 next_pid=1752774 next_prio=120
> > > > time 78318706232435 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/21 next_pid=0 next_prio=120
> > > > time 78318708202121 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/25 next_pid=0 next_prio=120
> > > > time 78318748346989 prev_comm=swapper/26 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=gnome-terminal- next_pid=3551 next_prio=120
> > > > Traceback (most recent call last):
> > > > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 47, in <module>
> > > > main()
> > > > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 42, in main
> > > > event.next_comm,
> > > > ^^^^^^^^^^^^^^^
> > > > AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
> > > > root@number:/home/acme/git/perf-tools-next#
> > > >
> > > > But it shouldn't get there as there is this check:
> > > >
> > > > if not isinstance(event, perf.sample_event):
> > > > continue
> > > >
> > > >
> > > > :-\
> > > >
> > > > Trying to debug that...
> > >
> > > And it doesn't seem related to your series, I checked and v6.13 has the
> > > same problem, I nuked the build dir, etc.
> >
> > Right. I'd seen the same issue.
>
> time 79411977132102 prev_comm=sudo prev_pid=3133818 prev_prio=120 prev_state=0x2 ==> next_comm=swapper/12 next_pid=0 next_prio=120
> { type: sample }
> time 79411977200343 prev_comm=kworker/u112:17 prev_pid=1551246 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/16 next_pid=0 next_prio=120
> { type: sample }
> time 79411964535268 prev_comm=kworker/u112:14 prev_pid=810939 prev_prio=120 prev_state=0x80 ==> next_comm=swapper/17 next_pid=0 next_prio=120
> { type: sample }
> time 79411964746511 prev_comm=swapper/18 prev_pid=0 prev_prio=120 prev_state=0x0 ==> next_comm=kworker/u112:12 next_pid=2109251 next_prio=120
> { type: sample }
> Traceback (most recent call last):
> File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 48, in <module>
> main()
> File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 43, in main
> event.next_comm,
> ^^^^^^^^^^^^^^^
> AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
> root@number:/home/acme/git/perf-tools-next#
>
> And it says it is a sample...
>
> Well, ran out of time, will try later or early tomorrow, will also try
> to review the syscalltbl series and Howard's off cpu profiling.
Its some sort of corruption, I added printing the sample_* fields and
then up to the field before next_comm:
time 2462907120158 prev_comm=swapper/8 prev_pid=0 prev_prio=120 prev_state=0x0 ==>
next_comm=gnome-terminal- next_pid=3646 next_prio=120
ip 0 pid=0 tid=0 cpu=12
time 2462916970223 prev_comm=swapper/12 prev_pid=0 prev_prio=120 prev_state=0x0 ==>
next_comm=gnome-terminal- next_pid=3646 next_prio=120
ip 0 pid=0 tid=0 cpu=14
time 2462902120635 prev_comm= prev_pid=1919907691 prev_prio=796026219 prev_state=0x323a32313175 ==>
Traceback (most recent call last):
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 51, in <module>
main()
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 46, in main
event.next_comm,
^^^^^^^^^^^^^^^
AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
root@number:/home/acme/git/perf-tools-next#
See the empty prev_comm, bogus pref_pid, ditto for prev_state and
pref_prio and then it simple doesn't have that next_comm...
Also I noticed that in tracepoint_field() (tools/perf/util/python.c) we
can get the string tracepoint fields as a bytearray or as a string,
ahere:
if (field->flags & TEP_FIELD_IS_STRING &&
is_printable_array(data + offset, len)) {
ret = PyUnicode_FromString((char *)data + offset);
} else {
ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
field->flags &= ~TEP_FIELD_IS_STRING;
}
For some reason in sessions where bytearrays are returned, and all comes
as bytearrays, the problem is not noticed.
But when it comes as a string it breaks after a short time, /me
scratches head...
- Arnaldo
On Tue, Mar 11, 2025 at 12:32:05PM -0300, Arnaldo Carvalho de Melo wrote:
> if (field->flags & TEP_FIELD_IS_STRING &&
> is_printable_array(data + offset, len)) {
> ret = PyUnicode_FromString((char *)data + offset);
> } else {
> ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
> field->flags &= ~TEP_FIELD_IS_STRING;
> }
>
>
> For some reason in sessions where bytearrays are returned, and all comes
> as bytearrays, the problem is not noticed.
>
> But when it comes as a string it breaks after a short time, /me
> scratches head...
I think I'm getting closer, with some debugging sprinkled in the python
binding:
ip 0 pid=74131 tid=74131 cpu=3
( field 'prev_comm' ret=0x7f0a66a1b970 ) ( field 'prev_pid' ret=0x7f0a66b1bed0 ) ( field 'prev_prio' ret=0x7f0a74f60d08 ) ( field 'prev_state' ret=0x7f0a74f60e08 ) time 4503271651784 prev_comm=kworker/u112:14 prev_pid=74131 prev_prio=120 prev_state=0x80 ==>
( field 'next_comm' ret=0x7f0a66a1b970 ) ( field 'next_pid' ret=0x7f0a74f5fe08 ) ( field 'next_prio' ret=0x7f0a74f60d08 ) next_comm=swapper/3 next_pid=0 next_prio=120
ip 0 pid=80209 tid=80209 cpu=4
( field 'prev_comm' ret=0x7f0a66a1b970 ) ( field 'prev_pid' ret=0x7f0a66b1bed0 ) ( field 'prev_prio' ret=0x7f0a74f60d08 ) ( field 'prev_state' ret=0x7f0a74f60e08 ) time 4503280531143 prev_comm=kworker/u112:3 prev_pid=80209 prev_prio=120 prev_state=0x80 ==>
( field 'next_comm' ret=0x7f0a66a1b970 ) ( field 'next_pid' ret=0x7f0a74f5fe08 ) ( field 'next_prio' ret=0x7f0a74f60d08 ) next_comm=swapper/4 next_pid=0 next_prio=120
ip 0 pid=74131 tid=74131 cpu=5
( XXX '�!' len=16) ( field 'prev_comm' ret=(nil) ) Traceback (most recent call last):
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 51, in <module>
main()
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 40, in main
event.prev_comm,
^^^^^^^^^^^^^^^
AttributeError: 'perf.sample_event' object has no attribute 'prev_comm'
So the size of the field, in the tracepoint format file is 16, its a
comm:
root@number:/home/acme/git/perf-tools-next# grep '_comm\[' /sys/kernel/tracing/events/sched/sched_switch/format
field:char prev_comm[16]; offset:8; size:16; signed:0;
field:char next_comm[16]; offset:40; size:16; signed:0;
root@number:/home/acme/git/perf-tools-next#
But:
root@number:/home/acme/git/perf-tools-next# cat /proc/74131/comm
kworker/u112:14-events_unbound
root@number:/home/acme/git/perf-tools-next#
root@number:/home/acme/git/perf-tools-next# echo -n "kworker/u112:14-events_unbound" | wc -c
30
root@number:/home/acme/git/perf-tools-next#
Which should explain that:
( XXX '�!' len=16) ( field 'prev_comm' ret=(nil) )
That is printed by:
+++ b/tools/perf/util/python.c
@@ -318,16 +318,17 @@ tracepoint_field(const struct pyrf_event *pe, struct tep_format_field *field)
if (tep_field_is_relative(field->flags))
offset += field->offset + field->size;
}
- if (field->flags & TEP_FIELD_IS_STRING &&
- is_printable_array(data + offset, len)) {
+ if (field->flags & TEP_FIELD_IS_STRING) {
ret = PyUnicode_FromString((char *)data + offset);
+ if (ret == NULL) {
+ printf(" ( XXX '%.*s' len=%d) ", len, (char *)data + offset, len); fflush(stdout);
+ }
} else {
ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
- field->flags &= ~TEP_FIELD_IS_STRING;
}
So now trying to figure out why when the comm lenght is more than 16 the
raw_data appears to contain trash...
- Arnaldo
On Tue, Mar 11, 2025 at 02:06:45PM -0300, Arnaldo Carvalho de Melo wrote:
> On Tue, Mar 11, 2025 at 12:32:05PM -0300, Arnaldo Carvalho de Melo wrote:
> > if (field->flags & TEP_FIELD_IS_STRING &&
> > is_printable_array(data + offset, len)) {
> > ret = PyUnicode_FromString((char *)data + offset);
> > } else {
> > ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
> > field->flags &= ~TEP_FIELD_IS_STRING;
> > }
> >
> >
> > For some reason in sessions where bytearrays are returned, and all comes
> > as bytearrays, the problem is not noticed.
> >
> > But when it comes as a string it breaks after a short time, /me
> > scratches head...
>
> I think I'm getting closer, with some debugging sprinkled in the python
> binding:
>
> ip 0 pid=74131 tid=74131 cpu=3
> ( field 'prev_comm' ret=0x7f0a66a1b970 ) ( field 'prev_pid' ret=0x7f0a66b1bed0 ) ( field 'prev_prio' ret=0x7f0a74f60d08 ) ( field 'prev_state' ret=0x7f0a74f60e08 ) time 4503271651784 prev_comm=kworker/u112:14 prev_pid=74131 prev_prio=120 prev_state=0x80 ==>
> ( field 'next_comm' ret=0x7f0a66a1b970 ) ( field 'next_pid' ret=0x7f0a74f5fe08 ) ( field 'next_prio' ret=0x7f0a74f60d08 ) next_comm=swapper/3 next_pid=0 next_prio=120
> ip 0 pid=80209 tid=80209 cpu=4
> ( field 'prev_comm' ret=0x7f0a66a1b970 ) ( field 'prev_pid' ret=0x7f0a66b1bed0 ) ( field 'prev_prio' ret=0x7f0a74f60d08 ) ( field 'prev_state' ret=0x7f0a74f60e08 ) time 4503280531143 prev_comm=kworker/u112:3 prev_pid=80209 prev_prio=120 prev_state=0x80 ==>
> ( field 'next_comm' ret=0x7f0a66a1b970 ) ( field 'next_pid' ret=0x7f0a74f5fe08 ) ( field 'next_prio' ret=0x7f0a74f60d08 ) next_comm=swapper/4 next_pid=0 next_prio=120
> ip 0 pid=74131 tid=74131 cpu=5
> ( XXX '�!' len=16) ( field 'prev_comm' ret=(nil) ) Traceback (most recent call last):
> File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 51, in <module>
> main()
> File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 40, in main
> event.prev_comm,
> ^^^^^^^^^^^^^^^
> AttributeError: 'perf.sample_event' object has no attribute 'prev_comm'
>
>
> So the size of the field, in the tracepoint format file is 16, its a
> comm:
>
> root@number:/home/acme/git/perf-tools-next# grep '_comm\[' /sys/kernel/tracing/events/sched/sched_switch/format
> field:char prev_comm[16]; offset:8; size:16; signed:0;
> field:char next_comm[16]; offset:40; size:16; signed:0;
> root@number:/home/acme/git/perf-tools-next#
>
> But:
>
> root@number:/home/acme/git/perf-tools-next# cat /proc/74131/comm
> kworker/u112:14-events_unbound
> root@number:/home/acme/git/perf-tools-next#
>
> root@number:/home/acme/git/perf-tools-next# echo -n "kworker/u112:14-events_unbound" | wc -c
> 30
> root@number:/home/acme/git/perf-tools-next#
>
> Which should explain that:
>
> ( XXX '�!' len=16) ( field 'prev_comm' ret=(nil) )
>
> That is printed by:
>
> +++ b/tools/perf/util/python.c
> @@ -318,16 +318,17 @@ tracepoint_field(const struct pyrf_event *pe, struct tep_format_field *field)
> if (tep_field_is_relative(field->flags))
> offset += field->offset + field->size;
> }
> - if (field->flags & TEP_FIELD_IS_STRING &&
> - is_printable_array(data + offset, len)) {
> + if (field->flags & TEP_FIELD_IS_STRING) {
> ret = PyUnicode_FromString((char *)data + offset);
> + if (ret == NULL) {
> + printf(" ( XXX '%.*s' len=%d) ", len, (char *)data + offset, len); fflush(stdout);
> + }
> } else {
> ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
> - field->flags &= ~TEP_FIELD_IS_STRING;
> }
>
> So now trying to figure out why when the comm lenght is more than 16 the
> raw_data appears to contain trash...
So it seems to be something just in the python binding, as perf trace
seems to handle it well:
( field 'prev_comm' ret=0x7f7c31f65110, raw_size=68 ) ( field 'prev_pid' ret=0x7f7c23b1bed0, raw_size=68 ) ( field 'prev_prio' ret=0x7f7c239c0030, raw_size=68 ) ( field 'prev_state' ret=0x7f7c239c0250, raw_size=68 ) time 14771421785867 prev_comm= prev_pid=1919907691 prev_prio=796026219 prev_state=0x303a32313175 ==>
( XXX '��' len=16, raw_size=68) ( field 'next_comm' ret=(nil), raw_size=68 ) Traceback (most recent call last):
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 51, in <module>
main()
File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 46, in main
event.next_comm,
^^^^^^^^^^^^^^^
AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
root@number:/home/acme/git/perf-tools-next# cat /proc/125355/comm
kworker/u112:0-i915
root@number:/home/acme/git/perf-tools-next#
root@number:/home/acme/git/perf-tools-next#
root@number:/home/acme/git/perf-tools-next# perf trace -e sched:sched_switch -p 125355
0.000 sched:sched_switch(prev_comm: "kworker/u112:0", prev_pid: 125355 (kworker/u112:0-), prev_prio: 120, prev_state: 128, next_comm: "swapper/6", next_prio: 120)
^Croot@number:/home/acme/git/perf-tools-next#
I.e. it chops up the prev_comm size to what is specified in the
tracepoint format.
And that sample->raw_size is the same accross the sched:sched_switch
raw_datas (seemingly suboptimal, most are less than 16 bytes, but
probably its not guaranteed that the \0 will be there, so copy all the
16 bytes).
Now to try to figure out why simply using PyUnicode_FromStringAndSize
doesn't work...
- Arnaldo
On Tue, Mar 11, 2025 at 03:49:37PM -0300, Arnaldo Carvalho de Melo wrote:
> So it seems to be something just in the python binding, as perf trace
> seems to handle it well:
>
> ( field 'prev_comm' ret=0x7f7c31f65110, raw_size=68 ) ( field 'prev_pid' ret=0x7f7c23b1bed0, raw_size=68 ) ( field 'prev_prio' ret=0x7f7c239c0030, raw_size=68 ) ( field 'prev_state' ret=0x7f7c239c0250, raw_size=68 ) time 14771421785867 prev_comm= prev_pid=1919907691 prev_prio=796026219 prev_state=0x303a32313175 ==>
> ( XXX '��' len=16, raw_size=68) ( field 'next_comm' ret=(nil), raw_size=68 ) Traceback (most recent call last):
> File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 51, in <module>
> main()
> File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 46, in main
> event.next_comm,
> ^^^^^^^^^^^^^^^
> AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
> root@number:/home/acme/git/perf-tools-next# cat /proc/125355/comm
> kworker/u112:0-i915
> root@number:/home/acme/git/perf-tools-next#
> root@number:/home/acme/git/perf-tools-next#
> root@number:/home/acme/git/perf-tools-next# perf trace -e sched:sched_switch -p 125355
> 0.000 sched:sched_switch(prev_comm: "kworker/u112:0", prev_pid: 125355 (kworker/u112:0-), prev_prio: 120, prev_state: 128, next_comm: "swapper/6", next_prio: 120)
> ^Croot@number:/home/acme/git/perf-tools-next#
>
> I.e. it chops up the prev_comm size to what is specified in the
> tracepoint format.
>
> And that sample->raw_size is the same accross the sched:sched_switch
> raw_datas (seemingly suboptimal, most are less than 16 bytes, but
> probably its not guaranteed that the \0 will be there, so copy all the
> 16 bytes).
>
> Now to try to figure out why simply using PyUnicode_FromStringAndSize
> doesn't work...
Didn't manage to make progress on this, I spent more time than I
expected as I think this could be some sort of canary on some coal mine,
but with the patch below, that gives up and just avoids touching the
COMM fields and don't switch from string to bytearray in the binding, it
runs forever, this is just a data point in case somebody wants to
pursue.
That flipping from string to not string based on just one entry not
being acceptable is questionable, and I think it should go away, but why
when COMM fields are bigger what is alloted to them in the tracepoint
ends up tripping up just the python binding is something I couldn't
grasp in today's session.
Namhyung, this is something open, but not caused by Ian's patchset, for
which I give my:
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
In addition to the tags I provided patch by patch.
- Arnaldo
diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
index 38b2b6d11f64566a..965b50afbdafeeb2 100755
--- a/tools/perf/python/tracepoint.py
+++ b/tools/perf/python/tracepoint.py
@@ -33,15 +33,12 @@ def main():
if not isinstance(event, perf.sample_event):
continue
- print("time %u prev_comm=%s prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_comm=%s next_pid=%d next_prio=%d" % (
- event.sample_time,
- event.prev_comm,
- event.prev_pid,
- event.prev_prio,
- event.prev_state,
- event.next_comm,
- event.next_pid,
- event.next_prio))
+ try:
+ print("time %u prev_comm=%s prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_comm=%s next_pid=%d next_prio=%d" % (
+ event.sample_time, event.prev_comm, event.prev_pid, event.prev_prio, event.prev_state, event.next_comm, event.next_pid, event.next_prio))
+ except:
+ print("time %u prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_pid=%d next_prio=%d" % (
+ event.sample_time, event.prev_pid, event.prev_prio, event.prev_state, event.next_pid, event.next_prio))
if __name__ == '__main__':
main()
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 6c5bb5e8893998ae..3eb77bd270077cb3 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -318,13 +318,10 @@ tracepoint_field(const struct pyrf_event *pe, struct tep_format_field *field)
if (tep_field_is_relative(field->flags))
offset += field->offset + field->size;
}
- if (field->flags & TEP_FIELD_IS_STRING &&
- is_printable_array(data + offset, len)) {
+ if (field->flags & TEP_FIELD_IS_STRING)
ret = PyUnicode_FromString((char *)data + offset);
- } else {
+ else
ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
- field->flags &= ~TEP_FIELD_IS_STRING;
- }
} else {
val = tep_read_number(pevent, data + field->offset,
field->size);
On Tue, Mar 11, 2025 at 06:52:45PM -0300, Arnaldo Carvalho de Melo wrote:
> On Tue, Mar 11, 2025 at 03:49:37PM -0300, Arnaldo Carvalho de Melo wrote:
> > So it seems to be something just in the python binding, as perf trace
> > seems to handle it well:
> >
> > ( field 'prev_comm' ret=0x7f7c31f65110, raw_size=68 ) ( field 'prev_pid' ret=0x7f7c23b1bed0, raw_size=68 ) ( field 'prev_prio' ret=0x7f7c239c0030, raw_size=68 ) ( field 'prev_state' ret=0x7f7c239c0250, raw_size=68 ) time 14771421785867 prev_comm= prev_pid=1919907691 prev_prio=796026219 prev_state=0x303a32313175 ==>
> > ( XXX '��' len=16, raw_size=68) ( field 'next_comm' ret=(nil), raw_size=68 ) Traceback (most recent call last):
> > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 51, in <module>
> > main()
> > File "/home/acme/git/perf-tools-next/tools/perf/python/tracepoint.py", line 46, in main
> > event.next_comm,
> > ^^^^^^^^^^^^^^^
> > AttributeError: 'perf.sample_event' object has no attribute 'next_comm'
> > root@number:/home/acme/git/perf-tools-next# cat /proc/125355/comm
> > kworker/u112:0-i915
> > root@number:/home/acme/git/perf-tools-next#
> > root@number:/home/acme/git/perf-tools-next#
> > root@number:/home/acme/git/perf-tools-next# perf trace -e sched:sched_switch -p 125355
> > 0.000 sched:sched_switch(prev_comm: "kworker/u112:0", prev_pid: 125355 (kworker/u112:0-), prev_prio: 120, prev_state: 128, next_comm: "swapper/6", next_prio: 120)
> > ^Croot@number:/home/acme/git/perf-tools-next#
> >
> > I.e. it chops up the prev_comm size to what is specified in the
> > tracepoint format.
> >
> > And that sample->raw_size is the same accross the sched:sched_switch
> > raw_datas (seemingly suboptimal, most are less than 16 bytes, but
> > probably its not guaranteed that the \0 will be there, so copy all the
> > 16 bytes).
> >
> > Now to try to figure out why simply using PyUnicode_FromStringAndSize
> > doesn't work...
>
> Didn't manage to make progress on this, I spent more time than I
> expected as I think this could be some sort of canary on some coal mine,
> but with the patch below, that gives up and just avoids touching the
> COMM fields and don't switch from string to bytearray in the binding, it
> runs forever, this is just a data point in case somebody wants to
> pursue.
>
> That flipping from string to not string based on just one entry not
> being acceptable is questionable, and I think it should go away, but why
> when COMM fields are bigger what is alloted to them in the tracepoint
> ends up tripping up just the python binding is something I couldn't
> grasp in today's session.
>
> Namhyung, this is something open, but not caused by Ian's patchset, for
> which I give my:
>
> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Thanks for the analysis!
>
> In addition to the tags I provided patch by patch.
Ian, can you check if it works well for you?
Thanks,
Namhyung
> diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
> index 38b2b6d11f64566a..965b50afbdafeeb2 100755
> --- a/tools/perf/python/tracepoint.py
> +++ b/tools/perf/python/tracepoint.py
> @@ -33,15 +33,12 @@ def main():
> if not isinstance(event, perf.sample_event):
> continue
>
> - print("time %u prev_comm=%s prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_comm=%s next_pid=%d next_prio=%d" % (
> - event.sample_time,
> - event.prev_comm,
> - event.prev_pid,
> - event.prev_prio,
> - event.prev_state,
> - event.next_comm,
> - event.next_pid,
> - event.next_prio))
> + try:
> + print("time %u prev_comm=%s prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_comm=%s next_pid=%d next_prio=%d" % (
> + event.sample_time, event.prev_comm, event.prev_pid, event.prev_prio, event.prev_state, event.next_comm, event.next_pid, event.next_prio))
> + except:
> + print("time %u prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_pid=%d next_prio=%d" % (
> + event.sample_time, event.prev_pid, event.prev_prio, event.prev_state, event.next_pid, event.next_prio))
>
> if __name__ == '__main__':
> main()
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index 6c5bb5e8893998ae..3eb77bd270077cb3 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -318,13 +318,10 @@ tracepoint_field(const struct pyrf_event *pe, struct tep_format_field *field)
> if (tep_field_is_relative(field->flags))
> offset += field->offset + field->size;
> }
> - if (field->flags & TEP_FIELD_IS_STRING &&
> - is_printable_array(data + offset, len)) {
> + if (field->flags & TEP_FIELD_IS_STRING)
> ret = PyUnicode_FromString((char *)data + offset);
> - } else {
> + else
> ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
> - field->flags &= ~TEP_FIELD_IS_STRING;
> - }
> } else {
> val = tep_read_number(pevent, data + field->offset,
> field->size);
© 2016 - 2025 Red Hat, Inc.