evlist.c 45.2 KB
Newer Older
1 2 3 4 5 6 7 8
/*
 * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
 *
 * Parts came from builtin-{top,stat,record}.c, see those files for further
 * copyright notes.
 *
 * Released under the GPL v2. (and only v2, not any later version)
 */
9
#include "util.h"
10
#include <api/fs/fs.h>
11
#include <poll.h>
12 13
#include "cpumap.h"
#include "thread_map.h"
14
#include "target.h"
15 16
#include "evlist.h"
#include "evsel.h"
A
Adrian Hunter 已提交
17
#include "debug.h"
18
#include <unistd.h>
19

20
#include "parse-events.h"
21
#include <subcmd/parse-options.h>
22

23 24
#include <sys/mman.h>

25 26
#include <linux/bitops.h>
#include <linux/hash.h>
27
#include <linux/log2.h>
28
#include <linux/err.h>
29

30
static void perf_mmap__munmap(struct perf_mmap *map);
31
static void perf_mmap__put(struct perf_mmap *map);
32

33
#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
34
#define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
35

36 37
void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
		       struct thread_map *threads)
38 39 40 41 42 43
{
	int i;

	for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i)
		INIT_HLIST_HEAD(&evlist->heads[i]);
	INIT_LIST_HEAD(&evlist->entries);
44
	perf_evlist__set_maps(evlist, cpus, threads);
45
	fdarray__init(&evlist->pollfd, 64);
46
	evlist->workload.pid = -1;
47 48
}

49
struct perf_evlist *perf_evlist__new(void)
50 51 52
{
	struct perf_evlist *evlist = zalloc(sizeof(*evlist));

53
	if (evlist != NULL)
54
		perf_evlist__init(evlist, NULL, NULL);
55 56 57 58

	return evlist;
}

59 60 61 62 63 64 65 66 67 68 69 70
struct perf_evlist *perf_evlist__new_default(void)
{
	struct perf_evlist *evlist = perf_evlist__new();

	if (evlist && perf_evlist__add_default(evlist)) {
		perf_evlist__delete(evlist);
		evlist = NULL;
	}

	return evlist;
}

71 72 73 74 75 76 77 78 79 80 81 82
struct perf_evlist *perf_evlist__new_dummy(void)
{
	struct perf_evlist *evlist = perf_evlist__new();

	if (evlist && perf_evlist__add_dummy(evlist)) {
		perf_evlist__delete(evlist);
		evlist = NULL;
	}

	return evlist;
}

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
/**
 * perf_evlist__set_id_pos - set the positions of event ids.
 * @evlist: selected event list
 *
 * Events with compatible sample types all have the same id_pos
 * and is_pos.  For convenience, put a copy on evlist.
 */
void perf_evlist__set_id_pos(struct perf_evlist *evlist)
{
	struct perf_evsel *first = perf_evlist__first(evlist);

	evlist->id_pos = first->id_pos;
	evlist->is_pos = first->is_pos;
}

98 99 100 101
static void perf_evlist__update_id_pos(struct perf_evlist *evlist)
{
	struct perf_evsel *evsel;

102
	evlist__for_each_entry(evlist, evsel)
103 104 105 106 107
		perf_evsel__calc_id_pos(evsel);

	perf_evlist__set_id_pos(evlist);
}

108 109 110 111
static void perf_evlist__purge(struct perf_evlist *evlist)
{
	struct perf_evsel *pos, *n;

112
	evlist__for_each_entry_safe(evlist, n, pos) {
113
		list_del_init(&pos->node);
114
		pos->evlist = NULL;
115 116 117 118 119 120
		perf_evsel__delete(pos);
	}

	evlist->nr_entries = 0;
}

121
void perf_evlist__exit(struct perf_evlist *evlist)
122
{
123
	zfree(&evlist->mmap);
124
	zfree(&evlist->backward_mmap);
125
	fdarray__exit(&evlist->pollfd);
126 127 128 129
}

void perf_evlist__delete(struct perf_evlist *evlist)
{
130 131 132
	if (evlist == NULL)
		return;

133
	perf_evlist__munmap(evlist);
134
	perf_evlist__close(evlist);
135
	cpu_map__put(evlist->cpus);
136
	thread_map__put(evlist->threads);
137 138
	evlist->cpus = NULL;
	evlist->threads = NULL;
139 140
	perf_evlist__purge(evlist);
	perf_evlist__exit(evlist);
141 142 143
	free(evlist);
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
					  struct perf_evsel *evsel)
{
	/*
	 * We already have cpus for evsel (via PMU sysfs) so
	 * keep it, if there's no target cpu list defined.
	 */
	if (!evsel->own_cpus || evlist->has_user_cpus) {
		cpu_map__put(evsel->cpus);
		evsel->cpus = cpu_map__get(evlist->cpus);
	} else if (evsel->cpus != evsel->own_cpus) {
		cpu_map__put(evsel->cpus);
		evsel->cpus = cpu_map__get(evsel->own_cpus);
	}

	thread_map__put(evsel->threads);
	evsel->threads = thread_map__get(evlist->threads);
}

static void perf_evlist__propagate_maps(struct perf_evlist *evlist)
{
	struct perf_evsel *evsel;

167
	evlist__for_each_entry(evlist, evsel)
168 169 170
		__perf_evlist__propagate_maps(evlist, evsel);
}

171 172
void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
{
173
	entry->evlist = evlist;
174
	list_add_tail(&entry->node, &evlist->entries);
175
	entry->idx = evlist->nr_entries;
176
	entry->tracking = !entry->idx;
177

178 179
	if (!evlist->nr_entries++)
		perf_evlist__set_id_pos(evlist);
180 181

	__perf_evlist__propagate_maps(evlist, entry);
182 183
}

184 185 186 187 188 189 190
void perf_evlist__remove(struct perf_evlist *evlist, struct perf_evsel *evsel)
{
	evsel->evlist = NULL;
	list_del_init(&evsel->node);
	evlist->nr_entries -= 1;
}

191
void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
192
				   struct list_head *list)
193
{
194
	struct perf_evsel *evsel, *temp;
195

196
	__evlist__for_each_entry_safe(list, temp, evsel) {
197 198 199
		list_del_init(&evsel->node);
		perf_evlist__add(evlist, evsel);
	}
200 201
}

202 203 204 205 206
void __perf_evlist__set_leader(struct list_head *list)
{
	struct perf_evsel *evsel, *leader;

	leader = list_entry(list->next, struct perf_evsel, node);
207 208 209
	evsel = list_entry(list->prev, struct perf_evsel, node);

	leader->nr_members = evsel->idx - leader->idx + 1;
210

211
	__evlist__for_each_entry(list, evsel) {
212
		evsel->leader = leader;
213 214 215 216
	}
}

void perf_evlist__set_leader(struct perf_evlist *evlist)
217
{
218 219
	if (evlist->nr_entries) {
		evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0;
220
		__perf_evlist__set_leader(&evlist->entries);
221
	}
222 223
}

224
void perf_event_attr__set_max_precise_ip(struct perf_event_attr *attr)
225 226 227 228 229 230 231 232 233 234 235 236 237
{
	attr->precise_ip = 3;

	while (attr->precise_ip != 0) {
		int fd = sys_perf_event_open(attr, 0, -1, -1, 0);
		if (fd != -1) {
			close(fd);
			break;
		}
		--attr->precise_ip;
	}
}

238 239 240 241 242 243
int perf_evlist__add_default(struct perf_evlist *evlist)
{
	struct perf_event_attr attr = {
		.type = PERF_TYPE_HARDWARE,
		.config = PERF_COUNT_HW_CPU_CYCLES,
	};
244 245 246
	struct perf_evsel *evsel;

	event_attr_init(&attr);
247

248 249
	perf_event_attr__set_max_precise_ip(&attr);

250
	evsel = perf_evsel__new(&attr);
251
	if (evsel == NULL)
252 253
		goto error;

254 255 256
	/* use asprintf() because free(evsel) assumes name is allocated */
	if (asprintf(&evsel->name, "cycles%.*s",
		     attr.precise_ip ? attr.precise_ip + 1 : 0, ":ppp") < 0)
257
		goto error_free;
258 259 260

	perf_evlist__add(evlist, evsel);
	return 0;
261 262 263 264
error_free:
	perf_evsel__delete(evsel);
error:
	return -ENOMEM;
265
}
266

