^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <sys/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <sys/prctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include "tests.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "thread_map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "event.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "util/synthetic-events.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/zalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <perf/event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct perf_sample;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) struct perf_tool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) struct machine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define NAME (const char *) "perf"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define NAMEUL (unsigned long) NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) int test__thread_map(struct test *test __maybe_unused, int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct perf_thread_map *map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) TEST_ASSERT_VAL("failed to set process name",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) !prctl(PR_SET_NAME, NAMEUL, 0, 0, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* test map on current pid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) map = thread_map__new_by_pid(getpid());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) TEST_ASSERT_VAL("failed to alloc map", map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) thread_map__read_comms(map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) TEST_ASSERT_VAL("wrong nr", map->nr == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) TEST_ASSERT_VAL("wrong pid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) perf_thread_map__pid(map, 0) == getpid());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) TEST_ASSERT_VAL("wrong comm",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) perf_thread_map__comm(map, 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) !strcmp(perf_thread_map__comm(map, 0), NAME));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) TEST_ASSERT_VAL("wrong refcnt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) refcount_read(&map->refcnt) == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) perf_thread_map__put(map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* test dummy pid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) map = perf_thread_map__new_dummy();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) TEST_ASSERT_VAL("failed to alloc map", map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) thread_map__read_comms(map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) TEST_ASSERT_VAL("wrong nr", map->nr == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) TEST_ASSERT_VAL("wrong pid", perf_thread_map__pid(map, 0) == -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) TEST_ASSERT_VAL("wrong comm",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) perf_thread_map__comm(map, 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) !strcmp(perf_thread_map__comm(map, 0), "dummy"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) TEST_ASSERT_VAL("wrong refcnt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) refcount_read(&map->refcnt) == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) perf_thread_map__put(map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) static int process_event(struct perf_tool *tool __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) union perf_event *event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct perf_sample *sample __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct machine *machine __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct perf_record_thread_map *map = &event->thread_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct perf_thread_map *threads;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) TEST_ASSERT_VAL("wrong nr", map->nr == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) TEST_ASSERT_VAL("wrong pid", map->entries[0].pid == (u64) getpid());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) TEST_ASSERT_VAL("wrong comm", !strcmp(map->entries[0].comm, NAME));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) threads = thread_map__new_event(&event->thread_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) TEST_ASSERT_VAL("failed to alloc map", threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) TEST_ASSERT_VAL("wrong nr", threads->nr == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) TEST_ASSERT_VAL("wrong pid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) perf_thread_map__pid(threads, 0) == getpid());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) TEST_ASSERT_VAL("wrong comm",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) perf_thread_map__comm(threads, 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) !strcmp(perf_thread_map__comm(threads, 0), NAME));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) TEST_ASSERT_VAL("wrong refcnt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) refcount_read(&threads->refcnt) == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) perf_thread_map__put(threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) int test__thread_map_synthesize(struct test *test __maybe_unused, int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct perf_thread_map *threads;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) TEST_ASSERT_VAL("failed to set process name",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) !prctl(PR_SET_NAME, NAMEUL, 0, 0, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* test map on current pid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) threads = thread_map__new_by_pid(getpid());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) TEST_ASSERT_VAL("failed to alloc map", threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) thread_map__read_comms(threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) TEST_ASSERT_VAL("failed to synthesize map",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) !perf_event__synthesize_thread_map2(NULL, threads, process_event, NULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int test__thread_map_remove(struct test *test __maybe_unused, int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct perf_thread_map *threads;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) char *str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) TEST_ASSERT_VAL("failed to allocate map string",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) asprintf(&str, "%d,%d", getpid(), getppid()) >= 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) threads = thread_map__new_str(str, NULL, 0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) TEST_ASSERT_VAL("failed to allocate thread_map",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) if (verbose > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) thread_map__fprintf(threads, stderr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) TEST_ASSERT_VAL("failed to remove thread",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) !thread_map__remove(threads, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) TEST_ASSERT_VAL("thread_map count != 1", threads->nr == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (verbose > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) thread_map__fprintf(threads, stderr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) TEST_ASSERT_VAL("failed to remove thread",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) !thread_map__remove(threads, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) TEST_ASSERT_VAL("thread_map count != 0", threads->nr == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (verbose > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) thread_map__fprintf(threads, stderr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) TEST_ASSERT_VAL("failed to not remove thread",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) thread_map__remove(threads, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) for (i = 0; i < threads->nr; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) zfree(&threads->map[i].comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) free(threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }