Linux Audio

Check our new training course

Loading...
v4.6
 
   1/*
   2 * builtin-record.c
   3 *
   4 * Builtin record command: Record the profile of a workload
   5 * (or a CPU, or a PID) into the perf.data output file - for
   6 * later analysis via perf report.
   7 */
   8#include "builtin.h"
   9
  10#include "perf.h"
  11
  12#include "util/build-id.h"
  13#include "util/util.h"
  14#include <subcmd/parse-options.h>
  15#include "util/parse-events.h"
 
  16
  17#include "util/callchain.h"
  18#include "util/cgroup.h"
  19#include "util/header.h"
  20#include "util/event.h"
  21#include "util/evlist.h"
  22#include "util/evsel.h"
  23#include "util/debug.h"
 
  24#include "util/session.h"
  25#include "util/tool.h"
  26#include "util/symbol.h"
  27#include "util/cpumap.h"
  28#include "util/thread_map.h"
  29#include "util/data.h"
  30#include "util/perf_regs.h"
  31#include "util/auxtrace.h"
 
  32#include "util/parse-branch-options.h"
  33#include "util/parse-regs-options.h"
  34#include "util/llvm-utils.h"
  35#include "util/bpf-loader.h"
 
 
 
 
  36#include "asm/bug.h"
  37
 
 
 
 
  38#include <unistd.h>
  39#include <sched.h>
 
  40#include <sys/mman.h>
 
 
  41
 
 
 
 
 
 
 
 
  42
  43struct record {
  44	struct perf_tool	tool;
  45	struct record_opts	opts;
  46	u64			bytes_written;
  47	struct perf_data_file	file;
  48	struct auxtrace_record	*itr;
  49	struct perf_evlist	*evlist;
  50	struct perf_session	*session;
  51	const char		*progname;
  52	int			realtime_prio;
  53	bool			no_buildid;
  54	bool			no_buildid_set;
  55	bool			no_buildid_cache;
  56	bool			no_buildid_cache_set;
  57	bool			buildid_all;
 
 
 
  58	unsigned long long	samples;
  59};
  60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  61static int record__write(struct record *rec, void *bf, size_t size)
  62{
  63	if (perf_data_file__write(rec->session->file, bf, size) < 0) {
  64		pr_err("failed to write perf data, error: %m\n");
  65		return -1;
  66	}
  67
  68	rec->bytes_written += size;
 
 
 
 
  69	return 0;
  70}
  71
  72static int process_synthesized_event(struct perf_tool *tool,
  73				     union perf_event *event,
  74				     struct perf_sample *sample __maybe_unused,
  75				     struct machine *machine __maybe_unused)
  76{
  77	struct record *rec = container_of(tool, struct record, tool);
  78	return record__write(rec, event, event->header.size);
  79}
  80
  81static int record__mmap_read(struct record *rec, int idx)
  82{
  83	struct perf_mmap *md = &rec->evlist->mmap[idx];
  84	u64 head = perf_mmap__read_head(md);
  85	u64 old = md->prev;
  86	unsigned char *data = md->base + page_size;
  87	unsigned long size;
  88	void *buf;
  89	int rc = 0;
  90
  91	if (old == head)
  92		return 0;
  93
  94	rec->samples++;
  95
  96	size = head - old;
  97
  98	if ((old & md->mask) + size != (head & md->mask)) {
  99		buf = &data[old & md->mask];
 100		size = md->mask + 1 - (old & md->mask);
 101		old += size;
 102
 103		if (record__write(rec, buf, size) < 0) {
 104			rc = -1;
 105			goto out;
 106		}
 107	}
 108
 109	buf = &data[old & md->mask];
 110	size = head - old;
 111	old += size;
 112
 113	if (record__write(rec, buf, size) < 0) {
 114		rc = -1;
 115		goto out;
 116	}
 117
 118	md->prev = old;
 119	perf_evlist__mmap_consume(rec->evlist, idx);
 120out:
 121	return rc;
 122}
 123
 124static volatile int done;
 125static volatile int signr = -1;
 126static volatile int child_finished;
 127static volatile int auxtrace_snapshot_enabled;
 128static volatile int auxtrace_snapshot_err;
 129static volatile int auxtrace_record__snapshot_started;
 130
 131static void sig_handler(int sig)
 132{
 133	if (sig == SIGCHLD)
 134		child_finished = 1;
 135	else
 136		signr = sig;
 137
 138	done = 1;
 139}
 140
 
 
 
 
 
 
 141static void record__sig_exit(void)
 142{
 143	if (signr == -1)
 144		return;
 145
 146	signal(signr, SIG_DFL);
 147	raise(signr);
 148}
 149
 150#ifdef HAVE_AUXTRACE_SUPPORT
 151
 152static int record__process_auxtrace(struct perf_tool *tool,
 153				    union perf_event *event, void *data1,
 154				    size_t len1, void *data2, size_t len2)
 155{
 156	struct record *rec = container_of(tool, struct record, tool);
 157	struct perf_data_file *file = &rec->file;
 158	size_t padding;
 159	u8 pad[8] = {0};
 160
 161	if (!perf_data_file__is_pipe(file)) {
 162		off_t file_offset;
 163		int fd = perf_data_file__fd(file);
 164		int err;
 165
 166		file_offset = lseek(fd, 0, SEEK_CUR);
 167		if (file_offset == -1)
 168			return -1;
 169		err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index,
 170						     event, file_offset);
 171		if (err)
 172			return err;
 173	}
 174
 175	/* event.auxtrace.size includes padding, see __auxtrace_mmap__read() */
 176	padding = (len1 + len2) & 7;
 177	if (padding)
 178		padding = 8 - padding;
 179
 180	record__write(rec, event, event->header.size);
 181	record__write(rec, data1, len1);
 182	if (len2)
 183		record__write(rec, data2, len2);
 184	record__write(rec, &pad, padding);
 185
 186	return 0;
 187}
 188
 189static int record__auxtrace_mmap_read(struct record *rec,
 190				      struct auxtrace_mmap *mm)
 191{
 192	int ret;
 193
 194	ret = auxtrace_mmap__read(mm, rec->itr, &rec->tool,
 195				  record__process_auxtrace);
 196	if (ret < 0)
 197		return ret;
 198
 199	if (ret)
 200		rec->samples++;
 201
 202	return 0;
 203}
 204
 205static int record__auxtrace_mmap_read_snapshot(struct record *rec,
 206					       struct auxtrace_mmap *mm)
 207{
 208	int ret;
 209
 210	ret = auxtrace_mmap__read_snapshot(mm, rec->itr, &rec->tool,
 211					   record__process_auxtrace,
 212					   rec->opts.auxtrace_snapshot_size);
 213	if (ret < 0)
 214		return ret;
 215
 216	if (ret)
 217		rec->samples++;
 218
 219	return 0;
 220}
 221
 222static int record__auxtrace_read_snapshot_all(struct record *rec)
 223{
 224	int i;
 225	int rc = 0;
 226
 227	for (i = 0; i < rec->evlist->nr_mmaps; i++) {
 228		struct auxtrace_mmap *mm =
 229				&rec->evlist->mmap[i].auxtrace_mmap;
 230
 231		if (!mm->base)
 232			continue;
 233
 234		if (record__auxtrace_mmap_read_snapshot(rec, mm) != 0) {
 235			rc = -1;
 236			goto out;
 237		}
 238	}
 239out:
 240	return rc;
 241}
 242
 243static void record__read_auxtrace_snapshot(struct record *rec)
 244{
 245	pr_debug("Recording AUX area tracing snapshot\n");
 246	if (record__auxtrace_read_snapshot_all(rec) < 0) {
 247		auxtrace_snapshot_err = -1;
 248	} else {
 249		auxtrace_snapshot_err = auxtrace_record__snapshot_finish(rec->itr);
 250		if (!auxtrace_snapshot_err)
 251			auxtrace_snapshot_enabled = 1;
 
 
 
 
 
 
 
 
 
 
 
 
 252	}
 
 
 
 
 
 
 
 253}
 254
 255#else
 256
 257static inline
 258int record__auxtrace_mmap_read(struct record *rec __maybe_unused,
 259			       struct auxtrace_mmap *mm __maybe_unused)
 260{
 261	return 0;
 262}
 263
 264static inline
 265void record__read_auxtrace_snapshot(struct record *rec __maybe_unused)
 266{
 267}
 268
 269static inline
 270int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused)
 271{
 272	return 0;
 273}
 274
 
 
 
 
 
 275#endif
 276
 277static int record__open(struct record *rec)
 
 278{
 
 279	char msg[512];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 280	struct perf_evsel *pos;
 281	struct perf_evlist *evlist = rec->evlist;
 282	struct perf_session *session = rec->session;
 283	struct record_opts *opts = &rec->opts;
 
 284	int rc = 0;
 285
 286	perf_evlist__config(evlist, opts);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 287
 288	evlist__for_each(evlist, pos) {
 
 
 289try_again:
 290		if (perf_evsel__open(pos, pos->cpus, pos->threads) < 0) {
 291			if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
 292				if (verbose)
 293					ui__warning("%s\n", msg);
 294				goto try_again;
 295			}
 296
 297			rc = -errno;
 298			perf_evsel__open_strerror(pos, &opts->target,
 299						  errno, msg, sizeof(msg));
 300			ui__error("%s\n", msg);
 301			goto out;
 302		}
 
 
 303	}
 304
 305	if (perf_evlist__apply_filters(evlist, &pos)) {
 306		error("failed to set filter \"%s\" on event %s with %d (%s)\n",
 307			pos->filter, perf_evsel__name(pos), errno,
 308			strerror_r(errno, msg, sizeof(msg)));
 309		rc = -1;
 310		goto out;
 311	}
 312
 313	if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, false,
 314				 opts->auxtrace_mmap_pages,
 315				 opts->auxtrace_snapshot_mode) < 0) {
 316		if (errno == EPERM) {
 317			pr_err("Permission error mapping pages.\n"
 318			       "Consider increasing "
 319			       "/proc/sys/kernel/perf_event_mlock_kb,\n"
 320			       "or try again with a smaller value of -m/--mmap_pages.\n"
 321			       "(current value: %u,%u)\n",
 322			       opts->mmap_pages, opts->auxtrace_mmap_pages);
 323			rc = -errno;
 324		} else {
 325			pr_err("failed to mmap with %d (%s)\n", errno,
 326				strerror_r(errno, msg, sizeof(msg)));
 327			if (errno)
 328				rc = -errno;
 329			else
 330				rc = -EINVAL;
 331		}
 332		goto out;
 333	}
 334
 
 
 
 
 335	session->evlist = evlist;
 336	perf_session__set_id_hdr_size(session);
 337out:
 338	return rc;
 339}
 340
 341static int process_sample_event(struct perf_tool *tool,
 342				union perf_event *event,
 343				struct perf_sample *sample,
 344				struct perf_evsel *evsel,
 345				struct machine *machine)
 346{
 347	struct record *rec = container_of(tool, struct record, tool);
 348
 349	rec->samples++;
 
 
 
 
 
 
 350
 
 351	return build_id__mark_dso_hit(tool, event, sample, evsel, machine);
 352}
 353
 354static int process_buildids(struct record *rec)
 355{
 356	struct perf_data_file *file  = &rec->file;
 357	struct perf_session *session = rec->session;
 358
 359	if (file->size == 0)
 360		return 0;
 361
 362	/*
 363	 * During this process, it'll load kernel map and replace the
 364	 * dso->long_name to a real pathname it found.  In this case
 365	 * we prefer the vmlinux path like
 366	 *   /lib/modules/3.16.4/build/vmlinux
 367	 *
 368	 * rather than build-id path (in debug directory).
 369	 *   $HOME/.debug/.build-id/f0/6e17aa50adf4d00b88925e03775de107611551
 370	 */
 371	symbol_conf.ignore_vmlinux_buildid = true;
 372
 373	/*
 374	 * If --buildid-all is given, it marks all DSO regardless of hits,
 375	 * so no need to process samples.
 
 
 376	 */
 377	if (rec->buildid_all)
 378		rec->tool.sample = NULL;
 379
 380	return perf_session__process_events(session);
 381}
 382
 383static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
 384{
 385	int err;
 386	struct perf_tool *tool = data;
 387	/*
 388	 *As for guest kernel when processing subcommand record&report,
 389	 *we arrange module mmap prior to guest kernel mmap and trigger
 390	 *a preload dso because default guest module symbols are loaded
 391	 *from guest kallsyms instead of /lib/modules/XXX/XXX. This
 392	 *method is used to avoid symbol missing when the first addr is
 393	 *in module instead of in guest kernel.
 394	 */
 395	err = perf_event__synthesize_modules(tool, process_synthesized_event,
 396					     machine);
 397	if (err < 0)
 398		pr_err("Couldn't record guest kernel [%d]'s reference"
 399		       " relocation symbol.\n", machine->pid);
 400
 401	/*
 402	 * We use _stext for guest kernel because guest kernel's /proc/kallsyms
 403	 * have no _text sometimes.
 404	 */
 405	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
 406						 machine);
 407	if (err < 0)
 408		pr_err("Couldn't record guest kernel [%d]'s reference"
 409		       " relocation symbol.\n", machine->pid);
 410}
 411
 412static struct perf_event_header finished_round_event = {
 413	.size = sizeof(struct perf_event_header),
 414	.type = PERF_RECORD_FINISHED_ROUND,
 415};
 416
 417static int record__mmap_read_all(struct record *rec)
 
 418{
 419	u64 bytes_written = rec->bytes_written;
 420	int i;
 421	int rc = 0;
 
 422
 423	for (i = 0; i < rec->evlist->nr_mmaps; i++) {
 424		struct auxtrace_mmap *mm = &rec->evlist->mmap[i].auxtrace_mmap;
 
 
 
 
 
 
 
 
 
 
 425
 426		if (rec->evlist->mmap[i].base) {
 427			if (record__mmap_read(rec, i) != 0) {
 428				rc = -1;
 429				goto out;
 430			}
 431		}
 432
 433		if (mm->base && !rec->opts.auxtrace_snapshot_mode &&
 434		    record__auxtrace_mmap_read(rec, mm) != 0) {
 435			rc = -1;
 436			goto out;
 437		}
 438	}
 439
 440	/*
 441	 * Mark the round finished in case we wrote
 442	 * at least one event.
 443	 */
 444	if (bytes_written != rec->bytes_written)
 445		rc = record__write(rec, &finished_round_event, sizeof(finished_round_event));
 446
 
 
 447out:
 448	return rc;
 449}
 450
 
 
 
 
 
 
 
 
 
 
 
 451static void record__init_features(struct record *rec)
 452{
 453	struct perf_session *session = rec->session;
 454	int feat;
 455
 456	for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
 457		perf_header__set_feat(&session->header, feat);
 458
 459	if (rec->no_buildid)
 460		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
 461
 462	if (!have_tracepoints(&rec->evlist->entries))
 463		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
 464
 465	if (!rec->opts.branch_stack)
 466		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
 467
 468	if (!rec->opts.full_auxtrace)
 469		perf_header__clear_feat(&session->header, HEADER_AUXTRACE);
 470
 471	perf_header__clear_feat(&session->header, HEADER_STAT);
 472}
 473
 474static void
 475record__finish_output(struct record *rec)
 476{
 477	struct perf_data_file *file = &rec->file;
 478	int fd = perf_data_file__fd(file);
 479
 480	if (file->is_pipe)
 481		return;
 482
 483	rec->session->header.data_size += rec->bytes_written;
 484	file->size = lseek(perf_data_file__fd(file), 0, SEEK_CUR);
 485
 486	if (!rec->no_buildid) {
 487		process_buildids(rec);
 488
 489		if (rec->buildid_all)
 490			dsos__hit_all(rec->session);
 491	}
 492	perf_session__write_header(rec->session, rec->evlist, fd, true);
 493
 494	return;
 495}
 496
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 497static volatile int workload_exec_errno;
 498
 499/*
 500 * perf_evlist__prepare_workload will send a SIGUSR1
 501 * if the fork fails, since we asked by setting its
 502 * want_signal to true.
 503 */
 504static void workload_exec_failed_signal(int signo __maybe_unused,
 505					siginfo_t *info,
 506					void *ucontext __maybe_unused)
 507{
 508	workload_exec_errno = info->si_value.sival_int;
 509	done = 1;
 510	child_finished = 1;
 511}
 512
 513static void snapshot_sig_handler(int sig);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 514
 515static int record__synthesize(struct record *rec)
 
 
 
 
 
 
 
 
 
 
 516{
 517	struct perf_session *session = rec->session;
 518	struct machine *machine = &session->machines.host;
 519	struct perf_data_file *file = &rec->file;
 520	struct record_opts *opts = &rec->opts;
 521	struct perf_tool *tool = &rec->tool;
 522	int fd = perf_data_file__fd(file);
 523	int err = 0;
 524
 525	if (file->is_pipe) {
 
 
 
 
 
 
 
 526		err = perf_event__synthesize_attrs(tool, session,
 527						   process_synthesized_event);
 528		if (err < 0) {
 529			pr_err("Couldn't synthesize attrs.\n");
 530			goto out;
 531		}
 532
 
 
 
 
 
 
 
 533		if (have_tracepoints(&rec->evlist->entries)) {
 534			/*
 535			 * FIXME err <= 0 here actually means that
 536			 * there were no tracepoints so its not really
 537			 * an error, just that we don't need to
 538			 * synthesize anything.  We really have to
 539			 * return this more properly and also
 540			 * propagate errors that now are calling die()
 541			 */
 542			err = perf_event__synthesize_tracing_data(tool,	fd, rec->evlist,
 543								  process_synthesized_event);
 544			if (err <= 0) {
 545				pr_err("Couldn't record tracing data.\n");
 546				goto out;
 547			}
 548			rec->bytes_written += err;
 549		}
 550	}
 551
 
 
 
 
 
 552	if (rec->opts.full_auxtrace) {
 553		err = perf_event__synthesize_auxtrace_info(rec->itr, tool,
 554					session, process_synthesized_event);
 555		if (err)
 556			goto out;
 557	}
 558
 559	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
 560						 machine);
 561	WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n"
 562			   "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
 563			   "Check /proc/kallsyms permission or run as root.\n");
 564
 565	err = perf_event__synthesize_modules(tool, process_synthesized_event,
 566					     machine);
 567	WARN_ONCE(err < 0, "Couldn't record kernel module information.\n"
 568			   "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
 569			   "Check /proc/modules permission or run as root.\n");
 
 
 570
 571	if (perf_guest) {
 572		machines__process_guests(&session->machines,
 573					 perf_event__synthesize_guest_os, tool);
 574	}
 575
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 576	err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads,
 577					    process_synthesized_event, opts->sample_address,
 578					    opts->proc_map_timeout);
 579out:
 580	return err;
 581}
 582
 583static int __cmd_record(struct record *rec, int argc, const char **argv)
 584{
 585	int err;
 586	int status = 0;
 587	unsigned long waking = 0;
 588	const bool forks = argc > 0;
 589	struct machine *machine;
 590	struct perf_tool *tool = &rec->tool;
 591	struct record_opts *opts = &rec->opts;
 592	struct perf_data_file *file = &rec->file;
 593	struct perf_session *session;
 594	bool disabled = false, draining = false;
 595	int fd;
 596
 597	rec->progname = argv[0];
 598
 599	atexit(record__sig_exit);
 600	signal(SIGCHLD, sig_handler);
 601	signal(SIGINT, sig_handler);
 602	signal(SIGTERM, sig_handler);
 603	if (rec->opts.auxtrace_snapshot_mode)
 
 
 
 
 
 604		signal(SIGUSR2, snapshot_sig_handler);
 605	else
 
 
 
 
 606		signal(SIGUSR2, SIG_IGN);
 
 607
 608	session = perf_session__new(file, false, tool);
 609	if (session == NULL) {
 610		pr_err("Perf session creation failed.\n");
 611		return -1;
 612	}
 613
 614	fd = perf_data_file__fd(file);
 615	rec->session = session;
 616
 617	record__init_features(rec);
 618
 619	if (forks) {
 620		err = perf_evlist__prepare_workload(rec->evlist, &opts->target,
 621						    argv, file->is_pipe,
 622						    workload_exec_failed_signal);
 623		if (err < 0) {
 624			pr_err("Couldn't run the workload!\n");
 625			status = err;
 626			goto out_delete_session;
 627		}
 628	}
 629
 
 
 
 
 
 
 
 
 
 630	if (record__open(rec) != 0) {
 631		err = -1;
 632		goto out_child;
 633	}
 634
 635	err = bpf__apply_obj_config();
 636	if (err) {
 637		char errbuf[BUFSIZ];
 638
 639		bpf__strerror_apply_obj_config(err, errbuf, sizeof(errbuf));
 640		pr_err("ERROR: Apply config to BPF failed: %s\n",
 641			 errbuf);
 642		goto out_child;
 643	}
 644
 645	/*
 646	 * Normally perf_session__new would do this, but it doesn't have the
 647	 * evlist.
 648	 */
 649	if (rec->tool.ordered_events && !perf_evlist__sample_id_all(rec->evlist)) {
 650		pr_warning("WARNING: No sample_id_all support, falling back to unordered processing\n");
 651		rec->tool.ordered_events = false;
 652	}
 653
 654	if (!rec->evlist->nr_groups)
 655		perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);
 656
 657	if (file->is_pipe) {
 658		err = perf_header__write_pipe(fd);
 659		if (err < 0)
 660			goto out_child;
 661	} else {
 662		err = perf_session__write_header(session, rec->evlist, fd, false);
 663		if (err < 0)
 664			goto out_child;
 665	}
 666
 667	if (!rec->no_buildid
 668	    && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
 669		pr_err("Couldn't generate buildids. "
 670		       "Use --no-buildid to profile anyway.\n");
 671		err = -1;
 672		goto out_child;
 673	}
 674
 675	machine = &session->machines.host;
 676
 677	err = record__synthesize(rec);
 678	if (err < 0)
 679		goto out_child;
 680
 681	if (rec->realtime_prio) {
 682		struct sched_param param;
 683
 684		param.sched_priority = rec->realtime_prio;
 685		if (sched_setscheduler(0, SCHED_FIFO, &param)) {
 686			pr_err("Could not set realtime priority.\n");
 687			err = -1;
 688			goto out_child;
 689		}
 690	}
 691
 692	/*
 693	 * When perf is starting the traced process, all the events
 694	 * (apart from group members) have enable_on_exec=1 set,
 695	 * so don't spoil it by prematurely enabling them.
 696	 */
 697	if (!target__none(&opts->target) && !opts->initial_delay)
 698		perf_evlist__enable(rec->evlist);
 699
 700	/*
 701	 * Let the child rip
 702	 */
 703	if (forks) {
 
 704		union perf_event *event;
 
 705
 706		event = malloc(sizeof(event->comm) + machine->id_hdr_size);
 707		if (event == NULL) {
 708			err = -ENOMEM;
 709			goto out_child;
 710		}
 711
 712		/*
 713		 * Some H/W events are generated before COMM event
 714		 * which is emitted during exec(), so perf script
 715		 * cannot see a correct process name for those events.
 716		 * Synthesize COMM event to prevent it.
 717		 */
 718		perf_event__synthesize_comm(tool, event,
 719					    rec->evlist->workload.pid,
 720					    process_synthesized_event,
 721					    machine);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 722		free(event);
 723
 724		perf_evlist__start_workload(rec->evlist);
 725	}
 726
 727	if (opts->initial_delay) {
 728		usleep(opts->initial_delay * 1000);
 729		perf_evlist__enable(rec->evlist);
 730	}
 731
 732	auxtrace_snapshot_enabled = 1;
 
 
 733	for (;;) {
 734		unsigned long long hits = rec->samples;
 735
 
 
 
 
 
 
 
 
 
 
 
 736		if (record__mmap_read_all(rec) < 0) {
 737			auxtrace_snapshot_enabled = 0;
 
 738			err = -1;
 739			goto out_child;
 740		}
 741
 742		if (auxtrace_record__snapshot_started) {
 743			auxtrace_record__snapshot_started = 0;
 744			if (!auxtrace_snapshot_err)
 745				record__read_auxtrace_snapshot(rec);
 746			if (auxtrace_snapshot_err) {
 747				pr_err("AUX area tracing snapshot failed\n");
 748				err = -1;
 749				goto out_child;
 750			}
 751		}
 752
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 753		if (hits == rec->samples) {
 754			if (done || draining)
 755				break;
 756			err = perf_evlist__poll(rec->evlist, -1);
 757			/*
 758			 * Propagate error, only if there's any. Ignore positive
 759			 * number of returned events and interrupt error.
 760			 */
 761			if (err > 0 || (err < 0 && errno == EINTR))
 762				err = 0;
 763			waking++;
 764
 765			if (perf_evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0)
 766				draining = true;
 767		}
 768
 769		/*
 770		 * When perf is starting the traced process, at the end events
 771		 * die with the process and we wait for that. Thus no need to
 772		 * disable events in this case.
 773		 */
 774		if (done && !disabled && !target__none(&opts->target)) {
 775			auxtrace_snapshot_enabled = 0;
 776			perf_evlist__disable(rec->evlist);
 777			disabled = true;
 778		}
 779	}
 780	auxtrace_snapshot_enabled = 0;
 
 781
 782	if (forks && workload_exec_errno) {
 783		char msg[STRERR_BUFSIZE];
 784		const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg));
 785		pr_err("Workload failed: %s\n", emsg);
 786		err = -1;
 787		goto out_child;
 788	}
 789
 790	if (!quiet)
 791		fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
 792
 
 
 
 793out_child:
 794	if (forks) {
 795		int exit_status;
 796
 797		if (!child_finished)
 798			kill(rec->evlist->workload.pid, SIGTERM);
 799
 800		wait(&exit_status);
 801
 802		if (err < 0)
 803			status = err;
 804		else if (WIFEXITED(exit_status))
 805			status = WEXITSTATUS(exit_status);
 806		else if (WIFSIGNALED(exit_status))
 807			signr = WTERMSIG(exit_status);
 808	} else
 809		status = err;
 810
 
 811	/* this will be recalculated during process_buildids() */
 812	rec->samples = 0;
 813
 814	if (!err)
 815		record__finish_output(rec);
 
 
 
 
 
 
 
 
 
 
 
 816
 817	if (!err && !quiet) {
 818		char samples[128];
 
 
 819
 820		if (rec->samples && !rec->opts.full_auxtrace)
 821			scnprintf(samples, sizeof(samples),
 822				  " (%" PRIu64 " samples)", rec->samples);
 823		else
 824			samples[0] = '\0';
 825
 826		fprintf(stderr,	"[ perf record: Captured and wrote %.3f MB %s%s ]\n",
 827			perf_data_file__size(file) / 1024.0 / 1024.0,
 828			file->path, samples);
 829	}
 830
 831out_delete_session:
 832	perf_session__delete(session);
 833	return status;
 834}
 835
 836static void callchain_debug(void)
 837{
 838	static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" };
 839
 840	pr_debug("callchain: type %s\n", str[callchain_param.record_mode]);
 841
 842	if (callchain_param.record_mode == CALLCHAIN_DWARF)
 843		pr_debug("callchain: stack dump size %d\n",
 844			 callchain_param.dump_size);
 845}
 846
 847int record_parse_callchain_opt(const struct option *opt,
 848			       const char *arg,
 849			       int unset)
 850{
 851	int ret;
 852	struct record_opts *record = (struct record_opts *)opt->value;
 853
 854	record->callgraph_set = true;
 855	callchain_param.enabled = !unset;
 856
 857	/* --no-call-graph */
 858	if (unset) {
 859		callchain_param.record_mode = CALLCHAIN_NONE;
 860		pr_debug("callchain: disabled\n");
 861		return 0;
 862	}
 863
 864	ret = parse_callchain_record_opt(arg, &callchain_param);
 865	if (!ret) {
 866		/* Enable data address sampling for DWARF unwind. */
 867		if (callchain_param.record_mode == CALLCHAIN_DWARF)
 868			record->sample_address = true;
 869		callchain_debug();
 870	}
 871
 872	return ret;
 873}
 874
 
 
 
 
 
 
 
 875int record_callchain_opt(const struct option *opt,
 876			 const char *arg __maybe_unused,
 877			 int unset __maybe_unused)
 878{
 879	struct record_opts *record = (struct record_opts *)opt->value;
 880
 881	record->callgraph_set = true;
 882	callchain_param.enabled = true;
 883
 884	if (callchain_param.record_mode == CALLCHAIN_NONE)
 885		callchain_param.record_mode = CALLCHAIN_FP;
 886
 887	callchain_debug();
 888	return 0;
 889}
 890
 891static int perf_record_config(const char *var, const char *value, void *cb)
 892{
 893	struct record *rec = cb;
 894
 895	if (!strcmp(var, "record.build-id")) {
 896		if (!strcmp(value, "cache"))
 897			rec->no_buildid_cache = false;
 898		else if (!strcmp(value, "no-cache"))
 899			rec->no_buildid_cache = true;
 900		else if (!strcmp(value, "skip"))
 901			rec->no_buildid = true;
 902		else
 903			return -1;
 904		return 0;
 905	}
 906	if (!strcmp(var, "record.call-graph"))
 907		var = "call-graph.record-mode"; /* fall-through */
 
 
 908
 909	return perf_default_config(var, value, cb);
 910}
 911
 912struct clockid_map {
 913	const char *name;
 914	int clockid;
 915};
 916
 917#define CLOCKID_MAP(n, c)	\
 918	{ .name = n, .clockid = (c), }
 919
 920#define CLOCKID_END	{ .name = NULL, }
 921
 922
 923/*
 924 * Add the missing ones, we need to build on many distros...
 925 */
 926#ifndef CLOCK_MONOTONIC_RAW
 927#define CLOCK_MONOTONIC_RAW 4
 928#endif
 929#ifndef CLOCK_BOOTTIME
 930#define CLOCK_BOOTTIME 7
 931#endif
 932#ifndef CLOCK_TAI
 933#define CLOCK_TAI 11
 934#endif
 935
 936static const struct clockid_map clockids[] = {
 937	/* available for all events, NMI safe */
 938	CLOCKID_MAP("monotonic", CLOCK_MONOTONIC),
 939	CLOCKID_MAP("monotonic_raw", CLOCK_MONOTONIC_RAW),
 940
 941	/* available for some events */
 942	CLOCKID_MAP("realtime", CLOCK_REALTIME),
 943	CLOCKID_MAP("boottime", CLOCK_BOOTTIME),
 944	CLOCKID_MAP("tai", CLOCK_TAI),
 945
 946	/* available for the lazy */
 947	CLOCKID_MAP("mono", CLOCK_MONOTONIC),
 948	CLOCKID_MAP("raw", CLOCK_MONOTONIC_RAW),
 949	CLOCKID_MAP("real", CLOCK_REALTIME),
 950	CLOCKID_MAP("boot", CLOCK_BOOTTIME),
 951
 952	CLOCKID_END,
 953};
 954
 955static int parse_clockid(const struct option *opt, const char *str, int unset)
 956{
 957	struct record_opts *opts = (struct record_opts *)opt->value;
 958	const struct clockid_map *cm;
 959	const char *ostr = str;
 960
 961	if (unset) {
 962		opts->use_clockid = 0;
 963		return 0;
 964	}
 965
 966	/* no arg passed */
 967	if (!str)
 968		return 0;
 969
 970	/* no setting it twice */
 971	if (opts->use_clockid)
 972		return -1;
 973
 974	opts->use_clockid = true;
 975
 976	/* if its a number, we're done */
 977	if (sscanf(str, "%d", &opts->clockid) == 1)
 978		return 0;
 979
 980	/* allow a "CLOCK_" prefix to the name */
 981	if (!strncasecmp(str, "CLOCK_", 6))
 982		str += 6;
 983
 984	for (cm = clockids; cm->name; cm++) {
 985		if (!strcasecmp(str, cm->name)) {
 986			opts->clockid = cm->clockid;
 987			return 0;
 988		}
 989	}
 990
 991	opts->use_clockid = false;
 992	ui__warning("unknown clockid %s, check man page\n", ostr);
 993	return -1;
 994}
 995
 996static int record__parse_mmap_pages(const struct option *opt,
 997				    const char *str,
 998				    int unset __maybe_unused)
 999{
1000	struct record_opts *opts = opt->value;
1001	char *s, *p;
1002	unsigned int mmap_pages;
1003	int ret;
1004
1005	if (!str)
1006		return -EINVAL;
1007
1008	s = strdup(str);
1009	if (!s)
1010		return -ENOMEM;
1011
1012	p = strchr(s, ',');
1013	if (p)
1014		*p = '\0';
1015
1016	if (*s) {
1017		ret = __perf_evlist__parse_mmap_pages(&mmap_pages, s);
1018		if (ret)
1019			goto out_free;
1020		opts->mmap_pages = mmap_pages;
1021	}
1022
1023	if (!p) {
1024		ret = 0;
1025		goto out_free;
1026	}
1027
1028	ret = __perf_evlist__parse_mmap_pages(&mmap_pages, p + 1);
1029	if (ret)
1030		goto out_free;
1031
1032	opts->auxtrace_mmap_pages = mmap_pages;
1033
1034out_free:
1035	free(s);
1036	return ret;
1037}
1038
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1039static const char * const __record_usage[] = {
1040	"perf record [<options>] [<command>]",
1041	"perf record [<options>] -- <command> [<options>]",
1042	NULL
1043};
1044const char * const *record_usage = __record_usage;
1045
1046/*
1047 * XXX Ideally would be local to cmd_record() and passed to a record__new
1048 * because we need to have access to it in record__exit, that is called
1049 * after cmd_record() exits, but since record_options need to be accessible to
1050 * builtin-script, leave it here.
1051 *
1052 * At least we don't ouch it in all the other functions here directly.
1053 *
1054 * Just say no to tons of global variables, sigh.
1055 */
1056static struct record record = {
1057	.opts = {
1058		.sample_time	     = true,
1059		.mmap_pages	     = UINT_MAX,
1060		.user_freq	     = UINT_MAX,
1061		.user_interval	     = ULLONG_MAX,
1062		.freq		     = 4000,
1063		.target		     = {
1064			.uses_mmap   = true,
1065			.default_per_cpu = true,
1066		},
1067		.proc_map_timeout     = 500,
1068	},
1069	.tool = {
1070		.sample		= process_sample_event,
1071		.fork		= perf_event__process_fork,
1072		.exit		= perf_event__process_exit,
1073		.comm		= perf_event__process_comm,
 
1074		.mmap		= perf_event__process_mmap,
1075		.mmap2		= perf_event__process_mmap2,
1076		.ordered_events	= true,
1077	},
1078};
1079
1080const char record_callchain_help[] = CALLCHAIN_RECORD_HELP
1081	"\n\t\t\t\tDefault: fp";
1082
 
 
1083/*
1084 * XXX Will stay a global variable till we fix builtin-script.c to stop messing
1085 * with it and switch to use the library functions in perf_evlist that came
1086 * from builtin-record.c, i.e. use record_opts,
1087 * perf_evlist__prepare_workload, etc instead of fork+exec'in 'perf record',
1088 * using pipes, etc.
1089 */
1090struct option __record_options[] = {
1091	OPT_CALLBACK('e', "event", &record.evlist, "event",
1092		     "event selector. use 'perf list' to list available events",
1093		     parse_events_option),
1094	OPT_CALLBACK(0, "filter", &record.evlist, "filter",
1095		     "event filter", parse_filter),
1096	OPT_CALLBACK_NOOPT(0, "exclude-perf", &record.evlist,
1097			   NULL, "don't record events from perf itself",
1098			   exclude_perf),
1099	OPT_STRING('p', "pid", &record.opts.target.pid, "pid",
1100		    "record events on existing process id"),
1101	OPT_STRING('t', "tid", &record.opts.target.tid, "tid",
1102		    "record events on existing thread id"),
1103	OPT_INTEGER('r', "realtime", &record.realtime_prio,
1104		    "collect data with this RT SCHED_FIFO priority"),
1105	OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering,
1106		    "collect data without buffering"),
1107	OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples,
1108		    "collect raw sample records from all opened counters"),
1109	OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide,
1110			    "system-wide collection from all CPUs"),
1111	OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
1112		    "list of cpus to monitor"),
1113	OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
1114	OPT_STRING('o', "output", &record.file.path, "file",
1115		    "output file name"),
1116	OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
1117			&record.opts.no_inherit_set,
1118			"child tasks do not inherit counters"),
1119	OPT_UINTEGER('F', "freq", &record.opts.user_freq, "profile at this frequency"),
 
 
 
 
 
 
 
