Re: [PATCH v1 2/4] perf record: introduce z, mmap-flush options and PERF_RECORD_COMPRESSED record

2019-01-14 Thread Alexey Budankov
Hi,
On 09.01.2019 19:58, Jiri Olsa wrote:
> On Mon, Dec 24, 2018 at 04:45:21PM +0300, Alexey Budankov wrote:
>>
>> Introduce --compression_level=n, --mmap-flush options and 
>> PERF_RECORD_COMPRESSED 
>> event record that contains compressed parts of mmap kernel buffer data.
>>
>> Signed-off-by: Alexey Budankov 
>> ---
>>  tools/perf/Documentation/perf-record.txt | 11 +++
>>  tools/perf/builtin-record.c  | 97 
>>  tools/perf/perf.h|  2 +
>>  tools/perf/util/env.h| 10 +++
>>  tools/perf/util/event.c  |  1 +
>>  tools/perf/util/event.h  |  7 ++
>>  tools/perf/util/evlist.c |  6 +-
>>  tools/perf/util/evlist.h |  2 +-
>>  tools/perf/util/header.c | 47 +++-
>>  tools/perf/util/header.h |  1 +
>>  tools/perf/util/mmap.c   |  4 +-
>>  tools/perf/util/mmap.h   |  3 +-
>>  12 files changed, 169 insertions(+), 22 deletions(-)
> 
> also I'm getting here similar error (like for the affinity patchset)

Really weird. Hopefully it can be resolved in the next version of the patch set.

Thanks,
Alexey

> 
> [jolsa@krava perf]$ git am /tmp/comp
> Applying: feature: build libzstd feature check, LIBZSTD_DIR and NO_LIBZSTD 
> defines
> Applying: perf record: introduce z, mmap-flush options and 
> PERF_RECORD_COMPRESSED record
> error: corrupt patch at line 526
> Patch failed at 0002 perf record: introduce z, mmap-flush options and 
> PERF_RECORD_COMPRESSED record
> 
> again the raw patch applies correctly:
> 
> [jolsa@krava perf]$ patch -p3 < /tmp/comp2
> patching file Documentation/perf-record.txt
> patching file builtin-record.c
> patching file perf.h
> patching file util/env.h
> patching file util/event.c
> patching file util/event.h
> patching file util/evlist.c
> patching file util/evlist.h
> patching file util/header.c
> patching file util/header.h
> patching file util/mmap.c
> patching file util/mmap.h
> 
> 
> jirka
> 


Re: [PATCH v1 2/4] perf record: introduce z, mmap-flush options and PERF_RECORD_COMPRESSED record

2019-01-09 Thread Jiri Olsa
On Mon, Dec 24, 2018 at 04:45:21PM +0300, Alexey Budankov wrote:
> 
> Introduce --compression_level=n, --mmap-flush options and 
> PERF_RECORD_COMPRESSED 
> event record that contains compressed parts of mmap kernel buffer data.
> 
> Signed-off-by: Alexey Budankov 
> ---
>  tools/perf/Documentation/perf-record.txt | 11 +++
>  tools/perf/builtin-record.c  | 97 
>  tools/perf/perf.h|  2 +
>  tools/perf/util/env.h| 10 +++
>  tools/perf/util/event.c  |  1 +
>  tools/perf/util/event.h  |  7 ++
>  tools/perf/util/evlist.c |  6 +-
>  tools/perf/util/evlist.h |  2 +-
>  tools/perf/util/header.c | 47 +++-
>  tools/perf/util/header.h |  1 +
>  tools/perf/util/mmap.c   |  4 +-
>  tools/perf/util/mmap.h   |  3 +-
>  12 files changed, 169 insertions(+), 22 deletions(-)

also I'm getting here similar error (like for the affinity patchset)

[jolsa@krava perf]$ git am /tmp/comp
Applying: feature: build libzstd feature check, LIBZSTD_DIR and NO_LIBZSTD 
defines
Applying: perf record: introduce z, mmap-flush options and 
PERF_RECORD_COMPRESSED record
error: corrupt patch at line 526
Patch failed at 0002 perf record: introduce z, mmap-flush options and 
PERF_RECORD_COMPRESSED record

again the raw patch applies correctly:

[jolsa@krava perf]$ patch -p3 < /tmp/comp2
patching file Documentation/perf-record.txt
patching file builtin-record.c
patching file perf.h
patching file util/env.h
patching file util/event.c
patching file util/event.h
patching file util/evlist.c
patching file util/evlist.h
patching file util/header.c
patching file util/header.h
patching file util/mmap.c
patching file util/mmap.h


jirka


[PATCH v1 2/4] perf record: introduce z, mmap-flush options and PERF_RECORD_COMPRESSED record

2018-12-24 Thread Alexey Budankov