267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
int perf_evlist__add_dummy(struct perf_evlist *evlist)
{
	struct perf_event_attr attr = {
		.type	= PERF_TYPE_SOFTWARE,
		.config = PERF_COUNT_SW_DUMMY,
		.size	= sizeof(attr), /* to capture ABI version */
	};
	struct perf_evsel *evsel = perf_evsel__new(&attr);

	if (evsel == NULL)
		return -ENOMEM;

	perf_evlist__add(evlist, evsel);
	return 0;
}

283 284
static int perf_evlist__add_attrs(struct perf_evlist *evlist,
				  struct perf_event_attr *attrs, size_t nr_attrs)
285 286 287 288 289 290
{
	struct perf_evsel *evsel, *n;
	LIST_HEAD(head);
	size_t i;

	for (i = 0; i < nr_attrs; i++) {
291
		evsel = perf_evsel__new_idx(attrs + i, evlist->nr_entries + i);
292 293 294 295 296
		if (evsel == NULL)
			goto out_delete_partial_list;
		list_add_tail(&evsel->node, &head);
	}

297
	perf_evlist__splice_list_tail(evlist, &head);
298 299 300 301

	return 0;

out_delete_partial_list:
302
	__evlist__for_each_entry_safe(&head, n, evsel)
303 304 305 306
		perf_evsel__delete(evsel);
	return -1;
}

307 308 309 310 311 312 313 314 315 316 317
int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
				     struct perf_event_attr *attrs, size_t nr_attrs)
{
	size_t i;

	for (i = 0; i < nr_attrs; i++)
		event_attr_init(attrs + i);

	return perf_evlist__add_attrs(evlist, attrs, nr_attrs);
}

318 319
struct perf_evsel *
perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id)
320 321 322
{
	struct perf_evsel *evsel;

323
	evlist__for_each_entry(evlist, evsel) {
324 325 326 327 328 329 330 331
		if (evsel->attr.type   == PERF_TYPE_TRACEPOINT &&
		    (int)evsel->attr.config == id)
			return evsel;
	}

	return NULL;
}

332 333 334 335 336 337
struct perf_evsel *
perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
				     const char *name)
{
	struct perf_evsel *evsel;

338
	evlist__for_each_entry(evlist, evsel) {
339 340 341 342 343 344 345 346
		if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) &&
		    (strcmp(evsel->name, name) == 0))
			return evsel;
	}

	return NULL;
}

347 348 349
int perf_evlist__add_newtp(struct perf_evlist *evlist,
			   const char *sys, const char *name, void *handler)
{
350
	struct perf_evsel *evsel = perf_evsel__newtp(sys, name);
351

352
	if (IS_ERR(evsel))
353 354
		return -1;

355
	evsel->handler = handler;
356 357 358 359
	perf_evlist__add(evlist, evsel);
	return 0;
}

360 361 362 363 364 365 366 367 368
static int perf_evlist__nr_threads(struct perf_evlist *evlist,
				   struct perf_evsel *evsel)
{
	if (evsel->system_wide)
		return 1;
	else
		return thread_map__nr(evlist->threads);
}

369 370 371
void perf_evlist__disable(struct perf_evlist *evlist)
{
	struct perf_evsel *pos;
372

373
	evlist__for_each_entry(evlist, pos) {
374 375 376
		if (!perf_evsel__is_group_leader(pos) || !pos->fd)
			continue;
		perf_evsel__disable(pos);
377
	}
378 379

	evlist->enabled = false;
380 381
}

382 383 384
void perf_evlist__enable(struct perf_evlist *evlist)
{
	struct perf_evsel *pos;
385

386
	evlist__for_each_entry(evlist, pos) {
387 388 389
		if (!perf_evsel__is_group_leader(pos) || !pos->fd)
			continue;
		perf_evsel__enable(pos);
390
	}
391 392 393 394 395 396 397

	evlist->enabled = true;
}

void perf_evlist__toggle_enable(struct perf_evlist *evlist)
{
	(evlist->enabled ? perf_evlist__disable : perf_evlist__enable)(evlist);
398 399
}

400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
static int perf_evlist__enable_event_cpu(struct perf_evlist *evlist,
					 struct perf_evsel *evsel, int cpu)
{
	int thread, err;
	int nr_threads = perf_evlist__nr_threads(evlist, evsel);

	if (!evsel->fd)
		return -EINVAL;

	for (thread = 0; thread < nr_threads; thread++) {
		err = ioctl(FD(evsel, cpu, thread),
			    PERF_EVENT_IOC_ENABLE, 0);
		if (err)
			return err;
	}
	return 0;
}

static int perf_evlist__enable_event_thread(struct perf_evlist *evlist,
					    struct perf_evsel *evsel,
					    int thread)
{
	int cpu, err;
	int nr_cpus = cpu_map__nr(evlist->cpus);

	if (!evsel->fd)
		return -EINVAL;

	for (cpu = 0; cpu < nr_cpus; cpu++) {
		err = ioctl(FD(evsel, cpu, thread), PERF_EVENT_IOC_ENABLE, 0);
		if (err)
			return err;
	}
	return 0;
}

int perf_evlist__enable_event_idx(struct perf_evlist *evlist,
				  struct perf_evsel *evsel, int idx)
{
	bool per_cpu_mmaps = !cpu_map__empty(evlist->cpus);

	if (per_cpu_mmaps)
		return perf_evlist__enable_event_cpu(evlist, evsel, idx);
	else
		return perf_evlist__enable_event_thread(evlist, evsel, idx);
}

447
int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
448
{
449 450
	int nr_cpus = cpu_map__nr(evlist->cpus);
	int nr_threads = thread_map__nr(evlist->threads);
451 452 453
	int nfds = 0;
	struct perf_evsel *evsel;

454
	evlist__for_each_entry(evlist, evsel) {
455 456 457 458 459 460
		if (evsel->system_wide)
			nfds += nr_cpus;
		else
			nfds += nr_cpus * nr_threads;
	}

461 462
	if (fdarray__available_entries(&evlist->pollfd) < nfds &&
	    fdarray__grow(&evlist->pollfd, nfds) < 0)
463 464 465
		return -ENOMEM;

	return 0;
466
}
467

468 469
static int __perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd,
				     struct perf_mmap *map, short revent)
470
{
471
	int pos = fdarray__add(&evlist->pollfd, fd, revent | POLLERR | POLLHUP);
472 473 474 475 476
	/*
	 * Save the idx so that when we filter out fds POLLHUP'ed we can
	 * close the associated evlist->mmap[] entry.
	 */
	if (pos >= 0) {
477
		evlist->pollfd.priv[pos].ptr = map;
478 479 480 481 482 483 484

		fcntl(fd, F_SETFL, O_NONBLOCK);
	}

	return pos;
}

485
int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd)
486
{
487
	return __perf_evlist__add_pollfd(evlist, fd, NULL, POLLIN);
488 489
}

490 491
static void perf_evlist__munmap_filtered(struct fdarray *fda, int fd,
					 void *arg __maybe_unused)
492
{
493
	struct perf_mmap *map = fda->priv[fd].ptr;
494

495 496
	if (map)
		perf_mmap__put(map);
497
}
498

499 500
int perf_evlist__filter_pollfd(struct perf_evlist *evlist, short revents_and_mask)
{
501
	return fdarray__filter(&evlist->pollfd, revents_and_mask,
502
			       perf_evlist__munmap_filtered, NULL);
503 504
}

505 506
int perf_evlist__poll(struct perf_evlist *evlist, int timeout)
{
507
	return fdarray__poll(&evlist->pollfd, timeout);
508 509
}

510 511 512
static void perf_evlist__id_hash(struct perf_evlist *evlist,
				 struct perf_evsel *evsel,
				 int cpu, int thread, u64 id)
