lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20160427213249.GS11033@kernel.org>
Date:	Wed, 27 Apr 2016 18:32:49 -0300
From:	Arnaldo Carvalho de Melo <acme@...nel.org>
To:	Wang Nan <wangnan0@...wei.com>
Cc:	jolsa@...hat.com, namhyung@...nel.org,
	linux-kernel@...r.kernel.org, pi3orama@....com,
	Adrian Hunter <adrian.hunter@...el.com>,
	Jiri Olsa <jolsa@...nel.org>,
	Masami Hiramatsu <mhiramat@...nel.org>,
	Zefan Li <lizefan@...wei.com>, He Kuang <hekuang@...wei.com>,
	Arnaldo Carvalho de Melo <acme@...hat.com>
Subject: Re: [PATCH v6 3/7] perf record: Split output into multiple files via
 '--switch-output'

Em Wed, Apr 20, 2016 at 06:59:50PM +0000, Wang Nan escreveu:
> Allow 'perf record' to split its output into multiple files.
> 
> For example:

I squashed:

->  360   T 04/20 Wang Nan        (1.7K) ├─>[PATCH v6 6/7]
perf record: Re-synthesize tracking events after output switching

Into this patch, so that we don't have the problem in the bisection
history where samples don't get resolved to the existing threads not
synthesized in the perf.data.N where N > the first timestamp.

Please holler if you disagree, I doubt you will tho :-)