1120	OPT_CALLBACK('m', "mmap-pages", &record.opts, "pages[,pages]",
1121		     "number of mmap data pages and AUX area tracing mmap pages",
1122		     record__parse_mmap_pages),
1123	OPT_BOOLEAN(0, "group", &record.opts.group,
1124		    "put the counters into a counter group"),
1125	OPT_CALLBACK_NOOPT('g', NULL, &record.opts,
1126			   NULL, "enables call-graph recording" ,
1127			   &record_callchain_opt),
1128	OPT_CALLBACK(0, "call-graph", &record.opts,
1129		     "record_mode[,record_size]", record_callchain_help,
1130		     &record_parse_callchain_opt),
1131	OPT_INCR('v', "verbose", &verbose,
1132		    "be more verbose (show counter open errors, etc)"),
1133	OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
1134	OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
1135		    "per thread counts"),
1136	OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"),
 
 
 
1137	OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time,
1138			&record.opts.sample_time_set,
1139			"Record the sample timestamps"),
1140	OPT_BOOLEAN('P', "period", &record.opts.period, "Record the sample period"),
 
1141	OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
1142		    "don't sample"),
1143	OPT_BOOLEAN_SET('N', "no-buildid-cache", &record.no_buildid_cache,
1144			&record.no_buildid_cache_set,
1145			"do not update the buildid cache"),
1146	OPT_BOOLEAN_SET('B', "no-buildid", &record.no_buildid,
1147			&record.no_buildid_set,
1148			"do not collect buildids in perf.data"),
1149	OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
1150		     "monitor event in cgroup name only",
1151		     parse_cgroups),
1152	OPT_UINTEGER('D', "delay", &record.opts.initial_delay,
1153		  "ms to wait before starting measurement after program start"),
1154	OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
1155		   "user to profile"),
1156
1157	OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack,
1158		     "branch any", "sample any taken branches",
1159		     parse_branch_stack),
1160
1161	OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack,
1162		     "branch filter mask", "branch stack filter modes",
1163		     parse_branch_stack),
1164	OPT_BOOLEAN('W', "weight", &record.opts.sample_weight,
1165		    "sample by weight (on special events only)"),
1166	OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction,
1167		    "sample transaction flags (special events only)"),
1168	OPT_BOOLEAN(0, "per-thread", &record.opts.target.per_thread,
1169		    "use per-thread mmaps"),
1170	OPT_CALLBACK_OPTARG('I', "intr-regs", &record.opts.sample_intr_regs, NULL, "any register",
1171		    "sample selected machine registers on interrupt,"
1172		    " use -I ? to list register names", parse_regs),
 
 
 
