Patch "perf trace: Handle failure when trace point folder is missed" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    perf trace: Handle failure when trace point folder is missed

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     perf-trace-handle-failure-when-trace-point-folder-is.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e8754044c53fb732ac39de056487457de202ddb9
Author: Leo Yan <leo.yan@xxxxxxxxxx>
Date:   Mon Nov 21 07:52:35 2022 +0000

    perf trace: Handle failure when trace point folder is missed
    
    [ Upstream commit 03e9a5d8eb552a1bf692a9c8a5ecd50f4e428006 ]
    
    On Arm64 a case is perf tools fails to find the corresponding trace
    point folder for system calls listed in the table 'syscalltbl_arm64',
    e.g. the generated system call table contains "lookup_dcookie" but we
    cannot find out the matched trace point folder for it.
    
    We need to figure out if there have any issue for the generated system
    call table, on the other hand, we need to handle the case when trace
    point folder is missed under sysfs, this patch sets the flag
    syscall::nonexistent as true and returns the error from
    trace__read_syscall_info().
    
    Another problem is for trace__syscall_info(), it returns two different
    values if a system call doesn't exist: at the first time calling
    trace__syscall_info() it returns NULL when the system call doesn't exist,
    later if call trace__syscall_info() again for the same missed system
    call, it returns pointer of syscall.  trace__syscall_info() checks the
    condition 'syscalls.table[id].name == NULL', but the name will be
    assigned in the first invoking even the system call is not found.
    
    So checking system call's name in trace__syscall_info() is not the right
    thing to do, this patch simply checks flag syscall::nonexistent to make
    decision if a system call exists or not, finally trace__syscall_info()
    returns the consistent result (NULL) if a system call doesn't existed.
    
    Fixes: b8b1033fcaa091d8 ("perf trace: Mark syscall ids that are not allocated to avoid unnecessary error messages")
    Signed-off-by: Leo Yan <leo.yan@xxxxxxxxxx>
    Acked-by: Ian Rogers <irogers@xxxxxxxxxx>
    Cc: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx>
    Cc: bpf@xxxxxxxxxxxxxxx
    Cc: Ingo Molnar <mingo@xxxxxxxxxx>
    Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
    Cc: Mark Rutland <mark.rutland@xxxxxxx>
    Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
    Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221121075237.127706-4-leo.yan@xxxxxxxxxx
    Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index cde14dfad200..73f4a83edc44 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1814,13 +1814,19 @@ static int trace__read_syscall_info(struct trace *trace, int id)
 		sc->tp_format = trace_event__tp_format("syscalls", tp_name);
 	}
 
+	/*
+	 * Fails to read trace point format via sysfs node, so the trace point
+	 * doesn't exist.  Set the 'nonexistent' flag as true.
+	 */
+	if (IS_ERR(sc->tp_format)) {
+		sc->nonexistent = true;
+		return PTR_ERR(sc->tp_format);
+	}
+
 	if (syscall__alloc_arg_fmts(sc, IS_ERR(sc->tp_format) ?
 					RAW_SYSCALL_ARGS_NUM : sc->tp_format->format.nr_fields))
 		return -ENOMEM;
 
-	if (IS_ERR(sc->tp_format))
-		return PTR_ERR(sc->tp_format);
-
 	sc->args = sc->tp_format->format.fields;
 	/*
 	 * We need to check and discard the first variable '__syscall_nr'
@@ -2137,11 +2143,8 @@ static struct syscall *trace__syscall_info(struct trace *trace,
 	    (err = trace__read_syscall_info(trace, id)) != 0)
 		goto out_cant_read;
 
-	if (trace->syscalls.table[id].name == NULL) {
-		if (trace->syscalls.table[id].nonexistent)
-			return NULL;
+	if (trace->syscalls.table && trace->syscalls.table[id].nonexistent)
 		goto out_cant_read;
-	}
 
 	return &trace->syscalls.table[id];
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux