Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf annotate: Fix arch specific ->init() failure errors

They are called from symbol__annotate() and to propagate errors that can
help understand the problem make them return what
symbol__strerror_disassemble() known, i.e. errno codes and other
annotation specific errors in a special, out of errnos, range.

Reported-by: Russell King - ARM Linux admin <linux@armlinux.org.uk>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
Cc: Will Deacon <will@kernel.org>
Link: https://lkml.kernel.org/n/tip-pqx7srcv7tixgid251aeboj6@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

+20 -8
+2 -2
tools/perf/arch/arm/annotate/instructions.c
··· 37 37 38 38 arm = zalloc(sizeof(*arm)); 39 39 if (!arm) 40 - return -1; 40 + return ENOMEM; 41 41 42 42 #define ARM_CONDS "(cc|cs|eq|ge|gt|hi|le|ls|lt|mi|ne|pl|vc|vs)" 43 43 err = regcomp(&arm->call_insn, "^blx?" ARM_CONDS "?$", REG_EXTENDED); ··· 59 59 regfree(&arm->call_insn); 60 60 out_free_arm: 61 61 free(arm); 62 - return -1; 62 + return SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP; 63 63 }
+2 -2
tools/perf/arch/arm64/annotate/instructions.c
··· 95 95 96 96 arm = zalloc(sizeof(*arm)); 97 97 if (!arm) 98 - return -1; 98 + return ENOMEM; 99 99 100 100 /* bl, blr */ 101 101 err = regcomp(&arm->call_insn, "^blr?$", REG_EXTENDED); ··· 118 118 regfree(&arm->call_insn); 119 119 out_free_arm: 120 120 free(arm); 121 - return -1; 121 + return SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP; 122 122 }
+4 -2
tools/perf/arch/s390/annotate/instructions.c
··· 164 164 if (!arch->initialized) { 165 165 arch->initialized = true; 166 166 arch->associate_instruction_ops = s390__associate_ins_ops; 167 - if (cpuid) 168 - err = s390__cpuid_parse(arch, cpuid); 167 + if (cpuid) { 168 + if (s390__cpuid_parse(arch, cpuid)) 169 + err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING; 170 + } 169 171 } 170 172 171 173 return err;
+4 -2
tools/perf/arch/x86/annotate/instructions.c
··· 196 196 if (arch->initialized) 197 197 return 0; 198 198 199 - if (cpuid) 200 - err = x86__cpuid_parse(arch, cpuid); 199 + if (cpuid) { 200 + if (x86__cpuid_parse(arch, cpuid)) 201 + err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING; 202 + } 201 203 202 204 arch->initialized = true; 203 205 return err;
+6
tools/perf/util/annotate.c
··· 1631 1631 case SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF: 1632 1632 scnprintf(buf, buflen, "Please link with binutils's libopcode to enable BPF annotation"); 1633 1633 break; 1634 + case SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP: 1635 + scnprintf(buf, buflen, "Problems with arch specific instruction name regular expressions."); 1636 + break; 1637 + case SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING: 1638 + scnprintf(buf, buflen, "Problems while parsing the CPUID in the arch specific initialization."); 1639 + break; 1634 1640 default: 1635 1641 scnprintf(buf, buflen, "Internal error: Invalid %d error code\n", errnum); 1636 1642 break;
+2
tools/perf/util/annotate.h
··· 370 370 371 371 SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX = __SYMBOL_ANNOTATE_ERRNO__START, 372 372 SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF, 373 + SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING, 374 + SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP, 373 375 374 376 __SYMBOL_ANNOTATE_ERRNO__END, 375 377 };