513 514 515 516 517 518 519 520 521 522
{
	int hash;
	struct perf_sample_id *sid = SID(evsel, cpu, thread);

	sid->id = id;
	sid->evsel = evsel;
	hash = hash_64(sid->id, PERF_EVLIST__HLIST_BITS);
	hlist_add_head(&sid->node, &evlist->heads[hash]);
}

523 524 525 526 527 528 529
void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
			 int cpu, int thread, u64 id)
{
	perf_evlist__id_hash(evlist, evsel, cpu, thread, id);
	evsel->id[evsel->ids++] = id;
}

J
Jiri Olsa 已提交
530 531 532
int perf_evlist__id_add_fd(struct perf_evlist *evlist,
			   struct perf_evsel *evsel,
			   int cpu, int thread, int fd)
533 534
{
	u64 read_data[4] = { 0, };
535
	int id_idx = 1; /* The first entry is the counter value */
536 537 538 539 540 541 542 543 544 545 546
	u64 id;
	int ret;

	ret = ioctl(fd, PERF_EVENT_IOC_ID, &id);
	if (!ret)
		goto add;

	if (errno != ENOTTY)
		return -1;

	/* Legacy way to get event id.. All hail to old kernels! */
547

548 549 550 551 552 553 554
	/*
	 * This way does not work with group format read, so bail
	 * out in that case.
	 */
	if (perf_evlist__read_format(evlist) & PERF_FORMAT_GROUP)
		return -1;

555 556 557 558 559 560 561 562 563
	if (!(evsel->attr.read_format & PERF_FORMAT_ID) ||
	    read(fd, &read_data, sizeof(read_data)) == -1)
		return -1;

	if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
		++id_idx;
	if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
		++id_idx;

564 565 566 567
	id = read_data[id_idx];

 add:
	perf_evlist__id_add(evlist, evsel, cpu, thread, id);
568 569 570
	return 0;
}

A
Adrian Hunter 已提交
571 572 573 574 575 576 577 578 579 580 581
static void perf_evlist__set_sid_idx(struct perf_evlist *evlist,
				     struct perf_evsel *evsel, int idx, int cpu,
				     int thread)
{
	struct perf_sample_id *sid = SID(evsel, cpu, thread);
	sid->idx = idx;
	if (evlist->cpus && cpu >= 0)
		sid->cpu = evlist->cpus->map[cpu];
	else
		sid->cpu = -1;
	if (!evsel->system_wide && evlist->threads && thread >= 0)
582
		sid->tid = thread_map__pid(evlist->threads, thread);
A
Adrian Hunter 已提交
583 584 585 586
	else
		sid->tid = -1;
}

587
struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id)
588 589 590 591 592 593 594 595
{
	struct hlist_head *head;
	struct perf_sample_id *sid;
	int hash;

	hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
	head = &evlist->heads[hash];

596
	hlist_for_each_entry(sid, head, node)
597
		if (sid->id == id)
598 599 600 601 602 603 604 605 606
			return sid;

	return NULL;
}

struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id)
{
	struct perf_sample_id *sid;

607
	if (evlist->nr_entries == 1 || !id)
608 609 610 611 612
		return perf_evlist__first(evlist);

	sid = perf_evlist__id2sid(evlist, id);
	if (sid)
		return sid->evsel;
613 614

	if (!perf_evlist__sample_id_all(evlist))
615
		return perf_evlist__first(evlist);
616

617 618
	return NULL;
}
619

620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
struct perf_evsel *perf_evlist__id2evsel_strict(struct perf_evlist *evlist,
						u64 id)
{
	struct perf_sample_id *sid;

	if (!id)
		return NULL;

	sid = perf_evlist__id2sid(evlist, id);
	if (sid)
		return sid->evsel;

	return NULL;
}

635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
static int perf_evlist__event2id(struct perf_evlist *evlist,
				 union perf_event *event, u64 *id)
{
	const u64 *array = event->sample.array;
	ssize_t n;

	n = (event->header.size - sizeof(event->header)) >> 3;

	if (event->header.type == PERF_RECORD_SAMPLE) {
		if (evlist->id_pos >= n)
			return -1;
		*id = array[evlist->id_pos];
	} else {
		if (evlist->is_pos > n)
			return -1;
		n -= evlist->is_pos;
		*id = array[n];
	}
	return 0;
}

J
Jiri Olsa 已提交
656 657
struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist,
					    union perf_event *event)
658
{
659
	struct perf_evsel *first = perf_evlist__first(evlist);
660 661 662 663 664 665
	struct hlist_head *head;
	struct perf_sample_id *sid;
	int hash;
	u64 id;

	if (evlist->nr_entries == 1)
666 667 668 669 670
		return first;

	if (!first->attr.sample_id_all &&
	    event->header.type != PERF_RECORD_SAMPLE)
		return first;
671 672 673 674 675 676

	if (perf_evlist__event2id(evlist, event, &id))
		return NULL;

	/* Synthesized events have an id of zero */
	if (!id)
677
		return first;
678 679 680 681 682 683 684 685 686 687 688

	hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
	head = &evlist->heads[hash];

	hlist_for_each_entry(sid, head, node) {
		if (sid->id == id)
			return sid->evsel;
	}
	return NULL;
}

W
Wang Nan 已提交
689 690 691 692
static int perf_evlist__set_paused(struct perf_evlist *evlist, bool value)
{
	int i;

693 694 695
	if (!evlist->backward_mmap)
		return 0;

W
Wang Nan 已提交
696
	for (i = 0; i < evlist->nr_mmaps; i++) {
697
		int fd = evlist->backward_mmap[i].fd;
W
Wang Nan 已提交
698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
		int err;

		if (fd < 0)
			continue;
		err = ioctl(fd, PERF_EVENT_IOC_PAUSE_OUTPUT, value ? 1 : 0);
		if (err)
			return err;
	}
	return 0;
}

int perf_evlist__pause(struct perf_evlist *evlist)
{
	return perf_evlist__set_paused(evlist, true);
}

int perf_evlist__resume(struct perf_evlist *evlist)
{
	return perf_evlist__set_paused(evlist, false);
}

719
/* When check_messup is true, 'end' must points to a good entry */
720
static union perf_event *
721 722
perf_mmap__read(struct perf_mmap *md, bool check_messup, u64 start,
		u64 end, u64 *prev)
723 724
{
	unsigned char *data = md->base + page_size;
725
	union perf_event *event = NULL;
726
	int diff = end - start;
727

728
	if (check_messup) {
729
		/*
730 731 732
		 * If we're further behind than half the buffer, there's a chance
		 * the writer will bite our tail and mess up the samples under us.
		 *
733
		 * If we somehow ended up ahead of the 'end', we got messed up.
734
		 *
735
		 * In either case, truncate and restart at 'end'.
736
		 */
737 738 739 740
		if (diff > md->mask / 2 || diff < 0) {
			fprintf(stderr, "WARNING: failed to keep up with mmap data.\n");

			/*
741
			 * 'end' points to a known good entry, start there.
742
			 */
743
			start = end;
744
			diff = 0;
745
		}
746 747
	}

748
	if (diff >= (int)sizeof(event->header)) {
749 750
		size_t size;

751
		event = (union perf_event *)&data[start & md->mask];
752 753
		size = event->header.size;

754 755 756 757 758
		if (size < sizeof(event->header) || diff < (int)size) {
			event = NULL;
			goto broken_event;
		}

759 760 761 762
		/*
		 * Event straddles the mmap boundary -- header should always
		 * be inside due to u64 alignment of output.
		 */
763 764
		if ((start & md->mask) + size != ((start + size) & md->mask)) {
			unsigned int offset = start;
765
			unsigned int len = min(sizeof(*event), size), cpy;
766
			void *dst = md->event_copy;
767 768 769 770 771 772 773 774 775

			do {
				cpy = min(md->mask + 1 - (offset & md->mask), len);
				memcpy(dst, &data[offset & md->mask], cpy);
				offset += cpy;
				dst += cpy;
				len -= cpy;
			} while (len);

776
			event = (union perf_event *) md->event_copy;
777 778
		}

779
		start += size;
780 781
	}

782
broken_event:
783
	if (prev)
784
		*prev = start;
785

786 787
	return event;
}
788

