]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf header: Write bpf_prog (infos|btfs)_cnt to data file
authorThomas Falcon <thomas.falcon@intel.com>
Fri, 7 Nov 2025 17:31:50 +0000 (11:31 -0600)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 13 Nov 2025 20:16:33 +0000 (17:16 -0300)
With commit f0d0f978f3f5830a ("perf header: Don't write empty BPF/BTF
info"), the write_bpf_( prog_info() | btf() ) functions exit without
writing anything if env->bpf_prog.(infos| btfs)_cnt is zero.

process_bpf_( prog_info() | btf() ), however, still expect a "count"
value to exist in the data file. If btf information is empty, for
example, process_bpf_btf will read garbage or some other data as the
number of btf nodes in the data file. As a result, the data file will
not be processed correctly.

Instead, write the count to the data file and exit if it is zero.

Fixes: f0d0f978f3f5830a ("perf header: Don't write empty BPF/BTF info")
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Thomas Falcon <thomas.falcon@intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/header.c

index 4f2a6e10ed5cc0bd63213e04e28e8ecb4cf7053e..4e12be579140aa71b933689e1749f2059827c24c 100644 (file)
@@ -1022,12 +1022,9 @@ static int write_bpf_prog_info(struct feat_fd *ff,
 
        down_read(&env->bpf_progs.lock);
 
-       if (env->bpf_progs.infos_cnt == 0)
-               goto out;
-
        ret = do_write(ff, &env->bpf_progs.infos_cnt,
                       sizeof(env->bpf_progs.infos_cnt));
-       if (ret < 0)
+       if (ret < 0 || env->bpf_progs.infos_cnt == 0)
                goto out;
 
        root = &env->bpf_progs.infos;
@@ -1067,13 +1064,10 @@ static int write_bpf_btf(struct feat_fd *ff,
 
        down_read(&env->bpf_progs.lock);
 
-       if (env->bpf_progs.btfs_cnt == 0)
-               goto out;
-
        ret = do_write(ff, &env->bpf_progs.btfs_cnt,
                       sizeof(env->bpf_progs.btfs_cnt));
 
-       if (ret < 0)
+       if (ret < 0 || env->bpf_progs.btfs_cnt == 0)
                goto out;
 
        root = &env->bpf_progs.btfs;