- Arnaldo

 
>   # ~/perf record -a --timestamp-filename --switch-output &
>   [1] 10763
>   # kill -s SIGUSR2 10763
>   [ perf record: dump data: Woken up 1 times ]
>   # [ perf record: Dump perf.data.2015122622314468 ]
> 
>   # kill -s SIGUSR2 10763
>   [ perf record: dump data: Woken up 1 times ]
>   # [ perf record: Dump perf.data.2015122622314762 ]
> 
>   # kill -s SIGUSR2 10763
>   [ perf record: dump data: Woken up 1 times ]
>   #[ perf record: Dump perf.data.2015122622315171 ]
> 
>   # fg
>   perf record -a --timestamp-filename --switch-output
>   ^C[ perf record: Woken up 1 times to write data ]
>   [ perf record: Dump perf.data.2015122622315513 ]
>   [ perf record: Captured and wrote 0.014 MB perf.data.<timestamp> (296 samples) ]
> 
>   # ls -l
>   total 920
>   -rw------- 1 root root 797692 Dec 26 22:31 perf.data.2015122622314468
>   -rw------- 1 root root  59960 Dec 26 22:31 perf.data.2015122622314762
>   -rw------- 1 root root  59912 Dec 26 22:31 perf.data.2015122622315171
>   -rw------- 1 root root  19220 Dec 26 22:31 perf.data.2015122622315513
> 
> Signed-off-by: Wang Nan <wangnan0@...wei.com>
> Tested-by: Arnaldo Carvalho de Melo <acme@...hat.com>
> Cc: Adrian Hunter <adrian.hunter@...el.com>
> Cc: Jiri Olsa <jolsa@...nel.org>
> Cc: Masami Hiramatsu <mhiramat@...nel.org>
> Cc: Namhyung Kim <namhyung@...nel.org>
> Cc: Zefan Li <lizefan@...wei.com>
> Cc: pi3orama@....com
> Link: http://lkml.kernel.org/r/1460643725-167413-3-git-send-email-wangnan0@huawei.com
> Signed-off-by: He Kuang <hekuang@...wei.com>
> [ Added man page entry ]
> Signed-off-by: Arnaldo Carvalho de Melo <acme@...hat.com>
> ---
>  tools/perf/Documentation/perf-record.txt |  8 ++++++++
>  tools/perf/builtin-record.c              | 33 ++++++++++++++++++++++++++++++--
>  2 files changed, 39 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index 19aa175..a77a431 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -347,6 +347,14 @@ Configure all used events to run in kernel space.
>  --all-user::
>  Configure all used events to run in user space.
>  
> +--switch-output::
> +Generate multiple perf.data files, timestamp prefixed, switching to a new one
> +when receiving a SIGUSR2.
> +
> +A possible use case is to, given an external event, slice the perf.data file
> +that gets then processed, possibly via a perf script, to decide if that
> +particular perf.data snapshot should be kept or not.
> +
>  SEE ALSO
>  --------
>  linkperf:perf-stat[1], linkperf:perf-list[1]
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index f4710c8..72246e2 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -58,6 +58,7 @@ struct record {
>  	bool			no_buildid_cache_set;
>  	bool			buildid_all;
>  	bool			timestamp_filename;
> +	bool			switch_output;
>  	unsigned long long	samples;
>  };
>  
> @@ -130,6 +131,7 @@ static volatile int child_finished;
>  
>  static volatile int auxtrace_record__snapshot_started;
>  static DEFINE_TRIGGER(auxtrace_snapshot_trigger);
> +static DEFINE_TRIGGER(switch_output_trigger);
>  
>  static void sig_handler(int sig)
>  {
> @@ -650,9 +652,12 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
>  	signal(SIGINT, sig_handler);
>  	signal(SIGTERM, sig_handler);
>  
> -	if (rec->opts.auxtrace_snapshot_mode) {
> +	if (rec->opts.auxtrace_snapshot_mode || rec->switch_output) {
>  		signal(SIGUSR2, snapshot_sig_handler);
> -		trigger_on(&auxtrace_snapshot_trigger);
> +		if (rec->opts.auxtrace_snapshot_mode)
> +			trigger_on(&auxtrace_snapshot_trigger);
> +		if (rec->switch_output)
> +			trigger_on(&switch_output_trigger);
>  	} else {
>  		signal(SIGUSR2, SIG_IGN);
>  	}
> @@ -782,11 +787,13 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
>  	}
>  
>  	trigger_ready(&auxtrace_snapshot_trigger);
> +	trigger_ready(&switch_output_trigger);
>  	for (;;) {
>  		unsigned long long hits = rec->samples;
>  
>  		if (record__mmap_read_all(rec) < 0) {
>  			trigger_error(&auxtrace_snapshot_trigger);
> +			trigger_error(&switch_output_trigger);
>  			err = -1;
>  			goto out_child;
>  		}
> @@ -802,6 +809,22 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
>  			}
>  		}
>  
> +		if (trigger_is_hit(&switch_output_trigger)) {
> +			trigger_ready(&switch_output_trigger);
> +
> +			if (!quiet)
> +				fprintf(stderr, "[ perf record: dump data: Woken up %ld times ]\n",
> +					waking);
> +			waking = 0;
> +			fd = record__switch_output(rec, false);
> +			if (fd < 0) {
> +				pr_err("Failed to switch to new file\n");
> +				trigger_error(&switch_output_trigger);
> +				err = fd;
> +				goto out_child;
> +			}
> +		}
> +
>  		if (hits == rec->samples) {
>  			if (done || draining)
>  				break;
> @@ -830,6 +853,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
>  		}
>  	}
>  	trigger_off(&auxtrace_snapshot_trigger);
> +	trigger_off(&switch_output_trigger);
>  
>  	if (forks && workload_exec_errno) {
>  		char msg[STRERR_BUFSIZE];
> @@ -1263,6 +1287,8 @@ struct option __record_options[] = {
>  		    "Record build-id of all DSOs regardless of hits"),
>  	OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename,
>  		    "append timestamp to output filename"),
> +	OPT_BOOLEAN(0, "switch-output", &record.switch_output,
> +		    "Switch output when receive SIGUSR2"),
>  	OPT_END()
>  };
>  
> @@ -1417,4 +1443,7 @@ static void snapshot_sig_handler(int sig __maybe_unused)
>  		if (auxtrace_record__snapshot_start(record.itr))
>  			trigger_error(&auxtrace_snapshot_trigger);
>  	}
> +
> +	if (trigger_is_ready(&switch_output_trigger))
> +		trigger_hit(&switch_output_trigger);
>  }
> -- 
> 1.8.3.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