3 #include "thread_map.h"
13 static void sig_handler(int sig __maybe_unused
)
19 * perf_evlist__prepare_workload will send a SIGUSR1 if the fork fails, since
20 * we asked by setting its exec_error to this handler.
22 static void workload_exec_failed_signal(int signo __maybe_unused
,
23 siginfo_t
*info __maybe_unused
,
24 void *ucontext __maybe_unused
)
31 * This test will start a workload that does nothing then it checks
32 * if the number of exit event reported by the kernel is 1 or not
33 * in order to check the kernel returns correct number of event.
35 int test__task_exit(int subtest __maybe_unused
)
38 union perf_event
*event
;
39 struct perf_evsel
*evsel
;
40 struct perf_evlist
*evlist
;
41 struct target target
= {
45 const char *argv
[] = { "true", NULL
};
46 char sbuf
[STRERR_BUFSIZE
];
48 struct thread_map
*threads
;
50 signal(SIGCHLD
, sig_handler
);
52 evlist
= perf_evlist__new_default();
54 pr_debug("perf_evlist__new_default\n");
59 * Create maps of threads and cpus to monitor. In this case
60 * we start with all threads and cpus (-1, -1) but then in
61 * perf_evlist__prepare_workload we'll fill in the only thread
62 * we're monitoring, the one forked there.
64 cpus
= cpu_map__dummy_new();
65 threads
= thread_map__new_by_tid(-1);
66 if (!cpus
|| !threads
) {
68 pr_debug("Not enough memory to create thread/cpu maps\n");
72 perf_evlist__set_maps(evlist
, cpus
, threads
);
77 err
= perf_evlist__prepare_workload(evlist
, &target
, argv
, false,
78 workload_exec_failed_signal
);
80 pr_debug("Couldn't run the workload!\n");
81 goto out_delete_evlist
;
84 evsel
= perf_evlist__first(evlist
);
86 evsel
->attr
.sample_freq
= 1;
87 evsel
->attr
.inherit
= 0;
88 evsel
->attr
.watermark
= 0;
89 evsel
->attr
.wakeup_events
= 1;
90 evsel
->attr
.exclude_kernel
= 1;
92 err
= perf_evlist__open(evlist
);
94 pr_debug("Couldn't open the evlist: %s\n",
95 str_error_r(-err
, sbuf
, sizeof(sbuf
)));
96 goto out_delete_evlist
;
99 if (perf_evlist__mmap(evlist
, 128, true) < 0) {
100 pr_debug("failed to mmap events: %d (%s)\n", errno
,
101 str_error_r(errno
, sbuf
, sizeof(sbuf
)));
102 goto out_delete_evlist
;
105 perf_evlist__start_workload(evlist
);
108 while ((event
= perf_evlist__mmap_read(evlist
, 0)) != NULL
) {
109 if (event
->header
.type
== PERF_RECORD_EXIT
)
112 perf_evlist__mmap_consume(evlist
, 0);
115 if (!exited
|| !nr_exit
) {
116 perf_evlist__poll(evlist
, -1);
121 pr_debug("received %d EXIT records\n", nr_exit
);
127 thread_map__put(threads
);
129 perf_evlist__delete(evlist
);