789
union perf_event *perf_mmap__read_forward(struct perf_mmap *md, bool check_messup)
790 791 792 793 794 795 796 797 798 799 800 801
{
	u64 head;
	u64 old = md->prev;

	/*
	 * Check if event was unmapped due to a POLLHUP/POLLERR.
	 */
	if (!atomic_read(&md->refcnt))
		return NULL;

	head = perf_mmap__read_head(md);

802
	return perf_mmap__read(md, check_messup, old, head, &md->prev);
803 804
}

805
union perf_event *
806
perf_mmap__read_backward(struct perf_mmap *md)
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
{
	u64 head, end;
	u64 start = md->prev;

	/*
	 * Check if event was unmapped due to a POLLHUP/POLLERR.
	 */
	if (!atomic_read(&md->refcnt))
		return NULL;

	head = perf_mmap__read_head(md);
	if (!head)
		return NULL;

	/*
	 * 'head' pointer starts from 0. Kernel minus sizeof(record) form
	 * it each time when kernel writes to it, so in fact 'head' is
	 * negative. 'end' pointer is made manually by adding the size of
	 * the ring buffer to 'head' pointer, means the validate data can
	 * read is the whole ring buffer. If 'end' is positive, the ring
	 * buffer has not fully filled, so we must adjust 'end' to 0.
	 *
	 * However, since both 'head' and 'end' is unsigned, we can't
	 * simply compare 'end' against 0. Here we compare '-head' and
	 * the size of the ring buffer, where -head is the number of bytes
	 * kernel write to the ring buffer.
	 */
	if (-head < (u64)(md->mask + 1))
		end = 0;
	else
		end = head + md->mask + 1;

	return perf_mmap__read(md, false, start, end, &md->prev);
}

842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
union perf_event *perf_evlist__mmap_read_forward(struct perf_evlist *evlist, int idx)
{
	struct perf_mmap *md = &evlist->mmap[idx];

	/*
	 * Check messup is required for forward overwritable ring buffer:
	 * memory pointed by md->prev can be overwritten in this case.
	 * No need for read-write ring buffer: kernel stop outputting when
	 * it hit md->prev (perf_mmap__consume()).
	 */
	return perf_mmap__read_forward(md, evlist->overwrite);
}

union perf_event *perf_evlist__mmap_read_backward(struct perf_evlist *evlist, int idx)
{
	struct perf_mmap *md = &evlist->mmap[idx];

	/*
	 * No need to check messup for backward ring buffer:
	 * We can always read arbitrary long data from a backward
	 * ring buffer unless we forget to pause it before reading.
	 */
	return perf_mmap__read_backward(md);
}

867 868
union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx)
{
W
Wang Nan 已提交
869
	return perf_evlist__mmap_read_forward(evlist, idx);
870 871
}

872
void perf_mmap__read_catchup(struct perf_mmap *md)
873 874 875 876 877 878 879 880 881 882
{
	u64 head;

	if (!atomic_read(&md->refcnt))
		return;

	head = perf_mmap__read_head(md);
	md->prev = head;
}

883 884 885 886 887
void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx)
{
	perf_mmap__read_catchup(&evlist->mmap[idx]);
}

888 889
static bool perf_mmap__empty(struct perf_mmap *md)
{
890
	return perf_mmap__read_head(md) == md->prev && !md->auxtrace_mmap.base;
891 892
}

893
static void perf_mmap__get(struct perf_mmap *map)
894
{
895
	atomic_inc(&map->refcnt);
896 897
}

898
static void perf_mmap__put(struct perf_mmap *md)
899
{
900
	BUG_ON(md->base && atomic_read(&md->refcnt) == 0);
901

902
	if (atomic_dec_and_test(&md->refcnt))
903
		perf_mmap__munmap(md);
904 905
}

906 907 908
void perf_mmap__consume(struct perf_mmap *md, bool overwrite)
{
	if (!overwrite) {
909
		u64 old = md->prev;
910 911 912

		perf_mmap__write_tail(md, old);
	}
913

914
	if (atomic_read(&md->refcnt) == 1 && perf_mmap__empty(md))
915 916 917 918 919 920
		perf_mmap__put(md);
}

void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx)
{
	perf_mmap__consume(&evlist->mmap[idx], evlist->overwrite);
921 922
}

923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
int __weak auxtrace_mmap__mmap(struct auxtrace_mmap *mm __maybe_unused,
			       struct auxtrace_mmap_params *mp __maybe_unused,
			       void *userpg __maybe_unused,
			       int fd __maybe_unused)
{
	return 0;
}

void __weak auxtrace_mmap__munmap(struct auxtrace_mmap *mm __maybe_unused)
{
}

void __weak auxtrace_mmap_params__init(
			struct auxtrace_mmap_params *mp __maybe_unused,
			off_t auxtrace_offset __maybe_unused,
			unsigned int auxtrace_pages __maybe_unused,
			bool auxtrace_overwrite __maybe_unused)
{
}

void __weak auxtrace_mmap_params__set_idx(
			struct auxtrace_mmap_params *mp __maybe_unused,
			struct perf_evlist *evlist __maybe_unused,
			int idx __maybe_unused,
			bool per_cpu __maybe_unused)
{
}

951
static void perf_mmap__munmap(struct perf_mmap *map)
952
{
953 954 955 956 957
	if (map->base != NULL) {
		munmap(map->base, perf_mmap__mmap_len(map));
		map->base = NULL;
		map->fd = -1;
		atomic_set(&map->refcnt, 0);
958
	}
959 960 961
	auxtrace_mmap__munmap(&map->auxtrace_mmap);
}

962
static void perf_evlist__munmap_nofree(struct perf_evlist *evlist)
963
{
964
	int i;
965

966 967 968
	if (evlist->mmap)
		for (i = 0; i < evlist->nr_mmaps; i++)
			perf_mmap__munmap(&evlist->mmap[i]);
969

970 971 972
	if (evlist->backward_mmap)
		for (i = 0; i < evlist->nr_mmaps; i++)
			perf_mmap__munmap(&evlist->backward_mmap[i]);
973
}
974

975 976 977
void perf_evlist__munmap(struct perf_evlist *evlist)
{
	perf_evlist__munmap_nofree(evlist);
978
	zfree(&evlist->mmap);
979
	zfree(&evlist->backward_mmap);
980 981
}

982
static struct perf_mmap *perf_evlist__alloc_mmap(struct perf_evlist *evlist)
983
{
W
Wang Nan 已提交
984
	int i;
985
	struct perf_mmap *map;
W
Wang Nan 已提交
986

987
	evlist->nr_mmaps = cpu_map__nr(evlist->cpus);
988
	if (cpu_map__empty(evlist->cpus))
989
		evlist->nr_mmaps = thread_map__nr(evlist->threads);
990 991 992
	map = zalloc(evlist->nr_mmaps * sizeof(struct perf_mmap));
	if (!map)
		return NULL;
993

W
Wang Nan 已提交
994
	for (i = 0; i < evlist->nr_mmaps; i++)
995 996
		map[i].fd = -1;
	return map;
997 998
}

999 1000 1001
struct mmap_params {
	int prot;
	int mask;
1002
	struct auxtrace_mmap_params auxtrace_mp;
1003 1004
};

1005 1006
static int perf_mmap__mmap(struct perf_mmap *map,
			   struct mmap_params *mp, int fd)