1173	OPT_BOOLEAN(0, "running-time", &record.opts.running_time,
1174		    "Record running/enabled time of read (:S) events"),
1175	OPT_CALLBACK('k', "clockid", &record.opts,
1176	"clockid", "clockid to use for events, see clock_gettime()",
1177	parse_clockid),
1178	OPT_STRING_OPTARG('S', "snapshot", &record.opts.auxtrace_snapshot_opts,
1179			  "opts", "AUX area tracing Snapshot Mode", ""),
1180	OPT_UINTEGER(0, "proc-map-timeout", &record.opts.proc_map_timeout,
1181			"per thread proc mmap processing timeout in ms"),
 
 
1182	OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events,
1183		    "Record context switch events"),
1184	OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
1185			 "Configure all used events to run in kernel space.",
1186			 PARSE_OPT_EXCLUSIVE),
1187	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
1188			 "Configure all used events to run in user space.",
1189			 PARSE_OPT_EXCLUSIVE),
1190	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
1191		   "clang binary to use for compiling BPF scriptlets"),
1192	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
1193		   "options passed to clang when compiling BPF scriptlets"),
1194	OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name,
1195		   "file", "vmlinux pathname"),
1196	OPT_BOOLEAN(0, "buildid-all", &record.buildid_all,
1197		    "Record build-id of all DSOs regardless of hits"),
 
 
 
 
 
 
 
 
 
 
1198	OPT_END()
1199};
1200
1201struct option *record_options = __record_options;
1202
1203int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
1204{
1205	int err;
1206	struct record *rec = &record;
1207	char errbuf[BUFSIZ];
1208
 
 
1209#ifndef HAVE_LIBBPF_SUPPORT
1210# define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, "NO_LIBBPF=1", c)
1211	set_nobuild('\0', "clang-path", true);
1212	set_nobuild('\0', "clang-opt", true);
1213# undef set_nobuild
1214#endif
1215
1216#ifndef HAVE_BPF_PROLOGUE
1217# if !defined (HAVE_DWARF_SUPPORT)
1218#  define REASON  "NO_DWARF=1"
1219# elif !defined (HAVE_LIBBPF_SUPPORT)
1220#  define REASON  "NO_LIBBPF=1"
1221# else
1222#  define REASON  "this architecture doesn't support BPF prologue"
1223# endif
1224# define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, REASON, c)
1225	set_nobuild('\0', "vmlinux", true);
1226# undef set_nobuild
1227# undef REASON
1228#endif
1229
1230	rec->evlist = perf_evlist__new();
1231	if (rec->evlist == NULL)
1232		return -ENOMEM;
1233
1234	perf_config(perf_record_config, rec);
 
 
1235
1236	argc = parse_options(argc, argv, record_options, record_usage,
1237			    PARSE_OPT_STOP_AT_NON_OPTION);
 
 
 
 
1238	if (!argc && target__none(&rec->opts.target))
1239		usage_with_options(record_usage, record_options);
1240
1241	if (nr_cgroups && !rec->opts.target.system_wide) {
1242		usage_with_options_msg(record_usage, record_options,
1243			"cgroup monitoring only available in system-wide mode");
1244
1245	}
1246	if (rec->opts.record_switch_events &&
1247	    !perf_can_record_switch_events()) {
1248		ui__error("kernel does not support recording context switch events\n");
1249		parse_options_usage(record_usage, record_options, "switch-events", 0);
1250		return -EINVAL;
1251	}
1252
1253	if (!rec->itr) {
1254		rec->itr = auxtrace_record__init(rec->evlist, &err);
1255		if (err)
1256			return err;
1257	}
1258
1259	err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts,
1260					      rec->opts.auxtrace_snapshot_opts);
1261	if (err)
1262		return err;
1263
1264	err = -ENOMEM;
 
 
 
 
1265
1266	symbol__init(NULL);
1267
1268	if (symbol_conf.kptr_restrict)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1269		pr_warning(
1270"WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
1271"check /proc/sys/kernel/kptr_restrict.\n\n"
1272"Samples in kernel functions may not be resolved if a suitable vmlinux\n"
1273"file is not found in the buildid cache or in the vmlinux path.\n\n"
1274"Samples in kernel modules won't be resolved at all.\n\n"
1275"If some relocation was applied (e.g. kexec) symbols may be misresolved\n"
1276"even with a suitable vmlinux or kallsyms file.\n\n");
1277
1278	if (rec->no_buildid_cache || rec->no_buildid)
1279		disable_buildid_cache();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1280
1281	if (rec->evlist->nr_entries == 0 &&
1282	    perf_evlist__add_default(rec->evlist) < 0) {
1283		pr_err("Not enough memory for event selector list\n");
1284		goto out_symbol_exit;
1285	}
1286
1287	if (rec->opts.target.tid && !rec->opts.no_inherit_set)
1288		rec->opts.no_inherit = true;
1289
1290	err = target__validate(&rec->opts.target);
1291	if (err) {
1292		target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
1293		ui__warning("%s", errbuf);
1294	}
1295
1296	err = target__parse_uid(&rec->opts.target);
1297	if (err) {
1298		int saved_errno = errno;
1299
1300		target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
1301		ui__error("%s", errbuf);
1302
1303		err = -saved_errno;
1304		goto out_symbol_exit;
1305	}
1306
 
 
 
