mirror of https://github.com/torvalds/linux.git
perf tools fixes for v6.18: 2nd batch
- Fix writing bpf_prog (infos|btfs)_cnt to data file, to not generate invalid perf.data files in some corner cases. - Fix 'perf top' segfault by ensuring libbfd is initialized. This is an opt-in feature due to license incompatibilities. - Fix segfault in 'perf lock' due to missing kernel map. - Fix 'perf lock contention' test. - Don't fail fast path detection if binutils-devel isn't available. - Sync KVM's vmx.h with the kernel to pick SEAMCALL exit reason. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCaRokLwAKCRCyPKLppCJ+ JwEYAQDuSXq1QraQr4ADvGpLAGVyWCxnXbhNqSmcCVB07OO5AQEA69kNlvoKHm3L ml2BiY6MMRQAXaTs4vi9hJnEdSnzcg0= =vvjd -----END PGP SIGNATURE----- Merge tag 'perf-tools-fixes-for-v6.18-2-2025-11-16' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools Pull perf tools fixes from Arnaldo Carvalho de Melo: - Fix writing bpf_prog (infos|btfs)_cnt to data file, to not generate invalid perf.data files in some corner cases. - Fix 'perf top' segfault by ensuring libbfd is initialized. This is an opt-in feature due to license incompatibilities. - Fix segfault in 'perf lock' due to missing kernel map. - Fix 'perf lock contention' test. - Don't fail fast path detection if binutils-devel isn't available. - Sync KVM's vmx.h with the kernel to pick SEAMCALL exit reason. * tag 'perf-tools-fixes-for-v6.18-2-2025-11-16' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: perf libbfd: Ensure libbfd is initialized prior to use perf test: Fix lock contention test perf lock: Fix segfault due to missing kernel map tools headers UAPI: Sync KVM's vmx.h with the kernel to pick SEAMCALL exit reason perf build: Don't fail fast path feature detection when binutils-devel is not available perf header: Write bpf_prog (infos|btfs)_cnt to data file
This commit is contained in:
commit
998ccc327b
|
|
@ -93,6 +93,7 @@
|
|||
#define EXIT_REASON_TPAUSE 68
|
||||
#define EXIT_REASON_BUS_LOCK 74
|
||||
#define EXIT_REASON_NOTIFY 75
|
||||
#define EXIT_REASON_SEAMCALL 76
|
||||
#define EXIT_REASON_TDCALL 77
|
||||
#define EXIT_REASON_MSR_READ_IMM 84
|
||||
#define EXIT_REASON_MSR_WRITE_IMM 85
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ all: $(FILES)
|
|||
__BUILD = $(CC) $(CFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.c,$(@F)) $(LDFLAGS)
|
||||
BUILD = $(__BUILD) > $(@:.bin=.make.output) 2>&1
|
||||
BUILD_BFD = $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl
|
||||
BUILD_ALL = $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -lslang $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl -lz -llzma -lzstd
|
||||
BUILD_ALL = $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -lslang $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -ldl -lz -llzma -lzstd
|
||||
|
||||
__BUILDXX = $(CXX) $(CXXFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.cpp,$(@F)) $(LDFLAGS)
|
||||
BUILDXX = $(__BUILDXX) > $(@:.bin=.make.output) 2>&1
|
||||
|
|
@ -115,7 +115,7 @@ __BUILDXX = $(CXX) $(CXXFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.cpp,$(
|
|||
###############################
|
||||
|
||||
$(OUTPUT)test-all.bin:
|
||||
$(BUILD_ALL) || $(BUILD_ALL) -lopcodes -liberty
|
||||
$(BUILD_ALL)
|
||||
|
||||
$(OUTPUT)test-hello.bin:
|
||||
$(BUILD)
|
||||
|
|
|
|||
|
|
@ -354,9 +354,6 @@ FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS)
|
|||
|
||||
FEATURE_CHECK_LDFLAGS-libaio = -lrt
|
||||
|
||||
FEATURE_CHECK_LDFLAGS-disassembler-four-args = -lbfd -lopcodes -ldl
|
||||
FEATURE_CHECK_LDFLAGS-disassembler-init-styled = -lbfd -lopcodes -ldl
|
||||
|
||||
CORE_CFLAGS += -fno-omit-frame-pointer
|
||||
CORE_CFLAGS += -Wall
|
||||
CORE_CFLAGS += -Wextra
|
||||
|
|
@ -930,6 +927,8 @@ ifdef BUILD_NONDISTRO
|
|||
|
||||
ifeq ($(feature-libbfd), 1)
|
||||
EXTLIBS += -lbfd -lopcodes
|
||||
FEATURE_CHECK_LDFLAGS-disassembler-four-args = -lbfd -lopcodes -ldl
|
||||
FEATURE_CHECK_LDFLAGS-disassembler-init-styled = -lbfd -lopcodes -ldl
|
||||
else
|
||||
# we are on a system that requires -liberty and (maybe) -lz
|
||||
# to link against -lbfd; test each case individually here
|
||||
|
|
|
|||
|
|
@ -1867,6 +1867,7 @@ static int __cmd_report(bool display_info)
|
|||
eops.sample = process_sample_event;
|
||||
eops.comm = perf_event__process_comm;
|
||||
eops.mmap = perf_event__process_mmap;
|
||||
eops.mmap2 = perf_event__process_mmap2;
|
||||
eops.namespaces = perf_event__process_namespaces;
|
||||
eops.tracing_data = perf_event__process_tracing_data;
|
||||
session = perf_session__new(&data, &eops);
|
||||
|
|
@ -2023,6 +2024,7 @@ static int __cmd_contention(int argc, const char **argv)
|
|||
eops.sample = process_sample_event;
|
||||
eops.comm = perf_event__process_comm;
|
||||
eops.mmap = perf_event__process_mmap;
|
||||
eops.mmap2 = perf_event__process_mmap2;
|
||||
eops.tracing_data = perf_event__process_tracing_data;
|
||||
|
||||
perf_env__init(&host_env);
|
||||
|
|
|
|||
|
|
@ -13,15 +13,18 @@ cleanup() {
|
|||
rm -f ${perfdata}
|
||||
rm -f ${result}
|
||||
rm -f ${errout}
|
||||
trap - EXIT TERM INT
|
||||
trap - EXIT TERM INT ERR
|
||||
}
|
||||
|
||||
trap_cleanup() {
|
||||
if (( $? == 139 )); then #SIGSEGV
|
||||
err=1
|
||||
fi
|
||||
echo "Unexpected signal in ${FUNCNAME[1]}"
|
||||
cleanup
|
||||
exit ${err}
|
||||
}
|
||||
trap trap_cleanup EXIT TERM INT
|
||||
trap trap_cleanup EXIT TERM INT ERR
|
||||
|
||||
check() {
|
||||
if [ "$(id -u)" != 0 ]; then
|
||||
|
|
@ -145,7 +148,7 @@ test_aggr_cgroup()
|
|||
fi
|
||||
|
||||
# the perf lock contention output goes to the stderr
|
||||
perf lock con -a -b -g -E 1 -q -- perf bench sched messaging -p > /dev/null 2> ${result}
|
||||
perf lock con -a -b --lock-cgroup -E 1 -q -- perf bench sched messaging -p > /dev/null 2> ${result}
|
||||
if [ "$(cat "${result}" | wc -l)" != "1" ]; then
|
||||
echo "[Fail] BPF result count is not 1:" "$(cat "${result}" | wc -l)"
|
||||
err=1
|
||||
|
|
@ -271,7 +274,7 @@ test_cgroup_filter()
|
|||
return
|
||||
fi
|
||||
|
||||
perf lock con -a -b -g -E 1 -F wait_total -q -- perf bench sched messaging -p > /dev/null 2> ${result}
|
||||
perf lock con -a -b --lock-cgroup -E 1 -F wait_total -q -- perf bench sched messaging -p > /dev/null 2> ${result}
|
||||
if [ "$(cat "${result}" | wc -l)" != "1" ]; then
|
||||
echo "[Fail] BPF result should have a cgroup result:" "$(cat "${result}")"
|
||||
err=1
|
||||
|
|
@ -279,7 +282,7 @@ test_cgroup_filter()
|
|||
fi
|
||||
|
||||
cgroup=$(cat "${result}" | awk '{ print $3 }')
|
||||
perf lock con -a -b -g -E 1 -G "${cgroup}" -q -- perf bench sched messaging -p > /dev/null 2> ${result}
|
||||
perf lock con -a -b --lock-cgroup -E 1 -G "${cgroup}" -q -- perf bench sched messaging -p > /dev/null 2> ${result}
|
||||
if [ "$(cat "${result}" | wc -l)" != "1" ]; then
|
||||
echo "[Fail] BPF result should have a result with cgroup filter:" "$(cat "${cgroup}")"
|
||||
err=1
|
||||
|
|
@ -338,4 +341,5 @@ test_aggr_task_stack_filter
|
|||
test_cgroup_filter
|
||||
test_csv_output
|
||||
|
||||
cleanup
|
||||
exit ${err}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,39 @@ struct a2l_data {
|
|||
asymbol **syms;
|
||||
};
|
||||
|
||||
static bool perf_bfd_lock(void *bfd_mutex)
|
||||
{
|
||||
mutex_lock(bfd_mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool perf_bfd_unlock(void *bfd_mutex)
|
||||
{
|
||||
mutex_unlock(bfd_mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void perf_bfd_init(void)
|
||||
{
|
||||
static struct mutex bfd_mutex;
|
||||
|
||||
mutex_init_recursive(&bfd_mutex);
|
||||
|
||||
if (bfd_init() != BFD_INIT_MAGIC) {
|
||||
pr_err("Error initializing libbfd\n");
|
||||
return;
|
||||
}
|
||||
if (!bfd_thread_init(perf_bfd_lock, perf_bfd_unlock, &bfd_mutex))
|
||||
pr_err("Error initializing libbfd threading\n");
|
||||
}
|
||||
|
||||
static void ensure_bfd_init(void)
|
||||
{
|
||||
static pthread_once_t bfd_init_once = PTHREAD_ONCE_INIT;
|
||||
|
||||
pthread_once(&bfd_init_once, perf_bfd_init);
|
||||
}
|
||||
|
||||
static int bfd_error(const char *string)
|
||||
{
|
||||
const char *errmsg;
|
||||
|
|
@ -132,6 +165,7 @@ static struct a2l_data *addr2line_init(const char *path)
|
|||
bfd *abfd;
|
||||
struct a2l_data *a2l = NULL;
|
||||
|
||||
ensure_bfd_init();
|
||||
abfd = bfd_openr(path, NULL);
|
||||
if (abfd == NULL)
|
||||
return NULL;
|
||||
|
|
@ -288,6 +322,7 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
|
|||
bfd *abfd;
|
||||
u64 start, len;
|
||||
|
||||
ensure_bfd_init();
|
||||
abfd = bfd_openr(debugfile, NULL);
|
||||
if (!abfd)
|
||||
return -1;
|
||||
|
|
@ -393,6 +428,7 @@ int libbfd__read_build_id(const char *filename, struct build_id *bid, bool block
|
|||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
ensure_bfd_init();
|
||||
abfd = bfd_fdopenr(filename, /*target=*/NULL, fd);
|
||||
if (!abfd)
|
||||
return -1;
|
||||
|
|
@ -421,6 +457,7 @@ int libbfd_filename__read_debuglink(const char *filename, char *debuglink,
|
|||
asection *section;
|
||||
bfd *abfd;
|
||||
|
||||
ensure_bfd_init();
|
||||
abfd = bfd_openr(filename, NULL);
|
||||
if (!abfd)
|
||||
return -1;
|
||||
|
|
@ -480,6 +517,7 @@ int symbol__disassemble_bpf_libbfd(struct symbol *sym __maybe_unused,
|
|||
memset(tpath, 0, sizeof(tpath));
|
||||
perf_exe(tpath, sizeof(tpath));
|
||||
|
||||
ensure_bfd_init();
|
||||
bfdf = bfd_openr(tpath, NULL);
|
||||
if (bfdf == NULL)
|
||||
abort();
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ static void check_err(const char *fn, int err)
|
|||
|
||||
#define CHECK_ERR(err) check_err(__func__, err)
|
||||
|
||||
static void __mutex_init(struct mutex *mtx, bool pshared)
|
||||
static void __mutex_init(struct mutex *mtx, bool pshared, bool recursive)
|
||||
{
|
||||
pthread_mutexattr_t attr;
|
||||
|
||||
|
|
@ -27,21 +27,27 @@ static void __mutex_init(struct mutex *mtx, bool pshared)
|
|||
/* In normal builds enable error checking, such as recursive usage. */
|
||||
CHECK_ERR(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK));
|
||||
#endif
|
||||
if (recursive)
|
||||
CHECK_ERR(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE));
|
||||
if (pshared)
|
||||
CHECK_ERR(pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED));
|
||||
|
||||
CHECK_ERR(pthread_mutex_init(&mtx->lock, &attr));
|
||||
CHECK_ERR(pthread_mutexattr_destroy(&attr));
|
||||
}
|
||||
|
||||
void mutex_init(struct mutex *mtx)
|
||||
{
|
||||
__mutex_init(mtx, /*pshared=*/false);
|
||||
__mutex_init(mtx, /*pshared=*/false, /*recursive=*/false);
|
||||
}
|
||||
|
||||
void mutex_init_pshared(struct mutex *mtx)
|
||||
{
|
||||
__mutex_init(mtx, /*pshared=*/true);
|
||||
__mutex_init(mtx, /*pshared=*/true, /*recursive=*/false);
|
||||
}
|
||||
|
||||
void mutex_init_recursive(struct mutex *mtx)
|
||||
{
|
||||
__mutex_init(mtx, /*pshared=*/false, /*recursive=*/true);
|
||||
}
|
||||
|
||||
void mutex_destroy(struct mutex *mtx)
|
||||
|
|
|
|||
|
|
@ -104,6 +104,8 @@ void mutex_init(struct mutex *mtx);
|
|||
* process-private attribute.
|
||||
*/
|
||||
void mutex_init_pshared(struct mutex *mtx);
|
||||
/* Initializes a mutex that may be recursively held on the same thread. */
|
||||
void mutex_init_recursive(struct mutex *mtx);
|
||||
void mutex_destroy(struct mutex *mtx);
|
||||
|
||||
void mutex_lock(struct mutex *mtx) EXCLUSIVE_LOCK_FUNCTION(*mtx);
|
||||
|
|
|
|||
Loading…
Reference in New Issue