1007
{
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
	/*
	 * The last one will be done at perf_evlist__mmap_consume(), so that we
	 * make sure we don't prevent tools from consuming every last event in
	 * the ring buffer.
	 *
	 * I.e. we can get the POLLHUP meaning that the fd doesn't exist
	 * anymore, but the last events for it are still in the ring buffer,
	 * waiting to be consumed.
	 *
	 * Tools can chose to ignore this at their own discretion, but the
	 * evlist layer can't just drop it when filtering events in
	 * perf_evlist__filter_pollfd().
	 */
1021 1022 1023 1024 1025 1026
	atomic_set(&map->refcnt, 2);
	map->prev = 0;
	map->mask = mp->mask;
	map->base = mmap(NULL, perf_mmap__mmap_len(map), mp->prot,
			 MAP_SHARED, fd, 0);
	if (map->base == MAP_FAILED) {
1027 1028
		pr_debug2("failed to mmap perf event ring buffer, error %d\n",
			  errno);
1029
		map->base = NULL;
1030
		return -1;
1031
	}
1032
	map->fd = fd;
1033

1034 1035
	if (auxtrace_mmap__mmap(&map->auxtrace_mmap,
				&mp->auxtrace_mp, map->base, fd))
1036 1037
		return -1;

1038 1039 1040
	return 0;
}

1041 1042 1043 1044
static bool
perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused,
			 struct perf_evsel *evsel)
{
1045
	if (evsel->attr.write_backward)
1046 1047 1048 1049
		return false;
	return true;
}

1050
static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
1051
				       struct mmap_params *mp, int cpu,
1052
				       int thread, int *_output, int *_output_backward)
1053 1054
{
	struct perf_evsel *evsel;
1055
	int revent;
1056

1057
	evlist__for_each_entry(evlist, evsel) {
1058 1059
		struct perf_mmap *maps = evlist->mmap;
		int *output = _output;
1060 1061
		int fd;

1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
		if (evsel->attr.write_backward) {
			output = _output_backward;
			maps = evlist->backward_mmap;

			if (!maps) {
				maps = perf_evlist__alloc_mmap(evlist);
				if (!maps)
					return -1;
				evlist->backward_mmap = maps;
			}
		}
1073

1074 1075 1076 1077
		if (evsel->system_wide && thread)
			continue;

		fd = FD(evsel, cpu, thread);
1078 1079 1080

		if (*output == -1) {
			*output = fd;
1081 1082

			if (perf_mmap__mmap(&maps[idx], mp, *output)  < 0)
1083 1084 1085 1086
				return -1;
		} else {
			if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, *output) != 0)
				return -1;
1087

1088
			perf_mmap__get(&maps[idx]);
1089 1090
		}

1091 1092
		revent = perf_evlist__should_poll(evlist, evsel) ? POLLIN : 0;

1093 1094 1095 1096 1097 1098 1099 1100
		/*
		 * The system_wide flag causes a selected event to be opened
		 * always without a pid.  Consequently it will never get a
		 * POLLHUP, but it is used for tracking in combination with
		 * other events, so it should not need to be polled anyway.
		 * Therefore don't add it for polling.
		 */
		if (!evsel->system_wide &&
1101 1102
		    __perf_evlist__add_pollfd(evlist, fd, &maps[idx], revent) < 0) {
			perf_mmap__put(&maps[idx]);
1103
			return -1;
1104
		}
1105

A
Adrian Hunter 已提交
1106 1107 1108 1109 1110 1111 1112
		if (evsel->attr.read_format & PERF_FORMAT_ID) {
			if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread,
						   fd) < 0)
				return -1;
			perf_evlist__set_sid_idx(evlist, evsel, idx, cpu,
						 thread);
		}
1113 1114 1115 1116 1117
	}

	return 0;
}

1118 1119
static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist,
				     struct mmap_params *mp)
1120
{
1121
	int cpu, thread;
1122 1123
	int nr_cpus = cpu_map__nr(evlist->cpus);
	int nr_threads = thread_map__nr(evlist->threads);
1124

A
Adrian Hunter 已提交
1125
	pr_debug2("perf event ring buffer mmapped per cpu\n");
1126
	for (cpu = 0; cpu < nr_cpus; cpu++) {
1127
		int output = -1;
1128
		int output_backward = -1;
1129

1130 1131 1132
		auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, cpu,
					      true);

1133
		for (thread = 0; thread < nr_threads; thread++) {
1134
			if (perf_evlist__mmap_per_evsel(evlist, cpu, mp, cpu,
1135
							thread, &output, &output_backward))
1136
				goto out_unmap;
1137 1138 1139 1140 1141 1142
		}
	}

	return 0;

out_unmap:
1143
	perf_evlist__munmap_nofree(evlist);
1144 1145 1146
	return -1;
}

1147 1148
static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist,
					struct mmap_params *mp)
1149 1150
{
	int thread;
1151
	int nr_threads = thread_map__nr(evlist->threads);
1152

A
Adrian Hunter 已提交
1153
	pr_debug2("perf event ring buffer mmapped per thread\n");
1154
	for (thread = 0; thread < nr_threads; thread++) {
1155
		int output = -1;
1156
		int output_backward = -1;
1157

1158 1159 1160
		auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, thread,
					      false);

1161
		if (perf_evlist__mmap_per_evsel(evlist, thread, mp, 0, thread,
1162
						&output, &output_backward))
1163
			goto out_unmap;
1164 1165 1166 1167 1168
	}

	return 0;

out_unmap:
1169
	perf_evlist__munmap_nofree(evlist);
1170 1171 1172
	return -1;
}

1173
unsigned long perf_event_mlock_kb_in_pages(void)
1174
{
1175 1176
	unsigned long pages;
	int max;
1177

1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
	if (sysctl__read_int("kernel/perf_event_mlock_kb", &max) < 0) {
		/*
		 * Pick a once upon a time good value, i.e. things look
		 * strange since we can't read a sysctl value, but lets not
		 * die yet...
		 */
		max = 512;
	} else {
		max -= (page_size / 1024);
	}
1188

1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
	pages = (max * 1024) / page_size;
	if (!is_power_of_2(pages))
		pages = rounddown_pow_of_two(pages);

	return pages;
}

static size_t perf_evlist__mmap_size(unsigned long pages)
{
	if (pages == UINT_MAX)
		pages = perf_event_mlock_kb_in_pages();
	else if (!is_power_of_2(pages))
1201 1202 1203 1204 1205
		return 0;

	return (pages + 1) * page_size;
}

1206 1207
static long parse_pages_arg(const char *str, unsigned long min,
			    unsigned long max)
1208
{
1209
	unsigned long pages, val;
1210 1211 1212 1213 1214 1215 1216
	static struct parse_tag tags[] = {
		{ .tag  = 'B', .mult = 1       },
		{ .tag  = 'K', .mult = 1 << 10 },
		{ .tag  = 'M', .mult = 1 << 20 },
		{ .tag  = 'G', .mult = 1 << 30 },
		{ .tag  = 0 },
	};
1217

1218
	if (str == NULL)
1219
		return -EINVAL;
1220

1221
	val = parse_tag_value(str, tags);
1222
	if (val != (unsigned long) -1) {
1223 1224 1225 1226 1227 1228
		/* we got file size value */
		pages = PERF_ALIGN(val, page_size) / page_size;
	} else {
		/* we got pages count value */
		char *eptr;
		pages = strtoul(str, &eptr, 10);
1229 1230
		if (*eptr != '\0')
			return -EINVAL;
1231 1232
	}

1233
	if (pages == 0 && min == 0) {
1234
		/* leave number of pages at 0 */
1235
	} else if (!is_power_of_2(pages)) {
1236
		/* round pages up to next power of 2 */
1237
		pages = roundup_pow_of_two(pages);
1238 1239
		if (!pages)
			return -EINVAL;
1240 1241
		pr_info("rounding mmap pages size to %lu bytes (%lu pages)\n",
			pages * page_size, pages);
1242 1243
	}

1244 1245 1246 1247 1248 1249
	if (pages > max)
		return -EINVAL;

	return pages;
}

1250
int __perf_evlist__parse_mmap_pages(unsigned int *mmap_pages, const char *str)
1251 1252 1253 1254
{
	unsigned long max = UINT_MAX;
	long pages;

A
Adrian Hunter 已提交
1255
	if (max > SIZE_MAX / page_size)
1256 1257 1258 1259 1260
		max = SIZE_MAX / page_size;

	pages = parse_pages_arg(str, 1, max);
	if (pages < 0) {
		pr_err("Invalid argument for --mmap_pages/-m\n");
1261 1262 1263 1264 1265 1266 1267
		return -1;
	}

	*mmap_pages = pages;
	return 0;
}

