Lines Matching +full:cpu +full:- +full:nr
1 // SPDX-License-Identifier: GPL-2.0
14 #include "parse-events.h"
73 union perf_event *event, const char *comm, int nr) in check_comm() argument
75 if (event->header.type == PERF_RECORD_COMM && in check_comm()
76 (pid_t)event->comm.pid == getpid() && in check_comm()
77 (pid_t)event->comm.tid == getpid() && in check_comm()
78 strcmp(event->comm.comm, comm) == 0) { in check_comm()
79 if (switch_tracking->comm_seen[nr]) { in check_comm()
81 return -1; in check_comm()
83 switch_tracking->comm_seen[nr] = 1; in check_comm()
84 pr_debug3("comm event: %s nr: %d\n", event->comm.comm, nr); in check_comm()
90 static int check_cpu(struct switch_tracking *switch_tracking, int cpu) in check_cpu() argument
92 int i, nr = cpu + 1; in check_cpu() local
94 if (cpu < 0) in check_cpu()
95 return -1; in check_cpu()
97 if (!switch_tracking->tids) { in check_cpu()
98 switch_tracking->tids = calloc(nr, sizeof(pid_t)); in check_cpu()
99 if (!switch_tracking->tids) in check_cpu()
100 return -1; in check_cpu()
101 for (i = 0; i < nr; i++) in check_cpu()
102 switch_tracking->tids[i] = -1; in check_cpu()
103 switch_tracking->nr_tids = nr; in check_cpu()
107 if (cpu >= switch_tracking->nr_tids) { in check_cpu()
110 addr = realloc(switch_tracking->tids, nr * sizeof(pid_t)); in check_cpu()
112 return -1; in check_cpu()
113 switch_tracking->tids = addr; in check_cpu()
114 for (i = switch_tracking->nr_tids; i < nr; i++) in check_cpu()
115 switch_tracking->tids[i] = -1; in check_cpu()
116 switch_tracking->nr_tids = nr; in check_cpu()
130 int cpu, err; in process_sample_event() local
134 return -1; in process_sample_event()
138 if (evsel == switch_tracking->switch_evsel) { in process_sample_event()
141 cpu = sample.cpu; in process_sample_event()
142 pr_debug3("sched_switch: cpu: %d prev_tid %d next_tid %d\n", in process_sample_event()
143 cpu, prev_tid, next_tid); in process_sample_event()
144 err = check_cpu(switch_tracking, cpu); in process_sample_event()
149 * evsel->core.system_wide flag has worked. in process_sample_event()
151 if (switch_tracking->tids[cpu] != -1 && in process_sample_event()
152 switch_tracking->tids[cpu] != prev_tid) { in process_sample_event()
154 return -1; in process_sample_event()
156 switch_tracking->tids[cpu] = next_tid; in process_sample_event()
159 if (evsel == switch_tracking->cycles_evsel) { in process_sample_event()
161 if (!switch_tracking->comm_seen[0]) in process_sample_event()
162 switch_tracking->cycles_before_comm_1 = 1; in process_sample_event()
163 if (switch_tracking->comm_seen[1] && in process_sample_event()
164 !switch_tracking->comm_seen[2]) in process_sample_event()
165 switch_tracking->cycles_between_comm_2_and_comm_3 = 1; in process_sample_event()
166 if (switch_tracking->comm_seen[3]) in process_sample_event()
167 switch_tracking->cycles_after_comm_4 = 1; in process_sample_event()
176 if (event->header.type == PERF_RECORD_SAMPLE) in process_event()
179 if (event->header.type == PERF_RECORD_COMM) { in process_event()
184 return -1; in process_event()
188 return -1; in process_event()
192 return -1; in process_event()
196 return -1; in process_event()
200 return -1; in process_event()
222 return -1; in add_event()
224 node->event = event; in add_event()
225 list_add(&node->list, events); in add_event()
229 return -1; in add_event()
234 return -1; in add_event()
237 node->event_time = sample.time; in add_event()
247 node = list_entry(events->next, struct event_node, list); in free_event_nodes()
248 list_del_init(&node->list); in free_event_nodes()
257 s64 cmp = nodea->event_time - nodeb->event_time; in compar()
272 for (i = 0; i < evlist->core.nr_mmaps; i++) { in process_events()
273 md = &evlist->mmap[i]; in process_events()
274 if (perf_mmap__read_init(&md->core) < 0) in process_events()
277 while ((event = perf_mmap__read_event(&md->core)) != NULL) { in process_events()
280 perf_mmap__consume(&md->core); in process_events()
284 perf_mmap__read_done(&md->core); in process_events()
290 ret = -1; in process_events()
317 * test__switch_tracking - test using sched_switch and tracking events.
321 * evsel->core.system_wide and evsel->tracking flags (respectively) with other events
343 int err = -1; in test__switch_tracking()
345 threads = thread_map__new(-1, getpid(), UINT_MAX); in test__switch_tracking()
363 perf_evlist__set_maps(&evlist->core, cpus, threads); in test__switch_tracking()
366 err = parse_events(evlist, "cpu-clock:u", NULL); in test__switch_tracking()
401 evsel__set_sample_bit(switch_evsel, CPU); in test__switch_tracking()
404 switch_evsel->core.system_wide = true; in test__switch_tracking()
405 switch_evsel->no_aux_samples = true; in test__switch_tracking()
406 switch_evsel->immediate = true; in test__switch_tracking()
419 evsel__set_sample_bit(cycles_evsel, CPU); in test__switch_tracking()
433 tracking_evsel->core.attr.freq = 0; in test__switch_tracking()
434 tracking_evsel->core.attr.sample_period = 1; in test__switch_tracking()
448 if (!tracking_evsel->core.attr.mmap || !tracking_evsel->core.attr.comm) { in test__switch_tracking()
453 /* Check non-tracking events are not tracking */ in test__switch_tracking()
456 if (evsel->core.attr.mmap || evsel->core.attr.comm) { in test__switch_tracking()
457 pr_debug("Non-tracking event is tracking\n"); in test__switch_tracking()
553 /* Check all 4 comm events were seen i.e. that evsel->tracking works */ in test__switch_tracking()
588 err = -1; in test__switch_tracking()