1307	err = -ENOMEM;
1308	if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0)
1309		usage_with_options(record_usage, record_options);
1310
1311	err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts);
1312	if (err)
1313		goto out_symbol_exit;
1314
1315	/*
1316	 * We take all buildids when the file contains
1317	 * AUX area tracing data because we do not decode the
1318	 * trace because it would take too long.
1319	 */
1320	if (rec->opts.full_auxtrace)
1321		rec->buildid_all = true;
1322
1323	if (record_opts__config(&rec->opts)) {
1324		err = -EINVAL;
1325		goto out_symbol_exit;
1326	}
1327
1328	err = __cmd_record(&record, argc, argv);
1329out_symbol_exit:
1330	perf_evlist__delete(rec->evlist);
1331	symbol__exit();
1332	auxtrace_record__free(rec->itr);
1333	return err;
1334}
1335
1336static void snapshot_sig_handler(int sig __maybe_unused)
1337{
1338	if (!auxtrace_snapshot_enabled)
1339		return;
1340	auxtrace_snapshot_enabled = 0;
1341	auxtrace_snapshot_err = auxtrace_record__snapshot_start(record.itr);
1342	auxtrace_record__snapshot_started = 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1343}
v4.17
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * builtin-record.c
   4 *
   5 * Builtin record command: Record the profile of a workload
   6 * (or a CPU, or a PID) into the perf.data output file - for
   7 * later analysis via perf report.
   8 */
   9#include "builtin.h"
  10
  11#include "perf.h"
  12
  13#include "util/build-id.h"
  14#include "util/util.h"
  15#include <subcmd/parse-options.h>
  16#include "util/parse-events.h"
  17#include "util/config.h"
  18
  19#include "util/callchain.h"
  20#include "util/cgroup.h"
  21#include "util/header.h"
  22#include "util/event.h"
  23#include "util/evlist.h"
  24#include "util/evsel.h"
  25#include "util/debug.h"
  26#include "util/drv_configs.h"
  27#include "util/session.h"
  28#include "util/tool.h"
  29#include "util/symbol.h"
  30#include "util/cpumap.h"
  31#include "util/thread_map.h"
  32#include "util/data.h"
  33#include "util/perf_regs.h"
  34#include "util/auxtrace.h"
  35#include "util/tsc.h"
  36#include "util/parse-branch-options.h"
  37#include "util/parse-regs-options.h"
  38#include "util/llvm-utils.h"
  39#include "util/bpf-loader.h"
  40#include "util/trigger.h"
  41#include "util/perf-hooks.h"
  42#include "util/time-utils.h"
  43#include "util/units.h"
  44#include "asm/bug.h"
  45
  46#include <errno.h>
  47#include <inttypes.h>
  48#include <locale.h>
  49#include <poll.h>
  50#include <unistd.h>
  51#include <sched.h>
  52#include <signal.h>
  53#include <sys/mman.h>
  54#include <sys/wait.h>
  55#include <linux/time64.h>
  56
  57struct switch_output {
  58	bool		 enabled;
  59	bool		 signal;
  60	unsigned long	 size;
  61	unsigned long	 time;
  62	const char	*str;
  63	bool		 set;
  64};
  65
  66struct record {
  67	struct perf_tool	tool;
  68	struct record_opts	opts;
  69	u64			bytes_written;
  70	struct perf_data	data;
  71	struct auxtrace_record	*itr;
  72	struct perf_evlist	*evlist;
  73	struct perf_session	*session;
 
  74	int			realtime_prio;
  75	bool			no_buildid;
  76	bool			no_buildid_set;
  77	bool			no_buildid_cache;
  78	bool			no_buildid_cache_set;
  79	bool			buildid_all;
  80	bool			timestamp_filename;
  81	bool			timestamp_boundary;
  82	struct switch_output	switch_output;
  83	unsigned long long	samples;
  84};
  85
  86static volatile int auxtrace_record__snapshot_started;
  87static DEFINE_TRIGGER(auxtrace_snapshot_trigger);
  88static DEFINE_TRIGGER(switch_output_trigger);
  89
  90static bool switch_output_signal(struct record *rec)
  91{
  92	return rec->switch_output.signal &&
  93	       trigger_is_ready(&switch_output_trigger);
  94}
  95
  96static bool switch_output_size(struct record *rec)
  97{
  98	return rec->switch_output.size &&
  99	       trigger_is_ready(&switch_output_trigger) &&
 100	       (rec->bytes_written >= rec->switch_output.size);
 101}
 102
 103static bool switch_output_time(struct record *rec)
 104{
 105	return rec->switch_output.time &&
 106	       trigger_is_ready(&switch_output_trigger);
 107}
 108
 109static int record__write(struct record *rec, void *bf, size_t size)
 110{
 111	if (perf_data__write(rec->session->data, bf, size) < 0) {
 112		pr_err("failed to write perf data, error: %m\n");
 113		return -1;
 114	}
 115
 116	rec->bytes_written += size;
 117
 118	if (switch_output_size(rec))
 119		trigger_hit(&switch_output_trigger);
 120
 121	return 0;
 122}
 123
 124static int process_synthesized_event(struct perf_tool *tool,
 125				     union perf_event *event,
 126				     struct perf_sample *sample __maybe_unused,
 127				     struct machine *machine __maybe_unused)
 128{
 129	struct record *rec = container_of(tool, struct record, tool);
 130	return record__write(rec, event, event->header.size);
 131}
 132
 133static int record__pushfn(void *to, void *bf, size_t size)
 134{
 135	struct record *rec = to;
 
 
 
 
 
 
 
 
 
 136
 137	rec->samples++;
 138	return record__write(rec, bf, size);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 139}
 140
 141static volatile int done;
 142static volatile int signr = -1;
 143static volatile int child_finished;
 
 
 
 144
 145static void sig_handler(int sig)
 146{
 147	if (sig == SIGCHLD)
 148		child_finished = 1;
 149	else
 150		signr = sig;
 151
 152	done = 1;
 153}
 154
 155static void sigsegv_handler(int sig)
 156{
 157	perf_hooks__recover();
 158	sighandler_dump_stack(sig);
 159}
 160
 161static void record__sig_exit(void)
 162{
 163	if (signr == -1)
 164		return;
 165
 166	signal(signr, SIG_DFL);
 167	raise(signr);
 168}
 169
 170#ifdef HAVE_AUXTRACE_SUPPORT
 171
 172static int record__process_auxtrace(struct perf_tool *tool,
 173				    union perf_event *event, void *data1,
 174				    size_t len1, void *data2, size_t len2)
 175{
 176	struct record *rec = container_of(tool, struct record, tool);
 177	struct perf_data *data = &rec->data;
 178	size_t padding;
 179	u8 pad[8] = {0};
 180
 181	if (!perf_data__is_pipe(data)) {
 182		off_t file_offset;
 183		int fd = perf_data__fd(data);
 184		int err;
 185
 186		file_offset = lseek(fd, 0, SEEK_CUR);
 187		if (file_offset == -1)
 188			return -1;
 189		err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index,
 190						     event, file_offset);
 191		if (err)
 192			return err;
 193	}
 194
 195	/* event.auxtrace.size includes padding, see __auxtrace_mmap__read() */
 196	padding = (len1 + len2) & 7;
 197	if (padding)
 198		padding = 8 - padding;
 199
 200	record__write(rec, event, event->header.size);
 201	record__write(rec, data1, len1);
 202	if (len2)
 203		record__write(rec, data2, len2);
 204	record__write(rec, &pad, padding);
 205
 206	return 0;
 207}
 208
 209static int record__auxtrace_mmap_read(struct record *rec,
 210				      struct auxtrace_mmap *mm)
 211{
 212	int ret;
 213
 214	ret = auxtrace_mmap__read(mm, rec->itr, &rec->tool,
 215				  record__process_auxtrace);
 216	if (ret < 0)
 217		return ret;
 218
 219	if (ret)
 220		rec->samples++;
 221
 222	return 0;
 223}
 224
 225static int record__auxtrace_mmap_read_snapshot(struct record *rec,
 226					       struct auxtrace_mmap *mm)
 227{
 228	int ret;
 229
 230	ret = auxtrace_mmap__read_snapshot(mm, rec->itr, &rec->tool,
 231					   record__process_auxtrace,
 232					   rec->opts.auxtrace_snapshot_size);
 233	if (ret < 0)
 234		return ret;
 235
 236	if (ret)
 237		rec->samples++;
 238
 239	return 0;
 240}
 241
 242static int record__auxtrace_read_snapshot_all(struct record *rec)
 243{
 244	int i;
 245	int rc = 0;
 246
 247	for (i = 0; i < rec->evlist->nr_mmaps; i++) {
 248		struct auxtrace_mmap *mm =
 249				&rec->evlist->mmap[i].auxtrace_mmap;
 250
 251		if (!mm->base)
 252			continue;
 253
 254		if (record__auxtrace_mmap_read_snapshot(rec, mm) != 0) {
 255			rc = -1;
 256			goto out;
 257		}
 258	}
 259out:
 260	return rc;
 261}
 262
 263static void record__read_auxtrace_snapshot(struct record *rec)
 264{
 265	pr_debug("Recording AUX area tracing snapshot\n");
 266	if (record__auxtrace_read_snapshot_all(rec) < 0) {
 267		trigger_error(&auxtrace_snapshot_trigger);
 268	} else {
 269		if (auxtrace_record__snapshot_finish(rec->itr))
 270			trigger_error(&auxtrace_snapshot_trigger);
 271		else
 272			trigger_ready(&auxtrace_snapshot_trigger);
 273	}
 274}
 275
 276static int record__auxtrace_init(struct record *rec)
 277{
 278	int err;
 279
 280	if (!rec->itr) {
 281		rec->itr = auxtrace_record__init(rec->evlist, &err);
 282		if (err)
 283			return err;
 284	}
 285
 286	err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts,
 287					      rec->opts.auxtrace_snapshot_opts);
 288	if (err)
 289		return err;
 290
 291	return auxtrace_parse_filters(rec->evlist);
 292}
 293
 294#else
 295
 296static inline
 297int record__auxtrace_mmap_read(struct record *rec __maybe_unused,
 298			       struct auxtrace_mmap *mm __maybe_unused)
 299{
 300	return 0;
 301}
 302
 303static inline
 304void record__read_auxtrace_snapshot(struct record *rec __maybe_unused)
 305{
 306}
 307
 308static inline
 309int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused)
 310{
 311	return 0;
 312}
 313
 314static int record__auxtrace_init(struct record *rec __maybe_unused)
 315{
 316	return 0;
 317}
 318
 319#endif
 320
 321static int record__mmap_evlist(struct record *rec,
 322			       struct perf_evlist *evlist)
 323{
 324	struct record_opts *opts = &rec->opts;
 325	char msg[512];
 326
 327	if (perf_evlist__mmap_ex(evlist, opts->mmap_pages,
 328				 opts->auxtrace_mmap_pages,
 329				 opts->auxtrace_snapshot_mode) < 0) {
 330		if (errno == EPERM) {
 331			pr_err("Permission error mapping pages.\n"
 332			       "Consider increasing "
 333			       "/proc/sys/kernel/perf_event_mlock_kb,\n"
 334			       "or try again with a smaller value of -m/--mmap_pages.\n"
 335			       "(current value: %u,%u)\n",
 336			       opts->mmap_pages, opts->auxtrace_mmap_pages);
 337			return -errno;
 338		} else {
 339			pr_err("failed to mmap with %d (%s)\n", errno,
 340				str_error_r(errno, msg, sizeof(msg)));
 341			if (errno)
 342				return -errno;
 343			else
 344				return -EINVAL;
 345		}
 346	}
 347	return 0;
 348}
 349
 350static int record__mmap(struct record *rec)
 351{
 352	return record__mmap_evlist(rec, rec->evlist);
 353}
 354
 355static int record__open(struct record *rec)
 356{
 357	char msg[BUFSIZ];
 358	struct perf_evsel *pos;
 359	struct perf_evlist *evlist = rec->evlist;
 360	struct perf_session *session = rec->session;
 361	struct record_opts *opts = &rec->opts;
 362	struct perf_evsel_config_term *err_term;
 363	int rc = 0;
 364
 365	/*
 366	 * For initial_delay we need to add a dummy event so that we can track
 367	 * PERF_RECORD_MMAP while we wait for the initial delay to enable the
 368	 * real events, the ones asked by the user.
 369	 */
 370	if (opts->initial_delay) {
 371		if (perf_evlist__add_dummy(evlist))
 372			return -ENOMEM;
 373
 374		pos = perf_evlist__first(evlist);
 375		pos->tracking = 0;
 376		pos = perf_evlist__last(evlist);
 377		pos->tracking = 1;
 378		pos->attr.enable_on_exec = 1;
 379	}
 380
 381	perf_evlist__config(evlist, opts, &callchain_param);
 382
 383	evlist__for_each_entry(evlist, pos) {
 384try_again:
 385		if (perf_evsel__open(pos, pos->cpus, pos->threads) < 0) {
 386			if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
 387				if (verbose > 0)
 388					ui__warning("%s\n", msg);
 389				goto try_again;
 390			}
 391
 392			rc = -errno;
 393			perf_evsel__open_strerror(pos, &opts->target,
 394						  errno, msg, sizeof(msg));
 395			ui__error("%s\n", msg);
 396			goto out;
 397		}
 398
 399		pos->supported = true;
 400	}
 401
 402	if (perf_evlist__apply_filters(evlist, &pos)) {
 403		pr_err("failed to set filter \"%s\" on event %s with %d (%s)\n",
 404			pos->filter, perf_evsel__name(pos), errno,
 405			str_error_r(errno, msg, sizeof(msg)));
 406		rc = -1;
 407		goto out;
 408	}
 409
 410	if (perf_evlist__apply_drv_configs(evlist, &pos, &err_term)) {
 411		pr_err("failed to set config \"%s\" on event %s with %d (%s)\n",
 412		      err_term->val.drv_cfg, perf_evsel__name(pos), errno,
 413		      str_error_r(errno, msg, sizeof(msg)));
 414		rc = -1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 415		goto out;
 416	}
 417
 418	rc = record__mmap(rec);
 419	if (rc)
 420		goto out;
 421
 422	session->evlist = evlist;
 423	perf_session__set_id_hdr_size(session);
 424out:
 425	return rc;
 426}
 427
 428static int process_sample_event(struct perf_tool *tool,
 429				union perf_event *event,
 430				struct perf_sample *sample,
 431				struct perf_evsel *evsel,
 432				struct machine *machine)
 433{
 434	struct record *rec = container_of(tool, struct record, tool);
 435
 436	if (rec->evlist->first_sample_time == 0)
 437		rec->evlist->first_sample_time = sample->time;
 438
 439	rec->evlist->last_sample_time = sample->time;
 440
 441	if (rec->buildid_all)
 442		return 0;
 443
 444	rec->samples++;
 445	return build_id__mark_dso_hit(tool, event, sample, evsel, machine);
 446}
 447
 448static int process_buildids(struct record *rec)
 449{
 450	struct perf_data *data = &rec->data;
 451	struct perf_session *session = rec->session;
 452
 453	if (data->size == 0)
 454		return 0;
 455
 456	/*
 457	 * During this process, it'll load kernel map and replace the
 458	 * dso->long_name to a real pathname it found.  In this case
 459	 * we prefer the vmlinux path like
 460	 *   /lib/modules/3.16.4/build/vmlinux
 461	 *
 462	 * rather than build-id path (in debug directory).
 463	 *   $HOME/.debug/.build-id/f0/6e17aa50adf4d00b88925e03775de107611551
 464	 */
 465	symbol_conf.ignore_vmlinux_buildid = true;
 466
 467	/*
 468	 * If --buildid-all is given, it marks all DSO regardless of hits,
 469	 * so no need to process samples. But if timestamp_boundary is enabled,
 470	 * it still needs to walk on all samples to get the timestamps of
 471	 * first/last samples.
 472	 */
 473	if (rec->buildid_all && !rec->timestamp_boundary)
 474		rec->tool.sample = NULL;
 475
 476	return perf_session__process_events(session);
 477}
 478
 479static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
 480{
 481	int err;
 482	struct perf_tool *tool = data;
 483	/*
 484	 *As for guest kernel when processing subcommand record&report,
 485	 *we arrange module mmap prior to guest kernel mmap and trigger
 486	 *a preload dso because default guest module symbols are loaded
 487	 *from guest kallsyms instead of /lib/modules/XXX/XXX. This
 488	 *method is used to avoid symbol missing when the first addr is
 489	 *in module instead of in guest kernel.
 490	 */
 491	err = perf_event__synthesize_modules(tool, process_synthesized_event,
 492					     machine);
 493	if (err < 0)
 494		pr_err("Couldn't record guest kernel [%d]'s reference"
 495		       " relocation symbol.\n", machine->pid);
 496
 497	/*
 498	 * We use _stext for guest kernel because guest kernel's /proc/kallsyms
 499	 * have no _text sometimes.
 500	 */
 501	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
 502						 machine);
 503	if (err < 0)
 504		pr_err("Couldn't record guest kernel [%d]'s reference"
 505		       " relocation symbol.\n", machine->pid);
 506}
 507
 508static struct perf_event_header finished_round_event = {
 509	.size = sizeof(struct perf_event_header),
 510	.type = PERF_RECORD_FINISHED_ROUND,
 511};
 512
 513static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist,
 514				    bool overwrite)
 515{
 516	u64 bytes_written = rec->bytes_written;
 517	int i;
 518	int rc = 0;
 519	struct perf_mmap *maps;
 520
 521	if (!evlist)
 522		return 0;
 523
 524	maps = overwrite ? evlist->overwrite_mmap : evlist->mmap;
 525	if (!maps)
 526		return 0;
 527
 528	if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING)
 529		return 0;
 530
 531	for (i = 0; i < evlist->nr_mmaps; i++) {
 532		struct auxtrace_mmap *mm = &maps[i].auxtrace_mmap;
 533
 534		if (maps[i].base) {
 535			if (perf_mmap__push(&maps[i], rec, record__pushfn) != 0) {
 536				rc = -1;
 537				goto out;
 538			}
 539		}
 540
 541		if (mm->base && !rec->opts.auxtrace_snapshot_mode &&
 542		    record__auxtrace_mmap_read(rec, mm) != 0) {
 543			rc = -1;
 544			goto out;
 545		}
 546	}
 547
 548	/*
 549	 * Mark the round finished in case we wrote
 550	 * at least one event.
 551	 */
 552	if (bytes_written != rec->bytes_written)
 553		rc = record__write(rec, &finished_round_event, sizeof(finished_round_event));
 554
 555	if (overwrite)
 556		perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY);
 557out:
 558	return rc;
 559}
 560
 561static int record__mmap_read_all(struct record *rec)
 562{
 563	int err;
 564
 565	err = record__mmap_read_evlist(rec, rec->evlist, false);
 566	if (err)
 567		return err;
 568
 569	return record__mmap_read_evlist(rec, rec->evlist, true);
 570}
 571
 572static void record__init_features(struct record *rec)
 573{
 574	struct perf_session *session = rec->session;
 575	int feat;
 576
 577	for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
 578		perf_header__set_feat(&session->header, feat);
 579
 580	if (rec->no_buildid)
 581		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
 582
 583	if (!have_tracepoints(&rec->evlist->entries))
 584		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
 585
 586	if (!rec->opts.branch_stack)
 587		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
 588
 589	if (!rec->opts.full_auxtrace)
 590		perf_header__clear_feat(&session->header, HEADER_AUXTRACE);
 591
 592	perf_header__clear_feat(&session->header, HEADER_STAT);
 593}
 594
 595static void
 596record__finish_output(struct record *rec)
 597{
 598	struct perf_data *data = &rec->data;
 599	int fd = perf_data__fd(data);
 600
 601	if (data->is_pipe)
 602		return;
 603
 604	rec->session->header.data_size += rec->bytes_written;
 605	data->size = lseek(perf_data__fd(data), 0, SEEK_CUR);
 606
 607	if (!rec->no_buildid) {
 608		process_buildids(rec);
 609
 610		if (rec->buildid_all)
 611			dsos__hit_all(rec->session);
 612	}
 613	perf_session__write_header(rec->session, rec->evlist, fd, true);
 614
 615	return;
 616}
 617
 618static int record__synthesize_workload(struct record *rec, bool tail)
 619{
 620	int err;
 621	struct thread_map *thread_map;
 622
 623	if (rec->opts.tail_synthesize != tail)
 624		return 0;
 625
 626	thread_map = thread_map__new_by_tid(rec->evlist->workload.pid);
 627	if (thread_map == NULL)
 628		return -1;
 629
 630	err = perf_event__synthesize_thread_map(&rec->tool, thread_map,
 631						 process_synthesized_event,
 632						 &rec->session->machines.host,
 633						 rec->opts.sample_address,
 634						 rec->opts.proc_map_timeout);
 635	thread_map__put(thread_map);
 636	return err;
 637}
 638
 639static int record__synthesize(struct record *rec, bool tail);
 640
 641static int
 642record__switch_output(struct record *rec, bool at_exit)
 643{
 644	struct perf_data *data = &rec->data;
 645	int fd, err;
 646
 647	/* Same Size:      "2015122520103046"*/
 648	char timestamp[] = "InvalidTimestamp";
 649
 650	record__synthesize(rec, true);
 651	if (target__none(&rec->opts.target))
 652		record__synthesize_workload(rec, true);
 653
 654	rec->samples = 0;
 655	record__finish_output(rec);
 656	err = fetch_current_timestamp(timestamp, sizeof(timestamp));
 657	if (err) {
 658		pr_err("Failed to get current timestamp\n");
 659		return -EINVAL;
 660	}
 661
 662	fd = perf_data__switch(data, timestamp,
 663				    rec->session->header.data_offset,
 664				    at_exit);
 665	if (fd >= 0 && !at_exit) {
 666		rec->bytes_written = 0;
 667		rec->session->header.data_size = 0;
 668	}
 669
 670	if (!quiet)
 671		fprintf(stderr, "[ perf record: Dump %s.%s ]\n",
 672			data->file.path, timestamp);
 673
 674	/* Output tracking events */
 675	if (!at_exit) {
 676		record__synthesize(rec, false);
 677
 678		/*
 679		 * In 'perf record --switch-output' without -a,
 680		 * record__synthesize() in record__switch_output() won't
 681		 * generate tracking events because there's no thread_map
 682		 * in evlist. Which causes newly created perf.data doesn't
 683		 * contain map and comm information.
 684		 * Create a fake thread_map and directly call
 685		 * perf_event__synthesize_thread_map() for those events.
 686		 */
 687		if (target__none(&rec->opts.target))
 688			record__synthesize_workload(rec, false);
 689	}
 690	return fd;
 691}
 692
 693static volatile int workload_exec_errno;
 694
 695/*
 696 * perf_evlist__prepare_workload will send a SIGUSR1
 697 * if the fork fails, since we asked by setting its
 698 * want_signal to true.
 699 */
 700static void workload_exec_failed_signal(int signo __maybe_unused,
 701					siginfo_t *info,
 702					void *ucontext __maybe_unused)
 703{
 704	workload_exec_errno = info->si_value.sival_int;
 705	done = 1;
 706	child_finished = 1;
 707}
 708
 709static void snapshot_sig_handler(int sig);
 710static void alarm_sig_handler(int sig);
 711
 712int __weak
 713perf_event__synth_time_conv(const struct perf_event_mmap_page *pc __maybe_unused,
 714			    struct perf_tool *tool __maybe_unused,
 715			    perf_event__handler_t process __maybe_unused,
 716			    struct machine *machine __maybe_unused)
 717{
 718	return 0;
 719}
 720
 721static const struct perf_event_mmap_page *
 722perf_evlist__pick_pc(struct perf_evlist *evlist)
 723{
 724	if (evlist) {
 725		if (evlist->mmap && evlist->mmap[0].base)
 726			return evlist->mmap[0].base;
 727		if (evlist->overwrite_mmap && evlist->overwrite_mmap[0].base)
 728			return evlist->overwrite_mmap[0].base;
 729	}
 730	return NULL;
 731}
 732
 733static const struct perf_event_mmap_page *record__pick_pc(struct record *rec)
 734{
 735	const struct perf_event_mmap_page *pc;
 736
 737	pc = perf_evlist__pick_pc(rec->evlist);
 738	if (pc)
 739		return pc;
 740	return NULL;
 741}
 742
 743static int record__synthesize(struct record *rec, bool tail)
 744{
 745	struct perf_session *session = rec->session;
 746	struct machine *machine = &session->machines.host;
 747	struct perf_data *data = &rec->data;
 748	struct record_opts *opts = &rec->opts;
 749	struct perf_tool *tool = &rec->tool;
 750	int fd = perf_data__fd(data);
 751	int err = 0;
 752
 753	if (rec->opts.tail_synthesize != tail)
 754		return 0;
 755
 756	if (data->is_pipe) {
 757		/*
 758		 * We need to synthesize events first, because some
 759		 * features works on top of them (on report side).
 760		 */
 761		err = perf_event__synthesize_attrs(tool, session,
 762						   process_synthesized_event);
 763		if (err < 0) {
 764			pr_err("Couldn't synthesize attrs.\n");
 765			goto out;
 766		}
 767
 768		err = perf_event__synthesize_features(tool, session, rec->evlist,
 769						      process_synthesized_event);
 770		if (err < 0) {
 771			pr_err("Couldn't synthesize features.\n");
 772			return err;
 773		}
 774
 775		if (have_tracepoints(&rec->evlist->entries)) {
 776			/*
 777			 * FIXME err <= 0 here actually means that
 778			 * there were no tracepoints so its not really
 779			 * an error, just that we don't need to
 780			 * synthesize anything.  We really have to
 781			 * return this more properly and also
 782			 * propagate errors that now are calling die()
 783			 */
 784			err = perf_event__synthesize_tracing_data(tool,	fd, rec->evlist,
 785								  process_synthesized_event);
 786			if (err <= 0) {
 787				pr_err("Couldn't record tracing data.\n");
 788				goto out;
 789			}
 790			rec->bytes_written += err;
 791		}
 792	}
 793
 794	err = perf_event__synth_time_conv(record__pick_pc(rec), tool,
 795					  process_synthesized_event, machine);
 796	if (err)
 797		goto out;
 798
 799	if (rec->opts.full_auxtrace) {
 800		err = perf_event__synthesize_auxtrace_info(rec->itr, tool,
 801					session, process_synthesized_event);
 802		if (err)
 803			goto out;
 804	}
 805
 806	if (!perf_evlist__exclude_kernel(rec->evlist)) {
 807		err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
 808							 machine);
 809		WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n"
 810				   "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
 811				   "Check /proc/kallsyms permission or run as root.\n");
 812
 813		err = perf_event__synthesize_modules(tool, process_synthesized_event,
 814						     machine);
 815		WARN_ONCE(err < 0, "Couldn't record kernel module information.\n"
 816				   "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
 817				   "Check /proc/modules permission or run as root.\n");
 818	}
 819
 820	if (perf_guest) {
 821		machines__process_guests(&session->machines,
 822					 perf_event__synthesize_guest_os, tool);
 823	}
 824
 825	err = perf_event__synthesize_extra_attr(&rec->tool,
 826						rec->evlist,
 827						process_synthesized_event,
 828						data->is_pipe);
 829	if (err)
 830		goto out;
 831
 832	err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->threads,
 833						 process_synthesized_event,
 834						NULL);
 835	if (err < 0) {
 836		pr_err("Couldn't synthesize thread map.\n");
 837		return err;
 838	}
 839
 840	err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->cpus,
 841					     process_synthesized_event, NULL);
 842	if (err < 0) {
 843		pr_err("Couldn't synthesize cpu map.\n");
 844		return err;
 845	}
 846
 847	err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads,
 848					    process_synthesized_event, opts->sample_address,
 849					    opts->proc_map_timeout, 1);
 850out:
 851	return err;
 852}
 853
 854static int __cmd_record(struct record *rec, int argc, const char **argv)
 855{
 856	int err;
 857	int status = 0;
 858	unsigned long waking = 0;
 859	const bool forks = argc > 0;
 
 860	struct perf_tool *tool = &rec->tool;
 861	struct record_opts *opts = &rec->opts;
 862	struct perf_data *data = &rec->data;
 863	struct perf_session *session;
 864	bool disabled = false, draining = false;
 865	int fd;
 866
 
 
 867	atexit(record__sig_exit);
 868	signal(SIGCHLD, sig_handler);
 869	signal(SIGINT, sig_handler);
 870	signal(SIGTERM, sig_handler);
 871	signal(SIGSEGV, sigsegv_handler);
 872
 873	if (rec->opts.record_namespaces)
 874		tool->namespace_events = true;
 875
 876	if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) {
 877		signal(SIGUSR2, snapshot_sig_handler);
 878		if (rec->opts.auxtrace_snapshot_mode)
 879			trigger_on(&auxtrace_snapshot_trigger);
 880		if (rec->switch_output.enabled)
 881			trigger_on(&switch_output_trigger);
 882	} else {
 883		signal(SIGUSR2, SIG_IGN);
 884	}
 885
 886	session = perf_session__new(data, false, tool);
 887	if (session == NULL) {
 888		pr_err("Perf session creation failed.\n");
 889		return -1;
 890	}
 891
 892	fd = perf_data__fd(data);
 893	rec->session = session;
 894
 895	record__init_features(rec);
 896
 897	if (forks) {
 898		err = perf_evlist__prepare_workload(rec->evlist, &opts->target,
 899						    argv, data->is_pipe,
 900						    workload_exec_failed_signal);
 901		if (err < 0) {
 902			pr_err("Couldn't run the workload!\n");
 903			status = err;
 904			goto out_delete_session;
 905		}
 906	}
 907
 908	/*
 909	 * If we have just single event and are sending data
 910	 * through pipe, we need to force the ids allocation,
 911	 * because we synthesize event name through the pipe
 912	 * and need the id for that.
 913	 */
 914	if (data->is_pipe && rec->evlist->nr_entries == 1)
 915		rec->opts.sample_id = true;
 916
 917	if (record__open(rec) != 0) {
 918		err = -1;
 919		goto out_child;
 920	}
 921
 922	err = bpf__apply_obj_config();
 923	if (err) {
 924		char errbuf[BUFSIZ];
 925
 926		bpf__strerror_apply_obj_config(err, errbuf, sizeof(errbuf));
 927		pr_err("ERROR: Apply config to BPF failed: %s\n",
 928			 errbuf);
 929		goto out_child;
 930	}
 931
 932	/*
 933	 * Normally perf_session__new would do this, but it doesn't have the
 934	 * evlist.
 935	 */
 936	if (rec->tool.ordered_events && !perf_evlist__sample_id_all(rec->evlist)) {
 937		pr_warning("WARNING: No sample_id_all support, falling back to unordered processing\n");
 938		rec->tool.ordered_events = false;
 939	}
 940
 941	if (!rec->evlist->nr_groups)
 942		perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);
 943
 944	if (data->is_pipe) {
 945		err = perf_header__write_pipe(fd);
 946		if (err < 0)
 947			goto out_child;
 948	} else {
 949		err = perf_session__write_header(session, rec->evlist, fd, false);
 950		if (err < 0)
 951			goto out_child;
 952	}
 953
 954	if (!rec->no_buildid
 955	    && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
 956		pr_err("Couldn't generate buildids. "
 957		       "Use --no-buildid to profile anyway.\n");
 958		err = -1;
 959		goto out_child;
 960	}
 961
 962	err = record__synthesize(rec, false);
 
 
 963	if (err < 0)
 964		goto out_child;
 965
 966	if (rec->realtime_prio) {
 967		struct sched_param param;
 968
 969		param.sched_priority = rec->realtime_prio;
 970		if (sched_setscheduler(0, SCHED_FIFO, &param)) {
 971			pr_err("Could not set realtime priority.\n");
 972			err = -1;
 973			goto out_child;
 974		}
 975	}
 976
 977	/*
 978	 * When perf is starting the traced process, all the events
 979	 * (apart from group members) have enable_on_exec=1 set,
 980	 * so don't spoil it by prematurely enabling them.
 981	 */
 982	if (!target__none(&opts->target) && !opts->initial_delay)
 983		perf_evlist__enable(rec->evlist);
 984
 985	/*
 986	 * Let the child rip
 987	 */
 988	if (forks) {
 989		struct machine *machine = &session->machines.host;
 990		union perf_event *event;
 991		pid_t tgid;
 992
 993		event = malloc(sizeof(event->comm) + machine->id_hdr_size);
 994		if (event == NULL) {
 995			err = -ENOMEM;
 996			goto out_child;
 997		}
 998
 999		/*
1000		 * Some H/W events are generated before COMM event
1001		 * which is emitted during exec(), so perf script
1002		 * cannot see a correct process name for those events.
1003		 * Synthesize COMM event to prevent it.
1004		 */
1005		tgid = perf_event__synthesize_comm(tool, event,
1006						   rec->evlist->workload.pid,
1007						   process_synthesized_event,
1008						   machine);
1009		free(event);
1010
1011		if (tgid == -1)
1012			goto out_child;
1013
1014		event = malloc(sizeof(event->namespaces) +
1015			       (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) +
1016			       machine->id_hdr_size);
1017		if (event == NULL) {
1018			err = -ENOMEM;
1019			goto out_child;
1020		}
1021
1022		/*
1023		 * Synthesize NAMESPACES event for the command specified.
1024		 */
1025		perf_event__synthesize_namespaces(tool, event,
1026						  rec->evlist->workload.pid,
1027						  tgid, process_synthesized_event,
1028						  machine);
1029		free(event);
1030
1031		perf_evlist__start_workload(rec->evlist);
1032	}
1033
1034	if (opts->initial_delay) {
1035		usleep(opts->initial_delay * USEC_PER_MSEC);
1036		perf_evlist__enable(rec->evlist);
1037	}
1038
1039	trigger_ready(&auxtrace_snapshot_trigger);
1040	trigger_ready(&switch_output_trigger);
1041	perf_hooks__invoke_record_start();
1042	for (;;) {
1043		unsigned long long hits = rec->samples;
1044
1045		/*
1046		 * rec->evlist->bkw_mmap_state is possible to be
1047		 * BKW_MMAP_EMPTY here: when done == true and
1048		 * hits != rec->samples in previous round.
1049		 *
1050		 * perf_evlist__toggle_bkw_mmap ensure we never
1051		 * convert BKW_MMAP_EMPTY to BKW_MMAP_DATA_PENDING.
1052		 */
1053		if (trigger_is_hit(&switch_output_trigger) || done || draining)
1054			perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING);
1055
1056		if (record__mmap_read_all(rec) < 0) {
1057			trigger_error(&auxtrace_snapshot_trigger);
1058			trigger_error(&switch_output_trigger);
1059			err = -1;
1060			goto out_child;
1061		}
1062
1063		if (auxtrace_record__snapshot_started) {
1064			auxtrace_record__snapshot_started = 0;
1065			if (!trigger_is_error(&auxtrace_snapshot_trigger))
1066				record__read_auxtrace_snapshot(rec);
1067			if (trigger_is_error(&auxtrace_snapshot_trigger)) {
1068				pr_err("AUX area tracing snapshot failed\n");
1069				err = -1;
1070				goto out_child;
1071			}
1072		}
1073
1074		if (trigger_is_hit(&switch_output_trigger)) {
1075			/*
1076			 * If switch_output_trigger is hit, the data in
1077			 * overwritable ring buffer should have been collected,
1078			 * so bkw_mmap_state should be set to BKW_MMAP_EMPTY.
1079			 *
1080			 * If SIGUSR2 raise after or during record__mmap_read_all(),
1081			 * record__mmap_read_all() didn't collect data from
1082			 * overwritable ring buffer. Read again.
1083			 */
1084			if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING)
1085				continue;
1086			trigger_ready(&switch_output_trigger);
1087
1088			/*
1089			 * Reenable events in overwrite ring buffer after
1090			 * record__mmap_read_all(): we should have collected
1091			 * data from it.
1092			 */
1093			perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING);
1094
1095			if (!quiet)
1096				fprintf(stderr, "[ perf record: dump data: Woken up %ld times ]\n",
1097					waking);
1098			waking = 0;
1099			fd = record__switch_output(rec, false);
1100			if (fd < 0) {
1101				pr_err("Failed to switch to new file\n");
1102				trigger_error(&switch_output_trigger);
1103				err = fd;
1104				goto out_child;
1105			}
1106
1107			/* re-arm the alarm */
1108			if (rec->switch_output.time)
1109				alarm(rec->switch_output.time);
1110		}
1111
1112		if (hits == rec->samples) {
1113			if (done || draining)
1114				break;
1115			err = perf_evlist__poll(rec->evlist, -1);
1116			/*
1117			 * Propagate error, only if there's any. Ignore positive
1118			 * number of returned events and interrupt error.
1119			 */
1120			if (err > 0 || (err < 0 && errno == EINTR))
1121				err = 0;
1122			waking++;
1123
1124			if (perf_evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0)
1125				draining = true;
1126		}
1127
1128		/*
1129		 * When perf is starting the traced process, at the end events
1130		 * die with the process and we wait for that. Thus no need to
1131		 * disable events in this case.
1132		 */
1133		if (done && !disabled && !target__none(&opts->target)) {
1134			trigger_off(&auxtrace_snapshot_trigger);
1135			perf_evlist__disable(rec->evlist);
1136			disabled = true;
1137		}
1138	}
1139	trigger_off(&auxtrace_snapshot_trigger);
1140	trigger_off(&switch_output_trigger);
1141
1142	if (forks && workload_exec_errno) {
1143		char msg[STRERR_BUFSIZE];
1144		const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg));
1145		pr_err("Workload failed: %s\n", emsg);
1146		err = -1;
1147		goto out_child;
1148	}
1149
1150	if (!quiet)
1151		fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
1152
1153	if (target__none(&rec->opts.target))
1154		record__synthesize_workload(rec, true);
1155
1156out_child:
1157	if (forks) {
1158		int exit_status;
1159
1160		if (!child_finished)
1161			kill(rec->evlist->workload.pid, SIGTERM);
1162
1163		wait(&exit_status);
1164
1165		if (err < 0)
1166			status = err;
1167		else if (WIFEXITED(exit_status))
1168			status = WEXITSTATUS(exit_status);
1169		else if (WIFSIGNALED(exit_status))
1170			signr = WTERMSIG(exit_status);
1171	} else
1172		status = err;
1173
1174	record__synthesize(rec, true);
1175	/* this will be recalculated during process_buildids() */
1176	rec->samples = 0;
1177
1178	if (!err) {
1179		if (!rec->timestamp_filename) {
1180			record__finish_output(rec);
1181		} else {
1182			fd = record__switch_output(rec, true);
1183			if (fd < 0) {
1184				status = fd;
1185				goto out_delete_session;
1186			}
1187		}
1188	}
1189
1190	perf_hooks__invoke_record_end();
1191
1192	if (!err && !quiet) {
1193		char samples[128];
1194		const char *postfix = rec->timestamp_filename ?
1195					".<timestamp>" : "";
1196
1197		if (rec->samples && !rec->opts.full_auxtrace)
1198			scnprintf(samples, sizeof(samples),
1199				  " (%" PRIu64 " samples)", rec->samples);
1200		else
1201			samples[0] = '\0';
1202
1203		fprintf(stderr,	"[ perf record: Captured and wrote %.3f MB %s%s%s ]\n",
1204			perf_data__size(data) / 1024.0 / 1024.0,
1205			data->file.path, postfix, samples);
1206	}
1207
1208out_delete_session:
1209	perf_session__delete(session);
1210	return status;
1211}
1212
1213static void callchain_debug(struct callchain_param *callchain)
1214{
1215	static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" };
1216
1217	pr_debug("callchain: type %s\n", str[callchain->record_mode]);
1218
1219	if (callchain->record_mode == CALLCHAIN_DWARF)
1220		pr_debug("callchain: stack dump size %d\n",
1221			 callchain->dump_size);
1222}
1223
1224int record_opts__parse_callchain(struct record_opts *record,
1225				 struct callchain_param *callchain,
1226				 const char *arg, bool unset)
1227{
1228	int ret;
1229	callchain->enabled = !unset;
 
 
 
1230
1231	/* --no-call-graph */
1232	if (unset) {
1233		callchain->record_mode = CALLCHAIN_NONE;
1234		pr_debug("callchain: disabled\n");
1235		return 0;
1236	}
1237
1238	ret = parse_callchain_record_opt(arg, callchain);
1239	if (!ret) {
1240		/* Enable data address sampling for DWARF unwind. */
1241		if (callchain->record_mode == CALLCHAIN_DWARF)
1242			record->sample_address = true;
1243		callchain_debug(callchain);
1244	}
1245
1246	return ret;
1247}
1248
1249int record_parse_callchain_opt(const struct option *opt,
1250			       const char *arg,
1251			       int unset)
1252{
1253	return record_opts__parse_callchain(opt->value, &callchain_param, arg, unset);
1254}
1255
1256int record_callchain_opt(const struct option *opt,
1257			 const char *arg __maybe_unused,
1258			 int unset __maybe_unused)
1259{
1260	struct callchain_param *callchain = opt->value;
1261
1262	callchain->enabled = true;
 
1263
1264	if (callchain->record_mode == CALLCHAIN_NONE)
1265		callchain->record_mode = CALLCHAIN_FP;
1266
1267	callchain_debug(callchain);
1268	return 0;
1269}
1270
1271static int perf_record_config(const char *var, const char *value, void *cb)
1272{
1273	struct record *rec = cb;
1274
1275	if (!strcmp(var, "record.build-id")) {
1276		if (!strcmp(value, "cache"))
1277			rec->no_buildid_cache = false;
1278		else if (!strcmp(value, "no-cache"))
1279			rec->no_buildid_cache = true;
1280		else if (!strcmp(value, "skip"))
1281			rec->no_buildid = true;
1282		else
1283			return -1;
1284		return 0;
1285	}
1286	if (!strcmp(var, "record.call-graph")) {
1287		var = "call-graph.record-mode";
1288		return perf_default_config(var, value, cb);
1289	}
1290
1291	return 0;
1292}
1293
1294struct clockid_map {
1295	const char *name;
1296	int clockid;
1297};
1298
1299#define CLOCKID_MAP(n, c)	\
1300	{ .name = n, .clockid = (c), }
1301
1302#define CLOCKID_END	{ .name = NULL, }
1303
1304
1305/*
1306 * Add the missing ones, we need to build on many distros...
1307 */
1308#ifndef CLOCK_MONOTONIC_RAW
1309#define CLOCK_MONOTONIC_RAW 4
1310#endif
1311#ifndef CLOCK_BOOTTIME
1312#define CLOCK_BOOTTIME 7
1313#endif
1314#ifndef CLOCK_TAI
1315#define CLOCK_TAI 11
1316#endif
1317
1318static const struct clockid_map clockids[] = {
1319	/* available for all events, NMI safe */
1320	CLOCKID_MAP("monotonic", CLOCK_MONOTONIC),
1321	CLOCKID_MAP("monotonic_raw", CLOCK_MONOTONIC_RAW),
1322
1323	/* available for some events */
1324	CLOCKID_MAP("realtime", CLOCK_REALTIME),
1325	CLOCKID_MAP("boottime", CLOCK_BOOTTIME),
1326	CLOCKID_MAP("tai", CLOCK_TAI),
1327
1328	/* available for the lazy */
1329	CLOCKID_MAP("mono", CLOCK_MONOTONIC),
1330	CLOCKID_MAP("raw", CLOCK_MONOTONIC_RAW),
1331	CLOCKID_MAP("real", CLOCK_REALTIME),
1332	CLOCKID_MAP("boot", CLOCK_BOOTTIME),
1333
1334	CLOCKID_END,
1335};
1336
1337static int parse_clockid(const struct option *opt, const char *str, int unset)
1338{
1339	struct record_opts *opts = (struct record_opts *)opt->value;
1340	const struct clockid_map *cm;
1341	const char *ostr = str;
1342
1343	if (unset) {
1344		opts->use_clockid = 0;
1345		return 0;
1346	}
1347
1348	/* no arg passed */
1349	if (!str)
1350		return 0;
1351
1352	/* no setting it twice */
1353	if (opts->use_clockid)
1354		return -1;
1355
1356	opts->use_clockid = true;
1357
1358	/* if its a number, we're done */
1359	if (sscanf(str, "%d", &opts->clockid) == 1)
1360		return 0;
1361
1362	/* allow a "CLOCK_" prefix to the name */
1363	if (!strncasecmp(str, "CLOCK_", 6))
1364		str += 6;
1365
1366	for (cm = clockids; cm->name; cm++) {
1367		if (!strcasecmp(str, cm->name)) {
1368			opts->clockid = cm->clockid;
1369			return 0;
1370		}
1371	}
1372
1373	opts->use_clockid = false;
1374	ui__warning("unknown clockid %s, check man page\n", ostr);
1375	return -1;
1376}
1377
1378static int record__parse_mmap_pages(const struct option *opt,
1379				    const char *str,
1380				    int unset __maybe_unused)
1381{
1382	struct record_opts *opts = opt->value;
1383	char *s, *p;
1384	unsigned int mmap_pages;
1385	int ret;
1386
1387	if (!str)
1388		return -EINVAL;
1389
1390	s = strdup(str);
1391	if (!s)
1392		return -ENOMEM;
1393
1394	p = strchr(s, ',');
1395	if (p)
1396		*p = '\0';
1397
1398	if (*s) {
1399		ret = __perf_evlist__parse_mmap_pages(&mmap_pages, s);
1400		if (ret)
1401			goto out_free;
1402		opts->mmap_pages = mmap_pages;
1403	}
1404
1405	if (!p) {
1406		ret = 0;
1407		goto out_free;
1408	}
1409
1410	ret = __perf_evlist__parse_mmap_pages(&mmap_pages, p + 1);
1411	if (ret)
1412		goto out_free;
1413
1414	opts->auxtrace_mmap_pages = mmap_pages;
1415
1416out_free:
1417	free(s);
1418	return ret;
1419}
1420
1421static void switch_output_size_warn(struct record *rec)
1422{
1423	u64 wakeup_size = perf_evlist__mmap_size(rec->opts.mmap_pages);
1424	struct switch_output *s = &rec->switch_output;
1425
1426	wakeup_size /= 2;
1427
1428	if (s->size < wakeup_size) {
1429		char buf[100];
1430
1431		unit_number__scnprintf(buf, sizeof(buf), wakeup_size);
1432		pr_warning("WARNING: switch-output data size lower than "
1433			   "wakeup kernel buffer size (%s) "
1434			   "expect bigger perf.data sizes\n", buf);
1435	}
1436}
1437
1438static int switch_output_setup(struct record *rec)
1439{
1440	struct switch_output *s = &rec->switch_output;
1441	static struct parse_tag tags_size[] = {
1442		{ .tag  = 'B', .mult = 1       },
1443		{ .tag  = 'K', .mult = 1 << 10 },
1444		{ .tag  = 'M', .mult = 1 << 20 },
1445		{ .tag  = 'G', .mult = 1 << 30 },
1446		{ .tag  = 0 },
1447	};
1448	static struct parse_tag tags_time[] = {
1449		{ .tag  = 's', .mult = 1        },
1450		{ .tag  = 'm', .mult = 60       },
1451		{ .tag  = 'h', .mult = 60*60    },
1452		{ .tag  = 'd', .mult = 60*60*24 },
1453		{ .tag  = 0 },
1454	};
1455	unsigned long val;
1456
1457	if (!s->set)
1458		return 0;
1459
1460	if (!strcmp(s->str, "signal")) {
1461		s->signal = true;
1462		pr_debug("switch-output with SIGUSR2 signal\n");
1463		goto enabled;
1464	}
1465
1466	val = parse_tag_value(s->str, tags_size);
1467	if (val != (unsigned long) -1) {
1468		s->size = val;
1469		pr_debug("switch-output with %s size threshold\n", s->str);
1470		goto enabled;
1471	}
1472
1473	val = parse_tag_value(s->str, tags_time);
1474	if (val != (unsigned long) -1) {
1475		s->time = val;
1476		pr_debug("switch-output with %s time threshold (%lu seconds)\n",
1477			 s->str, s->time);
1478		goto enabled;
1479	}
1480
1481	return -1;
1482
1483enabled:
1484	rec->timestamp_filename = true;
1485	s->enabled              = true;
1486
1487	if (s->size && !rec->opts.no_buffering)
1488		switch_output_size_warn(rec);
1489
1490	return 0;
1491}
1492
1493static const char * const __record_usage[] = {
1494	"perf record [<options>] [<command>]",
1495	"perf record [<options>] -- <command> [<options>]",
1496	NULL
1497};
1498const char * const *record_usage = __record_usage;
1499
1500/*
1501 * XXX Ideally would be local to cmd_record() and passed to a record__new
1502 * because we need to have access to it in record__exit, that is called
1503 * after cmd_record() exits, but since record_options need to be accessible to
1504 * builtin-script, leave it here.
1505 *
1506 * At least we don't ouch it in all the other functions here directly.
1507 *
1508 * Just say no to tons of global variables, sigh.
1509 */
1510static struct record record = {
1511	.opts = {
1512		.sample_time	     = true,
1513		.mmap_pages	     = UINT_MAX,
1514		.user_freq	     = UINT_MAX,
1515		.user_interval	     = ULLONG_MAX,
1516		.freq		     = 4000,
1517		.target		     = {
1518			.uses_mmap   = true,
1519			.default_per_cpu = true,
1520		},
1521		.proc_map_timeout     = 500,
1522	},
1523	.tool = {
1524		.sample		= process_sample_event,
1525		.fork		= perf_event__process_fork,
1526		.exit		= perf_event__process_exit,
1527		.comm		= perf_event__process_comm,
1528		.namespaces	= perf_event__process_namespaces,
1529		.mmap		= perf_event__process_mmap,
1530		.mmap2		= perf_event__process_mmap2,
1531		.ordered_events	= true,
1532	},
1533};
1534
1535const char record_callchain_help[] = CALLCHAIN_RECORD_HELP
1536	"\n\t\t\t\tDefault: fp";
1537
1538static bool dry_run;
1539
1540/*
1541 * XXX Will stay a global variable till we fix builtin-script.c to stop messing
1542 * with it and switch to use the library functions in perf_evlist that came
1543 * from builtin-record.c, i.e. use record_opts,
1544 * perf_evlist__prepare_workload, etc instead of fork+exec'in 'perf record',
1545 * using pipes, etc.
1546 */
1547static struct option __record_options[] = {
1548	OPT_CALLBACK('e', "event", &record.evlist, "event",
1549		     "event selector. use 'perf list' to list available events",
1550		     parse_events_option),
1551	OPT_CALLBACK(0, "filter", &record.evlist, "filter",
1552		     "event filter", parse_filter),
1553	OPT_CALLBACK_NOOPT(0, "exclude-perf", &record.evlist,
1554			   NULL, "don't record events from perf itself",
1555			   exclude_perf),
1556	OPT_STRING('p', "pid", &record.opts.target.pid, "pid",
1557		    "record events on existing process id"),
1558	OPT_STRING('t', "tid", &record.opts.target.tid, "tid",
1559		    "record events on existing thread id"),
1560	OPT_INTEGER('r', "realtime", &record.realtime_prio,
1561		    "collect data with this RT SCHED_FIFO priority"),
1562	OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering,
1563		    "collect data without buffering"),
1564	OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples,
1565		    "collect raw sample records from all opened counters"),
1566	OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide,
1567			    "system-wide collection from all CPUs"),
1568	OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
1569		    "list of cpus to monitor"),
1570	OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
1571	OPT_STRING('o', "output", &record.data.file.path, "file",
1572		    "output file name"),
1573	OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
1574			&record.opts.no_inherit_set,
1575			"child tasks do not inherit counters"),
1576	OPT_BOOLEAN(0, "tail-synthesize", &record.opts.tail_synthesize,
1577		    "synthesize non-sample events at the end of output"),
1578	OPT_BOOLEAN(0, "overwrite", &record.opts.overwrite, "use overwrite mode"),
1579	OPT_BOOLEAN(0, "strict-freq", &record.opts.strict_freq,
1580		    "Fail if the specified frequency can't be used"),
1581	OPT_CALLBACK('F', "freq", &record.opts, "freq or 'max'",
1582		     "profile at this frequency",
1583		      record__parse_freq),
1584	OPT_CALLBACK('m', "mmap-pages", &record.opts, "pages[,pages]",
1585		     "number of mmap data pages and AUX area tracing mmap pages",
1586		     record__parse_mmap_pages),
1587	OPT_BOOLEAN(0, "group", &record.opts.group,
1588		    "put the counters into a counter group"),
1589	OPT_CALLBACK_NOOPT('g', NULL, &callchain_param,
1590			   NULL, "enables call-graph recording" ,
1591			   &record_callchain_opt),
1592	OPT_CALLBACK(0, "call-graph", &record.opts,
1593		     "record_mode[,record_size]", record_callchain_help,
1594		     &record_parse_callchain_opt),
1595	OPT_INCR('v', "verbose", &verbose,
1596		    "be more verbose (show counter open errors, etc)"),
1597	OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
1598	OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
1599		    "per thread counts"),
1600	OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"),
1601	OPT_BOOLEAN(0, "phys-data", &record.opts.sample_phys_addr,
1602		    "Record the sample physical addresses"),
1603	OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"),
1604	OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time,
1605			&record.opts.sample_time_set,
1606			"Record the sample timestamps"),
1607	OPT_BOOLEAN_SET('P', "period", &record.opts.period, &record.opts.period_set,
1608			"Record the sample period"),
1609	OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
1610		    "don't sample"),
1611	OPT_BOOLEAN_SET('N', "no-buildid-cache", &record.no_buildid_cache,
1612			&record.no_buildid_cache_set,
1613			"do not update the buildid cache"),
1614	OPT_BOOLEAN_SET('B', "no-buildid", &record.no_buildid,
1615			&record.no_buildid_set,
1616			"do not collect buildids in perf.data"),
1617	OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
1618		     "monitor event in cgroup name only",
1619		     parse_cgroups),
1620	OPT_UINTEGER('D', "delay", &record.opts.initial_delay,
1621		  "ms to wait before starting measurement after program start"),
1622	OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
1623		   "user to profile"),
1624
1625	OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack,
1626		     "branch any", "sample any taken branches",
1627		     parse_branch_stack),
1628
1629	OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack,
1630		     "branch filter mask", "branch stack filter modes",
1631		     parse_branch_stack),
1632	OPT_BOOLEAN('W', "weight", &record.opts.sample_weight,
1633		    "sample by weight (on special events only)"),
1634	OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction,
1635		    "sample transaction flags (special events only)"),
1636	OPT_BOOLEAN(0, "per-thread", &record.opts.target.per_thread,
1637		    "use per-thread mmaps"),
1638	OPT_CALLBACK_OPTARG('I', "intr-regs", &record.opts.sample_intr_regs, NULL, "any register",
1639		    "sample selected machine registers on interrupt,"
1640		    " use -I ? to list register names", parse_regs),
1641	OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register",
1642		    "sample selected machine registers on interrupt,"
1643		    " use -I ? to list register names", parse_regs),
1644	OPT_BOOLEAN(0, "running-time", &record.opts.running_time,
1645		    "Record running/enabled time of read (:S) events"),
1646	OPT_CALLBACK('k', "clockid", &record.opts,
1647	"clockid", "clockid to use for events, see clock_gettime()",
1648	parse_clockid),
1649	OPT_STRING_OPTARG('S', "snapshot", &record.opts.auxtrace_snapshot_opts,
1650			  "opts", "AUX area tracing Snapshot Mode", ""),
1651	OPT_UINTEGER(0, "proc-map-timeout", &record.opts.proc_map_timeout,
1652			"per thread proc mmap processing timeout in ms"),
1653	OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces,
1654		    "Record namespaces events"),
1655	OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events,
1656		    "Record context switch events"),
1657	OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
1658			 "Configure all used events to run in kernel space.",
1659			 PARSE_OPT_EXCLUSIVE),
1660	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
1661			 "Configure all used events to run in user space.",
1662			 PARSE_OPT_EXCLUSIVE),
1663	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
1664		   "clang binary to use for compiling BPF scriptlets"),
1665	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
1666		   "options passed to clang when compiling BPF scriptlets"),
1667	OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name,
1668		   "file", "vmlinux pathname"),
1669	OPT_BOOLEAN(0, "buildid-all", &record.buildid_all,
1670		    "Record build-id of all DSOs regardless of hits"),
1671	OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename,
1672		    "append timestamp to output filename"),
1673	OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary,
1674		    "Record timestamp boundary (time of first/last samples)"),
1675	OPT_STRING_OPTARG_SET(0, "switch-output", &record.switch_output.str,
1676			  &record.switch_output.set, "signal,size,time",
1677			  "Switch output when receive SIGUSR2 or cross size,time threshold",
1678			  "signal"),
1679	OPT_BOOLEAN(0, "dry-run", &dry_run,
1680		    "Parse options then exit"),
1681	OPT_END()
1682};
1683
1684struct option *record_options = __record_options;
1685
1686int cmd_record(int argc, const char **argv)
1687{
1688	int err;
1689	struct record *rec = &record;
1690	char errbuf[BUFSIZ];
1691
1692	setlocale(LC_ALL, "");
1693
1694#ifndef HAVE_LIBBPF_SUPPORT
1695# define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, "NO_LIBBPF=1", c)
1696	set_nobuild('\0', "clang-path", true);
1697	set_nobuild('\0', "clang-opt", true);
1698# undef set_nobuild
1699#endif
1700
1701#ifndef HAVE_BPF_PROLOGUE
1702# if !defined (HAVE_DWARF_SUPPORT)
1703#  define REASON  "NO_DWARF=1"
1704# elif !defined (HAVE_LIBBPF_SUPPORT)
1705#  define REASON  "NO_LIBBPF=1"
1706# else
1707#  define REASON  "this architecture doesn't support BPF prologue"
1708# endif
1709# define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, REASON, c)
1710	set_nobuild('\0', "vmlinux", true);
1711# undef set_nobuild
1712# undef REASON
1713#endif
1714
1715	rec->evlist = perf_evlist__new();
1716	if (rec->evlist == NULL)
1717		return -ENOMEM;
1718
1719	err = perf_config(perf_record_config, rec);
1720	if (err)
1721		return err;
1722
1723	argc = parse_options(argc, argv, record_options, record_usage,
1724			    PARSE_OPT_STOP_AT_NON_OPTION);
1725	if (quiet)
1726		perf_quiet_option();
1727
1728	/* Make system wide (-a) the default target. */
1729	if (!argc && target__none(&rec->opts.target))
1730		rec->opts.target.system_wide = true;
1731
1732	if (nr_cgroups && !rec->opts.target.system_wide) {
1733		usage_with_options_msg(record_usage, record_options,
1734			"cgroup monitoring only available in system-wide mode");
1735
1736	}
1737	if (rec->opts.record_switch_events &&
1738	    !perf_can_record_switch_events()) {
1739		ui__error("kernel does not support recording context switch events\n");
1740		parse_options_usage(record_usage, record_options, "switch-events", 0);
1741		return -EINVAL;
1742	}
1743
1744	if (switch_output_setup(rec)) {
1745		parse_options_usage(record_usage, record_options, "switch-output", 0);
1746		return -EINVAL;
 
1747	}
1748
1749	if (rec->switch_output.time) {
1750		signal(SIGALRM, alarm_sig_handler);
1751		alarm(rec->switch_output.time);
1752	}
1753
1754	/*
1755	 * Allow aliases to facilitate the lookup of symbols for address
1756	 * filters. Refer to auxtrace_parse_filters().
1757	 */
1758	symbol_conf.allow_aliases = true;
1759
1760	symbol__init(NULL);
1761
1762	err = record__auxtrace_init(rec);
1763	if (err)
1764		goto out;
1765
1766	if (dry_run)
1767		goto out;
1768
1769	err = bpf__setup_stdout(rec->evlist);
1770	if (err) {
1771		bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf));
1772		pr_err("ERROR: Setup BPF stdout failed: %s\n",
1773			 errbuf);
1774		goto out;
1775	}
1776
1777	err = -ENOMEM;
1778
1779	if (symbol_conf.kptr_restrict && !perf_evlist__exclude_kernel(rec->evlist))
1780		pr_warning(
1781"WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
1782"check /proc/sys/kernel/kptr_restrict.\n\n"
1783"Samples in kernel functions may not be resolved if a suitable vmlinux\n"
1784"file is not found in the buildid cache or in the vmlinux path.\n\n"
1785"Samples in kernel modules won't be resolved at all.\n\n"
1786"If some relocation was applied (e.g. kexec) symbols may be misresolved\n"
1787"even with a suitable vmlinux or kallsyms file.\n\n");
1788
1789	if (rec->no_buildid_cache || rec->no_buildid) {
1790		disable_buildid_cache();
1791	} else if (rec->switch_output.enabled) {
1792		/*
1793		 * In 'perf record --switch-output', disable buildid
1794		 * generation by default to reduce data file switching
1795		 * overhead. Still generate buildid if they are required
1796		 * explicitly using
1797		 *
1798		 *  perf record --switch-output --no-no-buildid \
1799		 *              --no-no-buildid-cache
1800		 *
1801		 * Following code equals to:
1802		 *
1803		 * if ((rec->no_buildid || !rec->no_buildid_set) &&
1804		 *     (rec->no_buildid_cache || !rec->no_buildid_cache_set))
1805		 *         disable_buildid_cache();
1806		 */
1807		bool disable = true;
1808
1809		if (rec->no_buildid_set && !rec->no_buildid)
1810			disable = false;
1811		if (rec->no_buildid_cache_set && !rec->no_buildid_cache)
1812			disable = false;
1813		if (disable) {
1814			rec->no_buildid = true;
1815			rec->no_buildid_cache = true;
1816			disable_buildid_cache();
1817		}
1818	}
1819
1820	if (record.opts.overwrite)
1821		record.opts.tail_synthesize = true;
1822
1823	if (rec->evlist->nr_entries == 0 &&
1824	    __perf_evlist__add_default(rec->evlist, !record.opts.no_samples) < 0) {
1825		pr_err("Not enough memory for event selector list\n");
1826		goto out;
1827	}
1828
1829	if (rec->opts.target.tid && !rec->opts.no_inherit_set)
1830		rec->opts.no_inherit = true;
1831
1832	err = target__validate(&rec->opts.target);
1833	if (err) {
1834		target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
1835		ui__warning("%s\n", errbuf);
1836	}
1837
1838	err = target__parse_uid(&rec->opts.target);
1839	if (err) {
1840		int saved_errno = errno;
1841
1842		target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
1843		ui__error("%s", errbuf);
1844
1845		err = -saved_errno;
1846		goto out;
1847	}
1848
1849	/* Enable ignoring missing threads when -u/-p option is defined. */
1850	rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid;
1851
1852	err = -ENOMEM;
1853	if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0)
1854		usage_with_options(record_usage, record_options);
1855
1856	err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts);
1857	if (err)
1858		goto out;
1859
1860	/*
1861	 * We take all buildids when the file contains
1862	 * AUX area tracing data because we do not decode the
1863	 * trace because it would take too long.
1864	 */
1865	if (rec->opts.full_auxtrace)
1866		rec->buildid_all = true;
1867
1868	if (record_opts__config(&rec->opts)) {
1869		err = -EINVAL;
1870		goto out;
1871	}
1872
1873	err = __cmd_record(&record, argc, argv);
1874out:
1875	perf_evlist__delete(rec->evlist);
1876	symbol__exit();
1877	auxtrace_record__free(rec->itr);
1878	return err;
1879}
1880
1881static void snapshot_sig_handler(int sig __maybe_unused)
1882{
1883	struct record *rec = &record;
1884
1885	if (trigger_is_ready(&auxtrace_snapshot_trigger)) {
1886		trigger_hit(&auxtrace_snapshot_trigger);
1887		auxtrace_record__snapshot_started = 1;
1888		if (auxtrace_record__snapshot_start(record.itr))
1889			trigger_error(&auxtrace_snapshot_trigger);
1890	}
1891
1892	if (switch_output_signal(rec))
1893		trigger_hit(&switch_output_trigger);
1894}
1895
1896static void alarm_sig_handler(int sig __maybe_unused)
1897{
1898	struct record *rec = &record;
1899
1900	if (switch_output_time(rec))
1901		trigger_hit(&switch_output_trigger);
1902}