1268 1269 1270 1271 1272 1273
int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str,
				  int unset __maybe_unused)
{
	return __perf_evlist__parse_mmap_pages(opt->value, str);
}

1274
/**
1275
 * perf_evlist__mmap_ex - Create mmaps to receive events.
1276 1277 1278
 * @evlist: list of events
 * @pages: map length in pages
 * @overwrite: overwrite older events?
1279 1280
 * @auxtrace_pages - auxtrace map length in pages
 * @auxtrace_overwrite - overwrite older auxtrace data?
1281
 *
1282 1283 1284
 * If @overwrite is %false the user needs to signal event consumption using
 * perf_mmap__write_tail().  Using perf_evlist__mmap_read() does this
 * automatically.
1285
 *
1286 1287 1288
 * Similarly, if @auxtrace_overwrite is %false the user needs to signal data
 * consumption using auxtrace_mmap__write_tail().
 *
1289
 * Return: %0 on success, negative error code otherwise.
1290
 */
1291 1292 1293
int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
			 bool overwrite, unsigned int auxtrace_pages,
			 bool auxtrace_overwrite)
1294
{
1295
	struct perf_evsel *evsel;
1296 1297
	const struct cpu_map *cpus = evlist->cpus;
	const struct thread_map *threads = evlist->threads;
1298 1299 1300
	struct mmap_params mp = {
		.prot = PROT_READ | (overwrite ? 0 : PROT_WRITE),
	};
1301

1302 1303 1304
	if (!evlist->mmap)
		evlist->mmap = perf_evlist__alloc_mmap(evlist);
	if (!evlist->mmap)
1305 1306
		return -ENOMEM;

1307
	if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0)
1308 1309 1310
		return -ENOMEM;

	evlist->overwrite = overwrite;
1311
	evlist->mmap_len = perf_evlist__mmap_size(pages);
1312
	pr_debug("mmap size %zuB\n", evlist->mmap_len);
1313
	mp.mask = evlist->mmap_len - page_size - 1;
1314

1315 1316 1317
	auxtrace_mmap_params__init(&mp.auxtrace_mp, evlist->mmap_len,
				   auxtrace_pages, auxtrace_overwrite);

1318
	evlist__for_each_entry(evlist, evsel) {
1319
		if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
1320
		    evsel->sample_id == NULL &&
1321
		    perf_evsel__alloc_id(evsel, cpu_map__nr(cpus), threads->nr) < 0)
1322 1323 1324
			return -ENOMEM;
	}

1325
	if (cpu_map__empty(cpus))
1326
		return perf_evlist__mmap_per_thread(evlist, &mp);
1327

1328
	return perf_evlist__mmap_per_cpu(evlist, &mp);
1329
}
1330

1331 1332 1333 1334 1335 1336
int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
		      bool overwrite)
{
	return perf_evlist__mmap_ex(evlist, pages, overwrite, 0, false);
}

1337
int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)
1338
{
1339 1340
	struct cpu_map *cpus;
	struct thread_map *threads;
1341

1342
	threads = thread_map__new_str(target->pid, target->tid, target->uid);
1343

1344
	if (!threads)
1345 1346
		return -1;

1347
	if (target__uses_dummy_map(target))
1348
		cpus = cpu_map__dummy_new();
1349
	else
1350
		cpus = cpu_map__new(target->cpu_list);
1351

1352
	if (!cpus)
1353 1354
		goto out_delete_threads;

1355 1356
	evlist->has_user_cpus = !!target->cpu_list;

1357
	perf_evlist__set_maps(evlist, cpus, threads);
1358 1359

	return 0;
1360 1361

out_delete_threads:
1362
	thread_map__put(threads);
1363 1364 1365
	return -1;
}

1366 1367
void perf_evlist__set_maps(struct perf_evlist *evlist, struct cpu_map *cpus,
			   struct thread_map *threads)
1368
{
1369 1370 1371 1372 1373 1374 1375 1376
	/*
	 * Allow for the possibility that one or another of the maps isn't being
	 * changed i.e. don't put it.  Note we are assuming the maps that are
	 * being applied are brand new and evlist is taking ownership of the
	 * original reference count of 1.  If that is not the case it is up to
	 * the caller to increase the reference count.
	 */
	if (cpus != evlist->cpus) {
1377
		cpu_map__put(evlist->cpus);
1378
		evlist->cpus = cpu_map__get(cpus);
1379
	}
1380

1381
	if (threads != evlist->threads) {
1382
		thread_map__put(evlist->threads);
1383
		evlist->threads = thread_map__get(threads);
1384
	}
1385

1386
	perf_evlist__propagate_maps(evlist);
1387 1388
}

1389 1390 1391 1392 1393
void __perf_evlist__set_sample_bit(struct perf_evlist *evlist,
				   enum perf_event_sample_format bit)
{
	struct perf_evsel *evsel;

1394
	evlist__for_each_entry(evlist, evsel)
1395 1396 1397 1398 1399 1400 1401 1402
		__perf_evsel__set_sample_bit(evsel, bit);
}

void __perf_evlist__reset_sample_bit(struct perf_evlist *evlist,
				     enum perf_event_sample_format bit)
{
	struct perf_evsel *evsel;

1403
	evlist__for_each_entry(evlist, evsel)
1404 1405 1406
		__perf_evsel__reset_sample_bit(evsel, bit);
}

1407
int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel)
1408 1409
{
	struct perf_evsel *evsel;
1410 1411
	int err = 0;
	const int ncpus = cpu_map__nr(evlist->cpus),
1412
		  nthreads = thread_map__nr(evlist->threads);
1413

1414
	evlist__for_each_entry(evlist, evsel) {
1415
		if (evsel->filter == NULL)
1416
			continue;
1417

1418 1419 1420 1421
		/*
		 * filters only work for tracepoint event, which doesn't have cpu limit.
		 * So evlist and evsel should always be same.
		 */
1422
		err = perf_evsel__apply_filter(evsel, ncpus, nthreads, evsel->filter);
1423 1424
		if (err) {
			*err_evsel = evsel;
1425
			break;
1426
		}
1427 1428
	}

1429 1430 1431 1432 1433 1434 1435 1436
	return err;
}

int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
{
	struct perf_evsel *evsel;
	int err = 0;

1437
	evlist__for_each_entry(evlist, evsel) {
1438 1439 1440
		if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
			continue;

1441
		err = perf_evsel__set_filter(evsel, filter);
1442 1443 1444 1445 1446
		if (err)
			break;
	}

	return err;
1447
}
1448

1449
int perf_evlist__set_filter_pids(struct perf_evlist *evlist, size_t npids, pid_t *pids)
1450 1451
{
	char *filter;
1452 1453
	int ret = -1;
	size_t i;
1454

1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
	for (i = 0; i < npids; ++i) {
		if (i == 0) {
			if (asprintf(&filter, "common_pid != %d", pids[i]) < 0)
				return -1;
		} else {
			char *tmp;

			if (asprintf(&tmp, "%s && common_pid != %d", filter, pids[i]) < 0)
				goto out_free;

			free(filter);
			filter = tmp;
		}
	}
1469 1470

	ret = perf_evlist__set_filter(evlist, filter);
1471
out_free:
1472 1473 1474 1475
	free(filter);
	return ret;
}

1476 1477 1478 1479 1480
int perf_evlist__set_filter_pid(struct perf_evlist *evlist, pid_t pid)
{
	return perf_evlist__set_filter_pids(evlist, 1, &pid);
}

1481
bool perf_evlist__valid_sample_type(struct perf_evlist *evlist)
1482
{
1483
	struct perf_evsel *pos;
1484

1485 1486 1487 1488 1489 1490
	if (evlist->nr_entries == 1)
		return true;

	if (evlist->id_pos < 0 || evlist->is_pos < 0)
		return false;

1491
	evlist__for_each_entry(evlist, pos) {
1492 1493
		if (pos->id_pos != evlist->id_pos ||
		    pos->is_pos != evlist->is_pos)
1494
			return false;
1495 1496
	}

1497
	return true;
1498 1499
}

