On Fri, Apr 24, 2026 at 3:07 AM Venkat <[email protected]> wrote:
>
>
>
> > On 24 Apr 2026, at 2:57 PM, James Clark <[email protected]> wrote:
> >
> >
> >
> > On 22/04/2026 18:35, Athira Rajeev wrote:
> >> perf sched stats diff fails sometimes with below logs:
> >>  # perf sched stats record ls
> >>  # perf sched stats diff
> >>   *** invalid open64 call: O_CREAT or O_TMPFILE without mode ***: 
> >> terminated
> >>   Aborted (core dumped)
> >> Also in some runs, perf sched stats tests fails
> >>  ./perf test "perf sched stats tests"
> >>  92: perf sched stats tests                                          : 
> >> FAILED!
> >> ==172375== Conditional jump or move depends on uninitialised value(s)
> >> ==172375==    at 0x10393BD0: open_file_read (data.c:264)
> >> ==172375==    by 0x10393F63: open_file (data.c:317)
> >> ==172375==    by 0x10394067: open_file_dup (data.c:334)
> >> ==172375==    by 0x103942DF: perf_data__open (data.c:379)
> >> ==172375==    by 0x102F7CAF: __perf_session__new (session.c:169)
> >> ==172375==    by 0x100B5E63: perf_session__new (session.h:116)
> >> ==172375==    by 0x100D5D37: perf_sched__schedstat_diff 
> >> (builtin-sched.c:4568)
> >> ==172375==    by 0x100D7D6F: cmd_sched (builtin-sched.c:5061)
> >> ==172375==    by 0x1010231F: run_builtin (perf.c:348)
> >> ==172375==    by 0x1010262F: handle_internal_command (perf.c:398)
> >> ==172375==    by 0x1010286F: run_argv (perf.c:442)
> >> ==172375==    by 0x10102C67: main (perf.c:549)
> >> ==172375==
> >> ==172375== Conditional jump or move depends on uninitialised value(s)
> >> ==172375==    at 0x10393D20: open_file_read (data.c:282)
> >> ==172375==    by 0x10393F63: open_file (data.c:317)
> >> ==172375==    by 0x10394067: open_file_dup (data.c:334)
> >> ==172375==    by 0x103942DF: perf_data__open (data.c:379)
> >> ==172375==    by 0x102F7CAF: __perf_session__new (session.c:169)
> >> ==172375==    by 0x100B5E63: perf_session__new (session.h:116)
> >> ==172375==    by 0x100D5D37: perf_sched__schedstat_diff 
> >> (builtin-sched.c:4568)
> >> ==172375==    by 0x100D7D6F: cmd_sched (builtin-sched.c:5061)
> >> ==172375==    by 0x1010231F: run_builtin (perf.c:348)
> >> ==172375==    by 0x1010262F: handle_internal_command (perf.c:398)
> >> ==172375==    by 0x1010286F: run_argv (perf.c:442)
> >> ==172375==    by 0x10102C67: main (perf.c:549)
> >> The valgrind logs and error message from the logs points to
> >> below snippet:
> >>      static int open_file_read(struct perf_data *data)
> >>      {
> >>             int flags = data->in_place_update ? O_RDWR : O_RDONLY;
> >>             struct stat st;
> >>             int fd;
> >>             fd = open(data->file.path, flags);
> >> The "struct perf_data" is defined here :
> >>     static int perf_sched__schedstat_diff(struct perf_sched *sched,
> >>                                       int argc, const char **argv)
> >>     {
> >>         struct cpu_domain_map **cd_map0 = NULL, **cd_map1 = NULL;
> >>         struct list_head cpu_head_ses0, cpu_head_ses1;
> >>         struct perf_session *session[2];
> >>         struct perf_data data[2];
> >>         int ret = 0, err = 0;
> >>         static const char *defaults[] = {
> >>                 "perf.data.old",
> >>                 "perf.data",
> >>         };
> >> Here due to uninitialized "struct perf_data", the arguments to "open"
> >> is getting wrongly passed sometimes depending on value in stack.
> >> When perf_data__open() function calls open_file_read(),the
> >> "in_place_update" could contain garbage value.
> >> After initializing "struct perf_data" in perf_sched__schedstat_diff() 
> >> function,
> >> perf sched stats tests runs without issues in multiple attempts and also
> >> "perf sched stats diff" ran individual without issues.
> >> for i in {0..20}; do ./perf test "perf sched stats tests"; done
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >>  92: perf sched stats tests                                          : Ok
> >> Signed-off-by: Athira Rajeev <[email protected]>
> >> ---
> >>  tools/perf/builtin-sched.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >> diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
> >> index 555247568e7a..5d2740099eed 100644
> >> --- a/tools/perf/builtin-sched.c
> >> +++ b/tools/perf/builtin-sched.c
> >> @@ -4538,7 +4538,7 @@ static int perf_sched__schedstat_diff(struct 
> >> perf_sched *sched,
> >>   struct cpu_domain_map **cd_map0 = NULL, **cd_map1 = NULL;
> >>   struct list_head cpu_head_ses0, cpu_head_ses1;
> >>   struct perf_session *session[2];
> >> - struct perf_data data[2];
> >> + struct perf_data data[2] = { 0 };
> >>   int ret = 0, err = 0;
> >>   static const char *defaults[] = {
> >>   "perf.data.old",
>
> Tested this patch by applying on top of linux mainline kernel and it fixes 
> the issue.
>
> WithOut this Patch:
>
> # ./perf sched stats diff
> *** invalid open64 call: O_CREAT or O_TMPFILE without mode ***: terminated
> Aborted (core dumped)
>
> # ./perf test -v "perf sched stats tests"
> --- start ---
> test child forked, pid 11151
> Basic perf sched stats record test
> Basic perf sched stats record test [Success]
> Basic perf sched stats report test
> [ perf sched stats: Wrote samples to 
> /tmp/__perf_test_sched_stats.perf.data.dysu3 ]
> Basic perf sched stats report test [Success]
> Basic perf sched stats live mode test
> Basic perf sched stats live mode test [Success]
> Basic perf sched stats diff test
> [ perf sched stats: Wrote samples to 
> /tmp/__perf_test_sched_stats.perf.data.dysu3 ]
> [ perf sched stats: Wrote samples to 
> /tmp/__perf_test_sched_stats.perf.data.p0lnk ]
> *** invalid open64 call: O_CREAT or O_TMPFILE without mode ***: terminated
> /linux/tools/perf/tests/shell/perf_sched_stats.sh: line 67: 11170 Aborted     
>             (core dumped) perf sched stats diff "${perfdata}" "${perfdata2}" 
> > /dev/null
> Basic perf sched stats diff test [Failed]
> ---- end(-1) ----
>  92: perf sched stats tests                                          : FAILED!
>
> With This Patch:
>
> #
> for i in {1..20}; do
>     ./perf test "perf sched stats tests"
> done
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>  92: perf sched stats tests                                          : Ok
>
> Please add below tag.
>
> Tested-by: Venkat Rao Bagalkote <[email protected]>

Acked-by: Ian Rogers <[email protected]>

Thanks,
Ian

> Regards,
> Venkat.
> >
> > Reviewed-by: James Clark <[email protected]>
> >
> > I had a quick look for other instances of the same thing and didn't see any.
>
>

Reply via email to