diff options
Diffstat (limited to 'tools/perf/tests')
26 files changed, 242 insertions, 112 deletions
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index e72accefd669..1692529639b0 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -27,7 +27,7 @@ perf-y += wp.o  perf-y += task-exit.o  perf-y += sw-clock.o  perf-y += mmap-thread-lookup.o -perf-y += thread-mg-share.o +perf-y += thread-maps-share.o  perf-y += switch-tracking.o  perf-y += keep-tracking.o  perf-y += code-reading.o @@ -52,8 +52,9 @@ perf-y += perf-hooks.o  perf-y += clang.o  perf-y += unit_number__scnprintf.o  perf-y += mem2node.o -perf-y += map_groups.o +perf-y += maps.o  perf-y += time-utils-test.o +perf-y += genelf.o  $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build  	$(call rule_mkdir) diff --git a/tools/perf/tests/attr/base-record b/tools/perf/tests/attr/base-record index efd0157b9d22..645009c08b3c 100644 --- a/tools/perf/tests/attr/base-record +++ b/tools/perf/tests/attr/base-record @@ -5,7 +5,7 @@ group_fd=-1  flags=0|8  cpu=*  type=0|1 -size=112 +size=120  config=0  sample_period=*  sample_type=263 diff --git a/tools/perf/tests/attr/base-stat b/tools/perf/tests/attr/base-stat index 4d0c2e42b64e..b0f42c34882e 100644 --- a/tools/perf/tests/attr/base-stat +++ b/tools/perf/tests/attr/base-stat @@ -5,7 +5,7 @@ group_fd=-1  flags=0|8  cpu=*  type=0 -size=112 +size=120  config=0  sample_period=0  sample_type=65536 diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/backward-ring-buffer.c index 338cd9faa835..15cea518f5ad 100644 --- a/tools/perf/tests/backward-ring-buffer.c +++ b/tools/perf/tests/backward-ring-buffer.c @@ -13,6 +13,7 @@  #include "util/mmap.h"  #include <errno.h>  #include <linux/string.h> +#include <perf/mmap.h>  #define NR_ITERS 111 @@ -37,8 +38,8 @@ static int count_samples(struct evlist *evlist, int *sample_count,  		struct mmap *map = &evlist->overwrite_mmap[i];  		union perf_event *event; -		perf_mmap__read_init(map); -		while ((event = perf_mmap__read_event(map)) != NULL) { +		perf_mmap__read_init(&map->core); +		while ((event = perf_mmap__read_event(&map->core)) != NULL) {  			const u32 type = event->header.type;  			switch (type) { @@ -53,7 +54,7 @@ static int count_samples(struct evlist *evlist, int *sample_count,  				return TEST_FAIL;  			}  		} -		perf_mmap__read_done(map); +		perf_mmap__read_done(&map->core);  	}  	return TEST_OK;  } @@ -147,6 +148,15 @@ int test__backward_ring_buffer(struct test *test __maybe_unused, int subtest __m  		goto out_delete_evlist;  	} +	evlist__close(evlist); + +	err = evlist__open(evlist); +	if (err < 0) { +		pr_debug("perf_evlist__open: %s\n", +			 str_error_r(errno, sbuf, sizeof(sbuf))); +		goto out_delete_evlist; +	} +  	err = do_test(evlist, 1, &sample_count, &comm_count);  	if (err != TEST_OK)  		goto out_delete_evlist; diff --git a/tools/perf/tests/bp_account.c b/tools/perf/tests/bp_account.c index 016bba2c142d..d0b935356274 100644 --- a/tools/perf/tests/bp_account.c +++ b/tools/perf/tests/bp_account.c @@ -10,11 +10,7 @@  #include <unistd.h>  #include <string.h>  #include <sys/ioctl.h> -#include <time.h>  #include <fcntl.h> -#include <signal.h> -#include <sys/mman.h> -#include <linux/compiler.h>  #include <linux/hw_breakpoint.h>  #include "tests.h" @@ -192,3 +188,19 @@ int test__bp_accounting(struct test *test __maybe_unused, int subtest __maybe_un  	return bp_accounting(wp_cnt, share);  } + +bool test__bp_account_is_supported(void) +{ +	/* +	 * PowerPC and S390 do not support creation of instruction +	 * breakpoints using the perf_event interface. +	 * +	 * Just disable the test for these architectures until these +	 * issues are resolved. +	 */ +#if defined(__powerpc__) || defined(__s390x__) +	return false; +#else +	return true; +#endif +} diff --git a/tools/perf/tests/bp_signal.c b/tools/perf/tests/bp_signal.c index c1c2c13de254..415903b48578 100644 --- a/tools/perf/tests/bp_signal.c +++ b/tools/perf/tests/bp_signal.c @@ -49,14 +49,6 @@ asm (  	"__test_function:\n"  	"incq (%rdi)\n"  	"ret\n"); -#elif defined (__aarch64__) -extern void __test_function(volatile long *ptr); -asm ( -	".globl __test_function\n" -	"__test_function:\n" -	"str x30, [x0]\n" -	"ret\n"); -  #else  static void __test_function(volatile long *ptr)  { @@ -302,10 +294,15 @@ bool test__bp_signal_is_supported(void)  	 * stepping into the SIGIO handler and getting stuck on the  	 * breakpointed instruction.  	 * +	 * Since arm64 has the same issue with arm for the single-step +	 * handling, this case also gets stuck on the breakpointed +	 * instruction. +	 *  	 * Just disable the test for these architectures until these  	 * issues are resolved.  	 */ -#if defined(__powerpc__) || defined(__s390x__) || defined(__arm__) +#if defined(__powerpc__) || defined(__s390x__) || defined(__arm__) || \ +    defined(__aarch64__)  	return false;  #else  	return true; diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c index 1eb0bffaed6c..5d20bf8397f0 100644 --- a/tools/perf/tests/bpf.c +++ b/tools/perf/tests/bpf.c @@ -15,6 +15,7 @@  #include <linux/string.h>  #include <api/fs/fs.h>  #include <bpf/bpf.h> +#include <perf/mmap.h>  #include "tests.h"  #include "llvm.h"  #include "debug.h" @@ -184,16 +185,16 @@ static int do_test(struct bpf_object *obj, int (*func)(void),  		struct mmap *md;  		md = &evlist->mmap[i]; -		if (perf_mmap__read_init(md) < 0) +		if (perf_mmap__read_init(&md->core) < 0)  			continue; -		while ((event = perf_mmap__read_event(md)) != NULL) { +		while ((event = perf_mmap__read_event(&md->core)) != NULL) {  			const u32 type = event->header.type;  			if (type == PERF_RECORD_SAMPLE)  				count ++;  		} -		perf_mmap__read_done(md); +		perf_mmap__read_done(&md->core);  	}  	if (count != expect) { diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index 55774baffc2a..5f05db75cdd8 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -121,7 +121,7 @@ static struct test generic_tests[] = {  	{  		.desc = "Breakpoint accounting",  		.func = test__bp_accounting, -		.is_supported = test__bp_signal_is_supported, +		.is_supported = test__bp_account_is_supported,  	},  	{  		.desc = "Watchpoint", @@ -166,8 +166,8 @@ static struct test generic_tests[] = {  		.func = test__mmap_thread_lookup,  	},  	{ -		.desc = "Share thread mg", -		.func = test__thread_mg_share, +		.desc = "Share thread maps", +		.func = test__thread_maps_share,  	},  	{  		.desc = "Sort output of hist entries", @@ -260,6 +260,11 @@ static struct test generic_tests[] = {  		.func = test__cpu_map_print,  	},  	{ +		.desc = "Merge cpu map", +		.func = test__cpu_map_merge, +	}, + +	{  		.desc = "Probe SDT events",  		.func = test__sdt_event,  	}, @@ -297,8 +302,12 @@ static struct test generic_tests[] = {  		.func = test__time_utils,  	},  	{ -		.desc = "map_groups__merge_in", -		.func = test__map_groups__merge_in, +		.desc = "Test jit_write_elf", +		.func = test__jit_write_elf, +	}, +	{ +		.desc = "maps__merge_in", +		.func = test__maps__merge_in,  	},  	{  		.func = NULL, diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c index f5764a3890b9..6fe221d31f07 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -10,6 +10,7 @@  #include <sys/param.h>  #include <perf/cpumap.h>  #include <perf/evlist.h> +#include <perf/mmap.h>  #include "debug.h"  #include "dso.h" @@ -275,7 +276,7 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,  		len = al.map->end - addr;  	/* Read the object code using perf */ -	ret_len = dso__data_read_offset(al.map->dso, thread->mg->machine, +	ret_len = dso__data_read_offset(al.map->dso, thread->maps->machine,  					al.addr, buf1, len);  	if (ret_len != len) {  		pr_debug("dso__data_read_offset failed\n"); @@ -425,16 +426,16 @@ static int process_events(struct machine *machine, struct evlist *evlist,  	for (i = 0; i < evlist->core.nr_mmaps; i++) {  		md = &evlist->mmap[i]; -		if (perf_mmap__read_init(md) < 0) +		if (perf_mmap__read_init(&md->core) < 0)  			continue; -		while ((event = perf_mmap__read_event(md)) != NULL) { +		while ((event = perf_mmap__read_event(&md->core)) != NULL) {  			ret = process_event(machine, evlist, event, state); -			perf_mmap__consume(md); +			perf_mmap__consume(&md->core);  			if (ret < 0)  				return ret;  		} -		perf_mmap__read_done(md); +		perf_mmap__read_done(&md->core);  	}  	return 0;  } diff --git a/tools/perf/tests/cpumap.c b/tools/perf/tests/cpumap.c index 8a0d236202b0..4ac56741ac5f 100644 --- a/tools/perf/tests/cpumap.c +++ b/tools/perf/tests/cpumap.c @@ -120,3 +120,19 @@ int test__cpu_map_print(struct test *test __maybe_unused, int subtest __maybe_un  	TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1-10,12-20,22-30,32-40"));  	return 0;  } + +int test__cpu_map_merge(struct test *test __maybe_unused, int subtest __maybe_unused) +{ +	struct perf_cpu_map *a = perf_cpu_map__new("4,2,1"); +	struct perf_cpu_map *b = perf_cpu_map__new("4,5,7"); +	struct perf_cpu_map *c = perf_cpu_map__merge(a, b); +	char buf[100]; + +	TEST_ASSERT_VAL("failed to merge map: bad nr", c->nr == 5); +	cpu_map__snprint(c, buf, sizeof(buf)); +	TEST_ASSERT_VAL("failed to merge map: bad result", !strcmp(buf, "1-2,4-5,7")); +	perf_cpu_map__put(a); +	perf_cpu_map__put(b); +	perf_cpu_map__put(c); +	return 0; +} diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c index 4f4ecbcbe87e..779ce280a0e9 100644 --- a/tools/perf/tests/dwarf-unwind.c +++ b/tools/perf/tests/dwarf-unwind.c @@ -59,7 +59,7 @@ int test_dwarf_unwind__krava_1(struct thread *thread);  static int unwind_entry(struct unwind_entry *entry, void *arg)  {  	unsigned long *cnt = (unsigned long *) arg; -	char *symbol = entry->sym ? entry->sym->name : NULL; +	char *symbol = entry->ms.sym ? entry->ms.sym->name : NULL;  	static const char *funcs[MAX_STACK] = {  		"test__arch_unwind_sample",  		"test_dwarf_unwind__thread", diff --git a/tools/perf/tests/event-times.c b/tools/perf/tests/event-times.c index 1ee8704e2284..1e8a9f5c356d 100644 --- a/tools/perf/tests/event-times.c +++ b/tools/perf/tests/event-times.c @@ -125,7 +125,7 @@ static int attach__cpu_disabled(struct evlist *evlist)  	evsel->core.attr.disabled = 1; -	err = perf_evsel__open_per_cpu(evsel, cpus); +	err = perf_evsel__open_per_cpu(evsel, cpus, -1);  	if (err) {  		if (err == -EACCES)  			return TEST_SKIP; @@ -152,7 +152,7 @@ static int attach__cpu_enabled(struct evlist *evlist)  		return -1;  	} -	err = perf_evsel__open_per_cpu(evsel, cpus); +	err = perf_evsel__open_per_cpu(evsel, cpus, -1);  	if (err == -EACCES)  		return TEST_SKIP; diff --git a/tools/perf/tests/genelf.c b/tools/perf/tests/genelf.c new file mode 100644 index 000000000000..f797f9823e89 --- /dev/null +++ b/tools/perf/tests/genelf.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <linux/compiler.h> + +#include "debug.h" +#include "tests.h" + +#ifdef HAVE_JITDUMP +#include <libelf.h> +#include "../util/genelf.h" +#endif + +#define TEMPL "/tmp/perf-test-XXXXXX" + +int test__jit_write_elf(struct test *test __maybe_unused, +			int subtest __maybe_unused) +{ +#ifdef HAVE_JITDUMP +	static unsigned char x86_code[] = { +		0xBB, 0x2A, 0x00, 0x00, 0x00, /* movl $42, %ebx */ +		0xB8, 0x01, 0x00, 0x00, 0x00, /* movl $1, %eax */ +		0xCD, 0x80            /* int $0x80 */ +	}; +	char path[PATH_MAX]; +	int fd, ret; + +	strcpy(path, TEMPL); + +	fd = mkstemp(path); +	if (fd < 0) { +		perror("mkstemp failed"); +		return TEST_FAIL; +	} + +	pr_info("Writing jit code to: %s\n", path); + +	ret = jit_write_elf(fd, 0, "main", x86_code, sizeof(x86_code), +			NULL, 0, NULL, 0, 0); +	close(fd); + +	unlink(path); + +	return ret ? TEST_FAIL : 0; +#else +	return TEST_SKIP; +#endif +} diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-tracking.c index 92c7d591bcac..50a0c9fcde7d 100644 --- a/tools/perf/tests/keep-tracking.c +++ b/tools/perf/tests/keep-tracking.c @@ -5,6 +5,7 @@  #include <sys/prctl.h>  #include <perf/cpumap.h>  #include <perf/evlist.h> +#include <perf/mmap.h>  #include "debug.h"  #include "parse-events.h" @@ -38,17 +39,17 @@ static int find_comm(struct evlist *evlist, const char *comm)  	found = 0;  	for (i = 0; i < evlist->core.nr_mmaps; i++) {  		md = &evlist->mmap[i]; -		if (perf_mmap__read_init(md) < 0) +		if (perf_mmap__read_init(&md->core) < 0)  			continue; -		while ((event = perf_mmap__read_event(md)) != NULL) { +		while ((event = perf_mmap__read_event(&md->core)) != NULL) {  			if (event->header.type == PERF_RECORD_COMM &&  			    (pid_t)event->comm.pid == getpid() &&  			    (pid_t)event->comm.tid == getpid() &&  			    strcmp(event->comm.comm, comm) == 0)  				found += 1; -			perf_mmap__consume(md); +			perf_mmap__consume(&md->core);  		} -		perf_mmap__read_done(md); +		perf_mmap__read_done(&md->core);  	}  	return found;  } diff --git a/tools/perf/tests/map_groups.c b/tools/perf/tests/maps.c index 594fdaca4f71..edcbc70ff9d6 100644 --- a/tools/perf/tests/map_groups.c +++ b/tools/perf/tests/maps.c @@ -3,7 +3,7 @@  #include <linux/kernel.h>  #include "tests.h"  #include "map.h" -#include "map_groups.h" +#include "maps.h"  #include "dso.h"  #include "debug.h" @@ -13,30 +13,29 @@ struct map_def {  	u64 end;  }; -static int check_maps(struct map_def *merged, unsigned int size, struct map_groups *mg) +static int check_maps(struct map_def *merged, unsigned int size, struct maps *maps)  {  	struct map *map;  	unsigned int i = 0; -	map = map_groups__first(mg); -	while (map) { +	maps__for_each_entry(maps, map) { +		if (i > 0) +			TEST_ASSERT_VAL("less maps expected", (map && i < size) || (!map && i == size)); +  		TEST_ASSERT_VAL("wrong map start",  map->start == merged[i].start);  		TEST_ASSERT_VAL("wrong map end",    map->end == merged[i].end);  		TEST_ASSERT_VAL("wrong map name",  !strcmp(map->dso->name, merged[i].name)); -		TEST_ASSERT_VAL("wrong map refcnt", refcount_read(&map->refcnt) == 2); +		TEST_ASSERT_VAL("wrong map refcnt", refcount_read(&map->refcnt) == 1);  		i++; -		map = map_groups__next(map); - -		TEST_ASSERT_VAL("less maps expected", (map && i < size) || (!map && i == size));  	}  	return TEST_OK;  } -int test__map_groups__merge_in(struct test *t __maybe_unused, int subtest __maybe_unused) +int test__maps__merge_in(struct test *t __maybe_unused, int subtest __maybe_unused)  { -	struct map_groups mg; +	struct maps maps;  	unsigned int i;  	struct map_def bpf_progs[] = {  		{ "bpf_prog_1", 200, 300 }, @@ -65,7 +64,7 @@ int test__map_groups__merge_in(struct test *t __maybe_unused, int subtest __mayb  	struct map *map_kcore1, *map_kcore2, *map_kcore3;  	int ret; -	map_groups__init(&mg, NULL); +	maps__init(&maps, NULL);  	for (i = 0; i < ARRAY_SIZE(bpf_progs); i++) {  		struct map *map; @@ -75,7 +74,7 @@ int test__map_groups__merge_in(struct test *t __maybe_unused, int subtest __mayb  		map->start = bpf_progs[i].start;  		map->end   = bpf_progs[i].end; -		map_groups__insert(&mg, map); +		maps__insert(&maps, map);  		map__put(map);  	} @@ -100,22 +99,22 @@ int test__map_groups__merge_in(struct test *t __maybe_unused, int subtest __mayb  	map_kcore3->start = 880;  	map_kcore3->end   = 1100; -	ret = map_groups__merge_in(&mg, map_kcore1); +	ret = maps__merge_in(&maps, map_kcore1);  	TEST_ASSERT_VAL("failed to merge map", !ret); -	ret = check_maps(merged12, ARRAY_SIZE(merged12), &mg); +	ret = check_maps(merged12, ARRAY_SIZE(merged12), &maps);  	TEST_ASSERT_VAL("merge check failed", !ret); -	ret = map_groups__merge_in(&mg, map_kcore2); +	ret = maps__merge_in(&maps, map_kcore2);  	TEST_ASSERT_VAL("failed to merge map", !ret); -	ret = check_maps(merged12, ARRAY_SIZE(merged12), &mg); +	ret = check_maps(merged12, ARRAY_SIZE(merged12), &maps);  	TEST_ASSERT_VAL("merge check failed", !ret); -	ret = map_groups__merge_in(&mg, map_kcore3); +	ret = maps__merge_in(&maps, map_kcore3);  	TEST_ASSERT_VAL("failed to merge map", !ret); -	ret = check_maps(merged3, ARRAY_SIZE(merged3), &mg); +	ret = check_maps(merged3, ARRAY_SIZE(merged3), &maps);  	TEST_ASSERT_VAL("merge check failed", !ret);  	return TEST_OK;  } diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c index 3a22dce991ba..5f4c0dbb4715 100644 --- a/tools/perf/tests/mmap-basic.c +++ b/tools/perf/tests/mmap-basic.c @@ -16,6 +16,7 @@  #include <linux/kernel.h>  #include <linux/string.h>  #include <perf/evlist.h> +#include <perf/mmap.h>  /*   * This test will generate random numbers of calls to some getpid syscalls, @@ -113,10 +114,10 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse  		}  	md = &evlist->mmap[0]; -	if (perf_mmap__read_init(md) < 0) +	if (perf_mmap__read_init(&md->core) < 0)  		goto out_init; -	while ((event = perf_mmap__read_event(md)) != NULL) { +	while ((event = perf_mmap__read_event(&md->core)) != NULL) {  		struct perf_sample sample;  		if (event->header.type != PERF_RECORD_SAMPLE) { @@ -139,9 +140,9 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse  			goto out_delete_evlist;  		}  		nr_events[evsel->idx]++; -		perf_mmap__consume(md); +		perf_mmap__consume(&md->core);  	} -	perf_mmap__read_done(md); +	perf_mmap__read_done(&md->core);  out_init:  	err = 0; diff --git a/tools/perf/tests/openat-syscall-tp-fields.c b/tools/perf/tests/openat-syscall-tp-fields.c index 2b5c46813053..c6b2d7aab608 100644 --- a/tools/perf/tests/openat-syscall-tp-fields.c +++ b/tools/perf/tests/openat-syscall-tp-fields.c @@ -13,6 +13,7 @@  #include "debug.h"  #include "util/mmap.h"  #include <errno.h> +#include <perf/mmap.h>  #ifndef O_DIRECTORY  #define O_DIRECTORY    00200000 @@ -92,10 +93,10 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest  			struct mmap *md;  			md = &evlist->mmap[i]; -			if (perf_mmap__read_init(md) < 0) +			if (perf_mmap__read_init(&md->core) < 0)  				continue; -			while ((event = perf_mmap__read_event(md)) != NULL) { +			while ((event = perf_mmap__read_event(&md->core)) != NULL) {  				const u32 type = event->header.type;  				int tp_flags;  				struct perf_sample sample; @@ -103,7 +104,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest  				++nr_events;  				if (type != PERF_RECORD_SAMPLE) { -					perf_mmap__consume(md); +					perf_mmap__consume(&md->core);  					continue;  				} @@ -123,7 +124,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest  				goto out_ok;  			} -			perf_mmap__read_done(md); +			perf_mmap__read_done(&md->core);  		}  		if (nr_events == before) diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index 25e0ed2eedfc..091c3aeccc27 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -1768,10 +1768,11 @@ static struct terms_test test__terms[] = {  static int test_event(struct evlist_test *e)  { -	struct parse_events_error err = { .idx = 0, }; +	struct parse_events_error err;  	struct evlist *evlist;  	int ret; +	bzero(&err, sizeof(err));  	if (e->valid && !e->valid()) {  		pr_debug("... SKIP");  		return 0; diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c index 437426be29e9..2195fc205e72 100644 --- a/tools/perf/tests/perf-record.c +++ b/tools/perf/tests/perf-record.c @@ -6,6 +6,7 @@  #include <pthread.h>  #include <sched.h> +#include <perf/mmap.h>  #include "evlist.h"  #include "evsel.h"  #include "debug.h" @@ -170,10 +171,10 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unus  			struct mmap *md;  			md = &evlist->mmap[i]; -			if (perf_mmap__read_init(md) < 0) +			if (perf_mmap__read_init(&md->core) < 0)  				continue; -			while ((event = perf_mmap__read_event(md)) != NULL) { +			while ((event = perf_mmap__read_event(&md->core)) != NULL) {  				const u32 type = event->header.type;  				const char *name = perf_event__name(type); @@ -276,9 +277,9 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unus  					++errs;  				} -				perf_mmap__consume(md); +				perf_mmap__consume(&md->core);  			} -			perf_mmap__read_done(md); +			perf_mmap__read_done(&md->core);  		}  		/* diff --git a/tools/perf/tests/sample-parsing.c b/tools/perf/tests/sample-parsing.c index 3a02426db9a6..2762e1155238 100644 --- a/tools/perf/tests/sample-parsing.c +++ b/tools/perf/tests/sample-parsing.c @@ -150,6 +150,15 @@ static bool samples_same(const struct perf_sample *s1,  	if (type & PERF_SAMPLE_PHYS_ADDR)  		COMP(phys_addr); +	if (type & PERF_SAMPLE_AUX) { +		COMP(aux_sample.size); +		if (memcmp(s1->aux_sample.data, s2->aux_sample.data, +			   s1->aux_sample.size)) { +			pr_debug("Samples differ at 'aux_sample'\n"); +			return false; +		} +	} +  	return true;  } @@ -182,6 +191,7 @@ static int do_test(u64 sample_type, u64 sample_regs, u64 read_format)  	u64 regs[64];  	const u64 raw_data[] = {0x123456780a0b0c0dULL, 0x1102030405060708ULL};  	const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL}; +	const u64 aux_data[] = {0xa55a, 0, 0xeeddee, 0x0282028202820282};  	struct perf_sample sample = {  		.ip		= 101,  		.pid		= 102, @@ -218,6 +228,10 @@ static int do_test(u64 sample_type, u64 sample_regs, u64 read_format)  			.regs	= regs,  		},  		.phys_addr	= 113, +		.aux_sample	= { +			.size	= sizeof(aux_data), +			.data	= (void *)aux_data, +		},  	};  	struct sample_read_value values[] = {{1, 5}, {9, 3}, {2, 7}, {6, 4},};  	struct perf_sample sample_out; @@ -317,7 +331,7 @@ int test__sample_parsing(struct test *test __maybe_unused, int subtest __maybe_u  	 * were added.  Please actually update the test rather than just change  	 * the condition below.  	 */ -	if (PERF_SAMPLE_MAX > PERF_SAMPLE_PHYS_ADDR << 1) { +	if (PERF_SAMPLE_MAX > PERF_SAMPLE_AUX << 1) {  		pr_debug("sample format has changed, some new PERF_SAMPLE_ bit was introduced - test needs updating\n");  		return -1;  	} diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c index 84519df87f30..bfb9986093d8 100644 --- a/tools/perf/tests/sw-clock.c +++ b/tools/perf/tests/sw-clock.c @@ -15,6 +15,7 @@  #include "util/mmap.h"  #include "util/thread_map.h"  #include <perf/evlist.h> +#include <perf/mmap.h>  #define NR_LOOPS  10000000 @@ -99,10 +100,10 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)  	evlist__disable(evlist);  	md = &evlist->mmap[0]; -	if (perf_mmap__read_init(md) < 0) +	if (perf_mmap__read_init(&md->core) < 0)  		goto out_init; -	while ((event = perf_mmap__read_event(md)) != NULL) { +	while ((event = perf_mmap__read_event(&md->core)) != NULL) {  		struct perf_sample sample;  		if (event->header.type != PERF_RECORD_SAMPLE) @@ -117,9 +118,9 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)  		total_periods += sample.period;  		nr_samples++;  next_event: -		perf_mmap__consume(md); +		perf_mmap__consume(&md->core);  	} -	perf_mmap__read_done(md); +	perf_mmap__read_done(&md->core);  out_init:  	if ((u64) nr_samples == total_periods) { diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c index ffa592e0020e..fcb0d03dba4e 100644 --- a/tools/perf/tests/switch-tracking.c +++ b/tools/perf/tests/switch-tracking.c @@ -8,6 +8,7 @@  #include <linux/zalloc.h>  #include <perf/cpumap.h>  #include <perf/evlist.h> +#include <perf/mmap.h>  #include "debug.h"  #include "parse-events.h" @@ -269,17 +270,17 @@ static int process_events(struct evlist *evlist,  	for (i = 0; i < evlist->core.nr_mmaps; i++) {  		md = &evlist->mmap[i]; -		if (perf_mmap__read_init(md) < 0) +		if (perf_mmap__read_init(&md->core) < 0)  			continue; -		while ((event = perf_mmap__read_event(md)) != NULL) { +		while ((event = perf_mmap__read_event(&md->core)) != NULL) {  			cnt += 1;  			ret = add_event(evlist, &events, event); -			 perf_mmap__consume(md); +			 perf_mmap__consume(&md->core);  			if (ret < 0)  				goto out_free_nodes;  		} -		perf_mmap__read_done(md); +		perf_mmap__read_done(&md->core);  	}  	events_array = calloc(cnt, sizeof(struct event_node)); diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c index bce3a4cb4c89..adaff9044331 100644 --- a/tools/perf/tests/task-exit.c +++ b/tools/perf/tests/task-exit.c @@ -12,6 +12,7 @@  #include <linux/string.h>  #include <perf/cpumap.h>  #include <perf/evlist.h> +#include <perf/mmap.h>  static int exited;  static int nr_exit; @@ -53,6 +54,7 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused  	struct perf_cpu_map *cpus;  	struct perf_thread_map *threads;  	struct mmap *md; +	int retry_count = 0;  	signal(SIGCHLD, sig_handler); @@ -110,6 +112,7 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused  	if (evlist__mmap(evlist, 128) < 0) {  		pr_debug("failed to mmap events: %d (%s)\n", errno,  			 str_error_r(errno, sbuf, sizeof(sbuf))); +		err = -1;  		goto out_delete_evlist;  	} @@ -117,20 +120,27 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused  retry:  	md = &evlist->mmap[0]; -	if (perf_mmap__read_init(md) < 0) +	if (perf_mmap__read_init(&md->core) < 0)  		goto out_init; -	while ((event = perf_mmap__read_event(md)) != NULL) { +	while ((event = perf_mmap__read_event(&md->core)) != NULL) {  		if (event->header.type == PERF_RECORD_EXIT)  			nr_exit++; -		perf_mmap__consume(md); +		perf_mmap__consume(&md->core);  	} -	perf_mmap__read_done(md); +	perf_mmap__read_done(&md->core);  out_init:  	if (!exited || !nr_exit) {  		evlist__poll(evlist, -1); + +		if (retry_count++ > 1000) { +			pr_debug("Failed after retrying 1000 times\n"); +			err = -1; +			goto out_free_maps; +		} +  		goto retry;  	} diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index 72912eb473cb..9a160fef47c9 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -73,7 +73,7 @@ int test__dwarf_unwind(struct test *test, int subtest);  int test__expr(struct test *test, int subtest);  int test__hists_filter(struct test *test, int subtest);  int test__mmap_thread_lookup(struct test *test, int subtest); -int test__thread_mg_share(struct test *test, int subtest); +int test__thread_maps_share(struct test *test, int subtest);  int test__hists_output(struct test *test, int subtest);  int test__hists_cumulate(struct test *test, int subtest);  int test__switch_tracking(struct test *test, int subtest); @@ -98,6 +98,7 @@ int test__event_update(struct test *test, int subtest);  int test__event_times(struct test *test, int subtest);  int test__backward_ring_buffer(struct test *test, int subtest);  int test__cpu_map_print(struct test *test, int subtest); +int test__cpu_map_merge(struct test *test, int subtest);  int test__sdt_event(struct test *test, int subtest);  int test__is_printable_array(struct test *test, int subtest);  int test__bitmap_print(struct test *test, int subtest); @@ -107,10 +108,12 @@ const char *test__clang_subtest_get_desc(int subtest);  int test__clang_subtest_get_nr(void);  int test__unit_number__scnprint(struct test *test, int subtest);  int test__mem2node(struct test *t, int subtest); -int test__map_groups__merge_in(struct test *t, int subtest); +int test__maps__merge_in(struct test *t, int subtest);  int test__time_utils(struct test *t, int subtest); +int test__jit_write_elf(struct test *test, int subtest);  bool test__bp_signal_is_supported(void); +bool test__bp_account_is_supported(void);  bool test__wp_is_supported(void);  #if defined(__arm__) || defined(__aarch64__) diff --git a/tools/perf/tests/thread-mg-share.c b/tools/perf/tests/thread-maps-share.c index cbac71716dec..9371484973f2 100644 --- a/tools/perf/tests/thread-mg-share.c +++ b/tools/perf/tests/thread-maps-share.c @@ -4,7 +4,7 @@  #include "thread.h"  #include "debug.h" -int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_unused) +int test__thread_maps_share(struct test *test __maybe_unused, int subtest __maybe_unused)  {  	struct machines machines;  	struct machine *machine; @@ -12,16 +12,16 @@ int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_  	/* thread group */  	struct thread *leader;  	struct thread *t1, *t2, *t3; -	struct map_groups *mg; +	struct maps *maps;  	/* other process */  	struct thread *other, *other_leader; -	struct map_groups *other_mg; +	struct maps *other_maps;  	/*  	 * This test create 2 processes abstractions (struct thread)  	 * with several threads and checks they properly share and -	 * maintain map groups info (struct map_groups). +	 * maintain maps info (struct maps).  	 *  	 * thread group (pid: 0, tids: 0, 1, 2, 3)  	 * other  group (pid: 4, tids: 4, 5) @@ -42,17 +42,17 @@ int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_  	TEST_ASSERT_VAL("failed to create threads",  			leader && t1 && t2 && t3 && other); -	mg = leader->mg; -	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 4); +	maps = leader->maps; +	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&maps->refcnt), 4); -	/* test the map groups pointer is shared */ -	TEST_ASSERT_VAL("map groups don't match", mg == t1->mg); -	TEST_ASSERT_VAL("map groups don't match", mg == t2->mg); -	TEST_ASSERT_VAL("map groups don't match", mg == t3->mg); +	/* test the maps pointer is shared */ +	TEST_ASSERT_VAL("maps don't match", maps == t1->maps); +	TEST_ASSERT_VAL("maps don't match", maps == t2->maps); +	TEST_ASSERT_VAL("maps don't match", maps == t3->maps);  	/*  	 * Verify the other leader was created by previous call. -	 * It should have shared map groups with no change in +	 * It should have shared maps with no change in  	 * refcnt.  	 */  	other_leader = machine__find_thread(machine, 4, 4); @@ -70,26 +70,26 @@ int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_  	machine__remove_thread(machine, other);  	machine__remove_thread(machine, other_leader); -	other_mg = other->mg; -	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg->refcnt), 2); +	other_maps = other->maps; +	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_maps->refcnt), 2); -	TEST_ASSERT_VAL("map groups don't match", other_mg == other_leader->mg); +	TEST_ASSERT_VAL("maps don't match", other_maps == other_leader->maps);  	/* release thread group */  	thread__put(leader); -	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 3); +	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&maps->refcnt), 3);  	thread__put(t1); -	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 2); +	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&maps->refcnt), 2);  	thread__put(t2); -	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 1); +	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&maps->refcnt), 1);  	thread__put(t3);  	/* release other group  */  	thread__put(other_leader); -	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg->refcnt), 1); +	TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_maps->refcnt), 1);  	thread__put(other); diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c index aa296ffea6d1..193b7c91b4e2 100644 --- a/tools/perf/tests/vmlinux-kallsyms.c +++ b/tools/perf/tests/vmlinux-kallsyms.c @@ -182,7 +182,7 @@ next_pair:  	header_printed = false; -	for (map = maps__first(maps); map; map = map__next(map)) { +	maps__for_each_entry(maps, map) {  		struct map *  		/*  		 * If it is the kernel, kallsyms is always "[kernel.kallsyms]", while @@ -190,10 +190,9 @@ next_pair:  		 * so use the short name, less descriptive but the same ("[kernel]" in  		 * both cases.  		 */ -		pair = map_groups__find_by_name(&kallsyms.kmaps, -						(map->dso->kernel ? -							map->dso->short_name : -							map->dso->name)); +		pair = maps__find_by_name(&kallsyms.kmaps, (map->dso->kernel ? +								map->dso->short_name : +								map->dso->name));  		if (pair) {  			pair->priv = 1;  		} else { @@ -207,13 +206,13 @@ next_pair:  	header_printed = false; -	for (map = maps__first(maps); map; map = map__next(map)) { +	maps__for_each_entry(maps, map) {  		struct map *pair;  		mem_start = vmlinux_map->unmap_ip(vmlinux_map, map->start);  		mem_end = vmlinux_map->unmap_ip(vmlinux_map, map->end); -		pair = map_groups__find(&kallsyms.kmaps, mem_start); +		pair = maps__find(&kallsyms.kmaps, mem_start);  		if (pair == NULL || pair->priv)  			continue; @@ -237,7 +236,7 @@ next_pair:  	maps = machine__kernel_maps(&kallsyms); -	for (map = maps__first(maps); map; map = map__next(map)) { +	maps__for_each_entry(maps, map) {  		if (!map->priv) {  			if (!header_printed) {  				pr_info("WARN: Maps only in kallsyms:\n");  |