Commit e941933c authored by Alexei Starovoitov's avatar Alexei Starovoitov
Browse files

Merge branch 'selftests/bpf: Add read_build_id function'

Jiri Olsa says:

====================

hi,
this selftests cleanup was previously posted as part of file build id changes [1],
which might take more time, so I'm sending the selftests changes separately so it
won't get stuck.

v4 changes:
  - added size argument to read_build_id [Andrii]
  - condition changes in parse_build_id_buf [Andrii]
  - use ELF_C_READ_MMAP in elf_begin [Andrii]
  - return -ENOENT in read_build_id if build id is not found [Andrii]
  - dropped elf class check [Andrii]

thanks,
jirka

[1] https://lore.kernel.org/bpf/20230316170149.4106586-1-jolsa@kernel.org/


====================

Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents 67efbd57 dcc46f51
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -7,13 +7,12 @@ void test_stacktrace_build_id(void)

	int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd;
	struct test_stacktrace_build_id *skel;
	int err, stack_trace_len;
	int err, stack_trace_len, build_id_size;
	__u32 key, prev_key, val, duration = 0;
	char buf[256];
	int i, j;
	char buf[BPF_BUILD_ID_SIZE];
	struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH];
	int build_id_matches = 0;
	int retry = 1;
	int i, retry = 1;

retry:
	skel = test_stacktrace_build_id__open_and_load();
@@ -52,9 +51,10 @@ void test_stacktrace_build_id(void)
		  "err %d errno %d\n", err, errno))
		goto cleanup;

	err = extract_build_id(buf, 256);
	build_id_size = read_build_id("urandom_read", buf, sizeof(buf));
	err = build_id_size < 0 ? build_id_size : 0;

	if (CHECK(err, "get build_id with readelf",
	if (CHECK(err, "read_build_id",
		  "err %d errno %d\n", err, errno))
		goto cleanup;

@@ -64,8 +64,6 @@ void test_stacktrace_build_id(void)
		goto cleanup;

	do {
		char build_id[64];

		err = bpf_map_lookup_elem(stackmap_fd, &key, id_offs);
		if (CHECK(err, "lookup_elem from stackmap",
			  "err %d, errno %d\n", err, errno))
@@ -73,10 +71,7 @@ void test_stacktrace_build_id(void)
		for (i = 0; i < PERF_MAX_STACK_DEPTH; ++i)
			if (id_offs[i].status == BPF_STACK_BUILD_ID_VALID &&
			    id_offs[i].offset != 0) {
				for (j = 0; j < 20; ++j)
					sprintf(build_id + 2 * j, "%02x",
						id_offs[i].build_id[j] & 0xff);
				if (strstr(buf, build_id) != NULL)
				if (memcmp(buf, id_offs[i].build_id, build_id_size) == 0)
					build_id_matches = 1;
			}
		prev_key = key;
+6 −11
Original line number Diff line number Diff line
@@ -28,11 +28,10 @@ void test_stacktrace_build_id_nmi(void)
		.config = PERF_COUNT_HW_CPU_CYCLES,
	};
	__u32 key, prev_key, val, duration = 0;
	char buf[256];
	int i, j;
	char buf[BPF_BUILD_ID_SIZE];
	struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH];
	int build_id_matches = 0;
	int retry = 1;
	int build_id_matches = 0, build_id_size;
	int i, retry = 1;

	attr.sample_freq = read_perf_max_sample_freq();

@@ -94,7 +93,8 @@ void test_stacktrace_build_id_nmi(void)
		  "err %d errno %d\n", err, errno))
		goto cleanup;

	err = extract_build_id(buf, 256);
	build_id_size = read_build_id("urandom_read", buf, sizeof(buf));
	err = build_id_size < 0 ? build_id_size : 0;

	if (CHECK(err, "get build_id with readelf",
		  "err %d errno %d\n", err, errno))
@@ -106,8 +106,6 @@ void test_stacktrace_build_id_nmi(void)
		goto cleanup;

	do {
		char build_id[64];

		err = bpf_map__lookup_elem(skel->maps.stackmap, &key, sizeof(key),
					   id_offs, sizeof(id_offs), 0);
		if (CHECK(err, "lookup_elem from stackmap",
@@ -116,10 +114,7 @@ void test_stacktrace_build_id_nmi(void)
		for (i = 0; i < PERF_MAX_STACK_DEPTH; ++i)
			if (id_offs[i].status == BPF_STACK_BUILD_ID_VALID &&
			    id_offs[i].offset != 0) {
				for (j = 0; j < 20; ++j)
					sprintf(build_id + 2 * j, "%02x",
						id_offs[i].build_id[j] & 0xff);
				if (strstr(buf, build_id) != NULL)
				if (memcmp(buf, id_offs[i].build_id, build_id_size) == 0)
					build_id_matches = 1;
			}
		prev_key = key;
+18 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ERR_H__
#define __ERR_H__

#define MAX_ERRNO 4095
#define IS_ERR_VALUE(x) (unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO

static inline int IS_ERR_OR_NULL(const void *ptr)
{
	return !ptr || IS_ERR_VALUE((unsigned long)ptr);
}

static inline long PTR_ERR(const void *ptr)
{
	return (long) ptr;
}

#endif /* __ERR_H__ */
+1 −2
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <bpf/bpf_tracing.h>

#include "profiler.h"
#include "err.h"

#ifndef NULL
#define NULL 0
@@ -16,7 +17,6 @@
#define O_DIRECTORY 00200000
#define __O_TMPFILE 020000000
#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
#define MAX_ERRNO 4095
#define S_IFMT 00170000
#define S_IFSOCK 0140000
#define S_IFLNK 0120000
@@ -34,7 +34,6 @@
#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK)
#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO)
#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK)
#define IS_ERR_VALUE(x) (unsigned long)(void*)(x) >= (unsigned long)-MAX_ERRNO

#define KILL_DATA_ARRAY_SIZE 8

+0 −25
Original line number Diff line number Diff line
@@ -629,31 +629,6 @@ int compare_stack_ips(int smap_fd, int amap_fd, int stack_trace_len)
	return err;
}

int extract_build_id(char *build_id, size_t size)
{
	FILE *fp;
	char *line = NULL;
	size_t len = 0;

	fp = popen("readelf -n ./urandom_read | grep 'Build ID'", "r");
	if (fp == NULL)
		return -1;

	if (getline(&line, &len, fp) == -1)
		goto err;
	pclose(fp);

	if (len > size)
		len = size;
	memcpy(build_id, line, len);
	build_id[len] = '\0';
	free(line);
	return 0;
err:
	pclose(fp);
	return -1;
}

static int finit_module(int fd, const char *param_values, int flags)
{
	return syscall(__NR_finit_module, fd, param_values, flags);
Loading