Introduce --compression_level=n, --mmap-flush options and 
PERF_RECORD_COMPRESSED 
event record that contains compressed parts of mmap kernel buffer data.

Signed-off-by: Alexey Budankov 
---
 tools/perf/Documentation/perf-record.txt | 11 +++
 tools/perf/builtin-record.c  | 97 
 tools/perf/perf.h|  2 +
 tools/perf/util/env.h| 10 +++
 tools/perf/util/event.c  |  1 +
 tools/perf/util/event.h  |  7 ++
 tools/perf/util/evlist.c |  6 +-
 tools/perf/util/evlist.h |  2 +-
 tools/perf/util/header.c | 47 +++-
 tools/perf/util/header.h |  1 +
 tools/perf/util/mmap.c   |  4 +-
 tools/perf/util/mmap.h   |  3 +-
 12 files changed, 169 insertions(+), 22 deletions(-)

diff --git a/tools/perf/Documentation/perf-record.txt 
b/tools/perf/Documentation/perf-record.txt
index d232b13ea713..b849dfdefefe 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -440,6 +440,17 @@ Use  control blocks in asynchronous (Posix AIO) trace 
writing mode (default:
 Asynchronous mode is supported only when linking Perf tool with libc library
 providing implementation for Posix AIO API.
 
+-z::
+--compression-level=n::
+Produce compressed trace file to save storage space using specified level n 
(default: 0,
+best speed: 1, best compression: 22). Compression can be activated in 
asynchronous trace
+writing mode (--aio) only.
+
+--mmap-flush=n::
+Minimal number of bytes accumulated in mmap buffer that is flushed to trace 
file (default: 1).
+When compression mode (-z) is enabled it is recommended to set --mmap-flush to 
4096 or more.
+Maximal allowed value is a quater of mmap kernel buffer size.
+
 --all-kernel::
 Configure all used events to run in kernel space.
 
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 882285fb9f64..cb0b880281d7 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -81,6 +81,8 @@ struct record {
booltimestamp_boundary;
struct switch_outputswitch_output;
unsigned long long  samples;
+   u64 bytes_transferred;
+   u64 bytes_compressed;
 };
 
 static volatile int auxtrace_record__snapshot_started;
@@ -286,13 +288,17 @@ static int record__aio_parse(const struct option *opt,
 
if (unset) {
opts->nr_cblocks = 0;
-   } else {
-   if (str)
-   opts->nr_cblocks = strtol(str, NULL, 0);
-   if (!opts->nr_cblocks)
-   opts->nr_cblocks = nr_cblocks_default;
+   return 0;
}
 
+   if (str)
+   opts->nr_cblocks = strtol(str, NULL, 0);
+   if (!opts->nr_cblocks)
+   opts->nr_cblocks = nr_cblocks_default;
+
+   if (opts->nr_cblocks > nr_cblocks_max)
+   opts->nr_cblocks = nr_cblocks_max;
+
return 0;
 }
 #else /* HAVE_AIO_SUPPORT */
@@ -328,6 +334,30 @@ static int record__aio_enabled(struct record *rec)
return rec->opts.nr_cblocks > 0;
 }
 
+#define MMAP_FLUSH_DEFAULT 1
+
+static int record__mmap_flush_parse(const struct option *opt,
+   const char *str,
+   int unset)
+{
+   int mmap_len;
+   struct record_opts *opts = (struct record_opts *)opt->value;
+
+   if (unset)
+   return 0;
+
+   if (str)
+   opts->mmap_flush = strtol(str, NULL, 0);
+   if (!opts->mmap_flush)
+   opts->mmap_flush = MMAP_FLUSH_DEFAULT;
+
+   mmap_len = perf_evlist__mmap_size(opts->mmap_pages);
+   if (opts->mmap_flush > mmap_len / 4 )
+   opts->mmap_flush = mmap_len / 4;
+
+   return 0;
+}
+
 static int process_synthesized_event(struct perf_tool *tool,
 union perf_event *event,
 struct perf_sample *sample __maybe_unused,
@@ -533,7 +563,8 @@ static int record__mmap_evlist(struct record *rec,
 
if (perf_evlist__mmap_ex(evlist, opts->mmap_pages,
 opts->auxtrace_mmap_pages,
-opts->auxtrace_snapshot_mode, 
opts->nr_cblocks) < 0) {
+opts->auxtrace_snapshot_mode,
+opts->nr_cblocks, opts->mmap_flush) < 0) {
if (errno == EPERM) {
pr_err("Permission error mapping pages.\n"
   "Consider increasing "
@@ -723,7 +754,7 @@ static struct perf_event_header finished_round_event = {
 };
 
 static int record__mmap_read_evlist(struct record *rec, struct perf_evlist 
*evlist,
-   bool overwrite)
+   bool overwrite, bool