1500
u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist)
1501
{
1502 1503 1504 1505 1506
	struct perf_evsel *evsel;

	if (evlist->combined_sample_type)
		return evlist->combined_sample_type;

1507
	evlist__for_each_entry(evlist, evsel)
1508 1509 1510 1511 1512 1513 1514 1515 1516
		evlist->combined_sample_type |= evsel->attr.sample_type;

	return evlist->combined_sample_type;
}

u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist)
{
	evlist->combined_sample_type = 0;
	return __perf_evlist__combined_sample_type(evlist);
1517 1518
}

1519 1520 1521 1522 1523
u64 perf_evlist__combined_branch_type(struct perf_evlist *evlist)
{
	struct perf_evsel *evsel;
	u64 branch_type = 0;

1524
	evlist__for_each_entry(evlist, evsel)
1525 1526 1527 1528
		branch_type |= evsel->attr.branch_sample_type;
	return branch_type;
}

1529 1530 1531 1532 1533 1534
bool perf_evlist__valid_read_format(struct perf_evlist *evlist)
{
	struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
	u64 read_format = first->attr.read_format;
	u64 sample_type = first->attr.sample_type;

1535
	evlist__for_each_entry(evlist, pos) {
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554
		if (read_format != pos->attr.read_format)
			return false;
	}

	/* PERF_SAMPLE_READ imples PERF_FORMAT_ID. */
	if ((sample_type & PERF_SAMPLE_READ) &&
	    !(read_format & PERF_FORMAT_ID)) {
		return false;
	}

	return true;
}

u64 perf_evlist__read_format(struct perf_evlist *evlist)
{
	struct perf_evsel *first = perf_evlist__first(evlist);
	return first->attr.read_format;
}

1555
u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist)
1556
{
1557
	struct perf_evsel *first = perf_evlist__first(evlist);
1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580
	struct perf_sample *data;
	u64 sample_type;
	u16 size = 0;

	if (!first->attr.sample_id_all)
		goto out;

	sample_type = first->attr.sample_type;

	if (sample_type & PERF_SAMPLE_TID)
		size += sizeof(data->tid) * 2;

       if (sample_type & PERF_SAMPLE_TIME)
		size += sizeof(data->time);

	if (sample_type & PERF_SAMPLE_ID)
		size += sizeof(data->id);

	if (sample_type & PERF_SAMPLE_STREAM_ID)
		size += sizeof(data->stream_id);

	if (sample_type & PERF_SAMPLE_CPU)
		size += sizeof(data->cpu) * 2;
1581 1582 1583

	if (sample_type & PERF_SAMPLE_IDENTIFIER)
		size += sizeof(data->id);
1584 1585 1586 1587
out:
	return size;
}

1588
bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist)
1589
{
1590
	struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
1591

1592
	evlist__for_each_entry_continue(evlist, pos) {
1593 1594
		if (first->attr.sample_id_all != pos->attr.sample_id_all)
			return false;
1595 1596
	}

1597 1598 1599
	return true;
}

1600
bool perf_evlist__sample_id_all(struct perf_evlist *evlist)
1601
{
1602
	struct perf_evsel *first = perf_evlist__first(evlist);
1603
	return first->attr.sample_id_all;
1604
}
1605 1606 1607 1608 1609 1610

void perf_evlist__set_selected(struct perf_evlist *evlist,
			       struct perf_evsel *evsel)
{
	evlist->selected = evsel;
}
1611

1612 1613 1614 1615 1616
void perf_evlist__close(struct perf_evlist *evlist)
{
	struct perf_evsel *evsel;
	int ncpus = cpu_map__nr(evlist->cpus);
	int nthreads = thread_map__nr(evlist->threads);
1617
	int n;
1618

1619
	evlist__for_each_entry_reverse(evlist, evsel) {
1620 1621 1622
		n = evsel->cpus ? evsel->cpus->nr : ncpus;
		perf_evsel__close(evsel, n, nthreads);
	}
1623 1624
}

1625 1626
static int perf_evlist__create_syswide_maps(struct perf_evlist *evlist)
{
1627 1628
	struct cpu_map	  *cpus;
	struct thread_map *threads;
1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
	int err = -ENOMEM;

	/*
	 * Try reading /sys/devices/system/cpu/online to get
	 * an all cpus map.
	 *
	 * FIXME: -ENOMEM is the best we can do here, the cpu_map
	 * code needs an overhaul to properly forward the
	 * error, and we may not want to do that fallback to a
	 * default cpu identity map :-\
	 */
1640 1641
	cpus = cpu_map__new(NULL);
	if (!cpus)
1642 1643
		goto out;

1644 1645 1646
	threads = thread_map__new_dummy();
	if (!threads)
		goto out_put;
1647

1648
	perf_evlist__set_maps(evlist, cpus, threads);
1649 1650
out:
	return err;
1651 1652
out_put:
	cpu_map__put(cpus);
1653 1654 1655
	goto out;
}

1656
int perf_evlist__open(struct perf_evlist *evlist)
1657
{
1658
	struct perf_evsel *evsel;
1659
	int err;
1660

1661 1662 1663 1664 1665 1666 1667 1668 1669 1670
	/*
	 * Default: one fd per CPU, all threads, aka systemwide
	 * as sys_perf_event_open(cpu = -1, thread = -1) is EINVAL
	 */
	if (evlist->threads == NULL && evlist->cpus == NULL) {
		err = perf_evlist__create_syswide_maps(evlist);
		if (err < 0)
			goto out_err;
	}

1671 1672
	perf_evlist__update_id_pos(evlist);

1673
	evlist__for_each_entry(evlist, evsel) {
1674
		err = perf_evsel__open(evsel, evsel->cpus, evsel->threads);
1675 1676 1677 1678 1679 1680
		if (err < 0)
			goto out_err;
	}

	return 0;
out_err:
1681
	perf_evlist__close(evlist);
1682
	errno = -err;
1683 1684
	return err;
}
1685

1686
int perf_evlist__prepare_workload(struct perf_evlist *evlist, struct target *target,
1687
				  const char *argv[], bool pipe_output,
1688
				  void (*exec_error)(int signo, siginfo_t *info, void *ucontext))
1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
{
	int child_ready_pipe[2], go_pipe[2];
	char bf;

	if (pipe(child_ready_pipe) < 0) {
		perror("failed to create 'ready' pipe");
		return -1;
	}

	if (pipe(go_pipe) < 0) {
		perror("failed to create 'go' pipe");
		goto out_close_ready_pipe;
	}

	evlist->workload.pid = fork();
	if (evlist->workload.pid < 0) {
		perror("failed to fork");
		goto out_close_pipes;
	}

	if (!evlist->workload.pid) {
1710 1711
		int ret;

1712
		if (pipe_output)
1713 1714
			dup2(2, 1);

1715 1716
		signal(SIGTERM, SIG_DFL);

1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728
		close(child_ready_pipe[0]);
		close(go_pipe[1]);
		fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);

		/*
		 * Tell the parent we're ready to go
		 */
		close(child_ready_pipe[1]);

		/*
		 * Wait until the parent tells us to go.
		 */
1729 1730 1731 1732 1733 1734
		ret = read(go_pipe[0], &bf, 1);
		/*
		 * The parent will ask for the execvp() to be performed by
		 * writing exactly one byte, in workload.cork_fd, usually via
		 * perf_evlist__start_workload().
		 *
1735
		 * For cancelling the workload without actually running it,
1736 1737 1738 1739 1740 1741 1742 1743 1744
		 * the parent will just close workload.cork_fd, without writing
		 * anything, i.e. read will return zero and we just exit()
		 * here.
		 */
		if (ret != 1) {
			if (ret == -1)
				perror("unable to read pipe");
			exit(ret);
		}
1745 1746 1747

		execvp(argv[0], (char **)argv);

1748
		if (exec_error) {
1749 1750 1751 1752 1753 1754 1755
			union sigval val;

			val.sival_int = errno;
			if (sigqueue(getppid(), SIGUSR1, val))
				perror(argv[0]);
		} else
			perror(argv[0]);
1756 1757 1758
		exit(-1);
	}

1759 1760 1761 1762 1763 1764 1765 1766
	if (exec_error) {
		struct sigaction act = {
			.sa_flags     = SA_SIGINFO,
			.sa_sigaction = exec_error,
		};
		sigaction(SIGUSR1, &act, NULL);
	}

1767 1768 1769 1770 1771 1772
	if (target__none(target)) {
		if (evlist->threads == NULL) {
			fprintf(stderr, "FATAL: evlist->threads need to be set at this point (%s:%d).\n",
				__func__, __LINE__);
			goto out_close_pipes;
		}
1773
		thread_map__set_pid(evlist->threads, 0, evlist->workload.pid);
1774
	}
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785

	close(child_ready_pipe[1]);
	close(go_pipe[0]);
	/*
	 * wait for child to settle
	 */
	if (read(child_ready_pipe[0], &bf, 1) == -1) {
		perror("unable to read pipe");
		goto out_close_pipes;
	}

1786
	fcntl(go_pipe[1], F_SETFD, FD_CLOEXEC);
1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802
	evlist->workload.cork_fd = go_pipe[1];
	close(child_ready_pipe[0]);
	return 0;

out_close_pipes:
	close(go_pipe[0]);
	close(go_pipe[1]);
out_close_ready_pipe:
	close(child_ready_pipe[0]);
	close(child_ready_pipe[1]);
	return -1;
}

int perf_evlist__start_workload(struct perf_evlist *evlist)
{
	if (evlist->workload.cork_fd > 0) {
1803
		char bf = 0;
1804
		int ret;
1805 1806 1807
		/*
		 * Remove the cork, let it rip!
		 */
1808 1809 1810 1811 1812 1813
		ret = write(evlist->workload.cork_fd, &bf, 1);
		if (ret < 0)
			perror("enable to write to pipe");

		close(evlist->workload.cork_fd);
		return ret;
1814 1815 1816 1817
	}

	return 0;
}
1818

1819
int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
1820
			      struct perf_sample *sample)
1821
{
1822 1823 1824 1825
	struct perf_evsel *evsel = perf_evlist__event2evsel(evlist, event);

	if (!evsel)
		return -EFAULT;
1826
	return perf_evsel__parse_sample(evsel, event, sample);
1827
}
1828 1829 1830 1831 1832 1833

size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
{
	struct perf_evsel *evsel;
	size_t printed = 0;

1834
	evlist__for_each_entry(evlist, evsel) {
1835 1836 1837 1838
		printed += fprintf(fp, "%s%s", evsel->idx ? ", " : "",
				   perf_evsel__name(evsel));
	}

1839
	return printed + fprintf(fp, "\n");
1840
}
1841

1842
int perf_evlist__strerror_open(struct perf_evlist *evlist,
1843 1844 1845
			       int err, char *buf, size_t size)
{
	int printed, value;
1846
	char sbuf[STRERR_BUFSIZE], *emsg = str_error_r(err, sbuf, sizeof(sbuf));
1847 1848 1849 1850 1851 1852 1853 1854

	switch (err) {
	case EACCES:
	case EPERM:
		printed = scnprintf(buf, size,
				    "Error:\t%s.\n"
				    "Hint:\tCheck /proc/sys/kernel/perf_event_paranoid setting.", emsg);

1855
		value = perf_event_paranoid();
1856 1857 1858 1859 1860 1861 1862 1863

		printed += scnprintf(buf + printed, size - printed, "\nHint:\t");

		if (value >= 2) {
			printed += scnprintf(buf + printed, size - printed,
					     "For your workloads it needs to be <= 1\nHint:\t");
		}
		printed += scnprintf(buf + printed, size - printed,
1864
				     "For system wide tracing it needs to be set to -1.\n");
1865 1866

		printed += scnprintf(buf + printed, size - printed,
1867 1868
				    "Hint:\tTry: 'sudo sh -c \"echo -1 > /proc/sys/kernel/perf_event_paranoid\"'\n"
				    "Hint:\tThe current value is %d.", value);
1869
		break;
1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886
	case EINVAL: {
		struct perf_evsel *first = perf_evlist__first(evlist);
		int max_freq;

		if (sysctl__read_int("kernel/perf_event_max_sample_rate", &max_freq) < 0)
			goto out_default;

		if (first->attr.sample_freq < (u64)max_freq)
			goto out_default;

		printed = scnprintf(buf, size,
				    "Error:\t%s.\n"
				    "Hint:\tCheck /proc/sys/kernel/perf_event_max_sample_rate.\n"
				    "Hint:\tThe current value is %d and %" PRIu64 " is being requested.",
				    emsg, max_freq, first->attr.sample_freq);
		break;
	}
1887
	default:
1888
out_default:
1889 1890 1891 1892 1893 1894
		scnprintf(buf, size, "%s", emsg);
		break;
	}

	return 0;
}
1895

1896 1897
int perf_evlist__strerror_mmap(struct perf_evlist *evlist, int err, char *buf, size_t size)
{
1898
	char sbuf[STRERR_BUFSIZE], *emsg = str_error_r(err, sbuf, sizeof(sbuf));
1899
	int pages_attempted = evlist->mmap_len / 1024, pages_max_per_user, printed = 0;
1900 1901 1902

	switch (err) {
	case EPERM:
1903
		sysctl__read_int("kernel/perf_event_mlock_kb", &pages_max_per_user);
1904 1905
		printed += scnprintf(buf + printed, size - printed,
				     "Error:\t%s.\n"
1906
				     "Hint:\tCheck /proc/sys/kernel/perf_event_mlock_kb (%d kB) setting.\n"
1907
				     "Hint:\tTried using %zd kB.\n",
1908
				     emsg, pages_max_per_user, pages_attempted);
1909 1910 1911 1912 1913 1914 1915 1916 1917

		if (pages_attempted >= pages_max_per_user) {
			printed += scnprintf(buf + printed, size - printed,
					     "Hint:\tTry 'sudo sh -c \"echo %d > /proc/sys/kernel/perf_event_mlock_kb\"', or\n",
					     pages_max_per_user + pages_attempted);
		}

		printed += scnprintf(buf + printed, size - printed,
				     "Hint:\tTry using a smaller -m/--mmap-pages value.");
1918 1919 1920 1921 1922 1923 1924 1925 1926
		break;
	default:
		scnprintf(buf, size, "%s", emsg);
		break;
	}

	return 0;
}

1927 1928 1929 1930 1931 1932 1933 1934 1935
void perf_evlist__to_front(struct perf_evlist *evlist,
			   struct perf_evsel *move_evsel)
{
	struct perf_evsel *evsel, *n;
	LIST_HEAD(move);

	if (move_evsel == perf_evlist__first(evlist))
		return;

1936
	evlist__for_each_entry_safe(evlist, n, evsel) {
1937 1938 1939 1940 1941 1942
		if (evsel->leader == move_evsel->leader)
			list_move_tail(&evsel->node, &move);
	}

	list_splice(&move, &evlist->entries);
}
1943 1944 1945 1946 1947 1948 1949 1950 1951

void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
				     struct perf_evsel *tracking_evsel)
{
	struct perf_evsel *evsel;

	if (tracking_evsel->tracking)
		return;

1952
	evlist__for_each_entry(evlist, evsel) {
1953 1954 1955 1956 1957 1958
		if (evsel != tracking_evsel)
			evsel->tracking = false;
	}

	tracking_evsel->tracking = true;
}
1959 1960 1961 1962 1963 1964 1965

struct perf_evsel *
perf_evlist__find_evsel_by_str(struct perf_evlist *evlist,
			       const char *str)
{
	struct perf_evsel *evsel;

1966
	evlist__for_each_entry(evlist, evsel) {
1967 1968 1969 1970 1971 1972 1973 1974
		if (!evsel->name)
			continue;
		if (strcmp(str, evsel->name) == 0)
			return evsel;
	}

	return NULL;
}