perf kvm: Apply new perf_mmap__read_event() interface
PATCH 1/14 perf kvm: Apply new perf_mmap__read_event() interface
From: Kan Liang <[email protected]>
The perf kvm still use the legacy interface.
Apply the new perf_mmap__read_event() interface for perf kvm. No functional change.
--- tools/perf/builtin-kvm.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
tools/perf/builtin-kvm.c +13 -4
@@ -743,16 +743,24 @@ static bool verify_vcpu(int vcpu)static s64 perf_kvm__mmap_read_idx (struct perf_kvm_stat *kvm,int idx,u64 *mmap_time) { +struct perf_evlist *evlist = kvm->evlist;union perf_event *event; +struct perf_mmap *md; +u64 end, start;u64 timestamp;s64 n =0 ;int err; *mmap_time =ULLONG_MAX ; -while ((event =perf_evlist__mmap_read (kvm->evlist, idx)) !=NULL ) { - err =perf_evlist__parse_sample_timestamp (kvm->evlist, event, ×tamp); + md = &evlist->mmap[idx]; + err =perf_mmap__read_init (md,0 , &start, &end); +if (err <0 ) +return (err == -EAGAIN ) ?0 :-1 ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) { + err =perf_evlist__parse_sample_timestamp (evlist, event, ×tamp);if (err) { -perf_evlist__mmap_consume (kvm->evlist, idx); +perf_mmap__consume (md,0 );pr_err ("Failed to parse sample\n" );return -1 ; }
@@ -762,7 +770,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,* FIXME: Here we can't consume the event, as perf_session__queue_event will * point to it, and it'll get possibly overwritten by the kernel. */ -perf_evlist__mmap_consume (kvm->evlist, idx); +perf_mmap__consume (md,0 );if (err) {pr_err ("Failed to enqueue sample: %d\n" , err);
@@ -779,6 +787,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,break ; } +perf_mmap__read_done (md);return n; }
Signature · 1 line
2.4.11
PATCH 2/14 perf trace: Apply new perf_mmap__read_event() interface
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
Apply the new perf_mmap__read_event() interface for perf trace.
No functional change.
--- tools/perf/builtin-trace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/builtin-trace.c +9 -2
@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;
@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );if (interrupted) goto out_disable;
@@ -2496,6 +2502,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) draining = true; } } +perf_mmap__read_done (md); }if (trace->nr_events == before) {
Signature · 1 line
2.4.11
Re: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
Quoted 18 lines · On Thu, Mar 01, 2018 at 06:08:59PM -0500, [email protected] wrote:
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
Apply the new
perf_mmap__read_event()interface for perf trace.No functional change.
Signed-off-by Kan Liang <[email protected]>--- tools/perf/builtin-trace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)tools/perf/builtin-trace.c +0
-0
tools/perf/builtin-trace.c static int trace__run(struct trace *trace, int argc, const char **argv) · line 2480
Quoted 10 lines
tools/perf/builtin-trace.c +5
-1@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ;
should we break the loop if this returns -EINVAL?
jirka
Quoted 25 lines
tools/perf/builtin-trace.c +4
-1+ +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );if (interrupted) goto out_disable;@@ -2496,6 +2502,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) draining = true; } } +perf_mmap__read_done (md); }if (trace->nr_events == before) {Signature · 1 line
2.4.11
Re: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
Quoted 25 lines · Jiri Olsa
Quoted 24 lines · On Thu, Mar 01, 2018 at 06:08:59PM -0500, [email protected] wrote:
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
Apply the new
perf_mmap__read_event()interface for perf trace.No functional change.
Signed-off-by Kan Liang <[email protected]>--- tools/perf/builtin-trace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)tools/perf/builtin-trace.c +2
-0@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start;
Quoted 7 lines
tools/perf/builtin-trace.c static int trace__run(struct trace *trace, int argc, const char **argv) · line 2480
Quoted 4 lines
tools/perf/builtin-trace.c +3
-1-while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ;should we break the loop if this returns
-EINVAL?
It only means the ring buffer is broken for current mmaps. For others, the data should still be good.
I don't think we should drop them by breaking the loop.
Also, the -EINVAL is only valid for overwrite mode. It is impossible to return -EINVAL in current code.
Thanks,
Kan
Quoted 27 lines
jirka
Quoted 25 lines
tools/perf/builtin-trace.c +4
-1+ +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );if (interrupted) goto out_disable;@@ -2496,6 +2502,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) draining = true; } } +perf_mmap__read_done (md); }if (trace->nr_events == before) {Signature · 1 line
2.4.11
Re: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
In reply to [email protected]Quoted 34 lines · On Thu, Mar 01, 2018 at 06:08:59PM -0500, [email protected] wrote:
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
Apply the new
perf_mmap__read_event()interface for perf trace.No functional change.
Signed-off-by Kan Liang <[email protected]>--- tools/perf/builtin-trace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)tools/perf/builtin-trace.c +7
-1@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;
tools/perf/builtin-trace.c static int trace__run(struct trace *trace, int argc, const char **argv) · line 2495
Quoted 5 lines
tools/perf/builtin-trace.c +1
-1@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );
could you call this with 'false' instead of 0, it's 'bool overwrite' applies also to the rest of the patchset
thanks,
jirka
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
Em Sat, Mar 03, 2018 at 12:30:22AM +0100, Jiri Olsa escreveu:
Quoted 36 lines · On Thu, Mar 01, 2018 at 06:08:59PM -0500, [email protected] wrote:
Quoted 35 lines
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
Apply the new
perf_mmap__read_event()interface for perf trace.No functional change.
Signed-off-by Kan Liang <[email protected]>--- tools/perf/builtin-trace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)tools/perf/builtin-trace.c +7
-1@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
Quoted 7 lines
tools/perf/builtin-trace.c static int trace__run(struct trace *trace, int argc, const char **argv) · line 2495
Quoted 4 lines
tools/perf/builtin-trace.c +1
-1trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );could you call this with 'false' instead of 0, it's 'bool overwrite' applies also to the rest of the patchset
I'm doing this, the argument is 'bool', so the value should be false or true, even '0' being way shorter...
- Arnaldo
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
Em Mon, Mar 05, 2018 at 10:03:39AM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 31 lines
Em Sat, Mar 03, 2018 at 12:30:22AM +0100, Jiri Olsa escreveu:
Quoted 22 lines · On Thu, Mar 01, 2018 at 06:08:59PM -0500, [email protected] wrote:
Quoted 21 lines
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
+++b/tools/perf/builtin-trace.ctools/perf/builtin-trace.c +7
-1@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)Quoted 7 lines
tools/perf/builtin-trace.c static int trace__run(struct trace *trace, int argc, const char **argv) · line 2495
Quoted 4 lines
tools/perf/builtin-trace.c +1
-1trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );could you call this with 'false' instead of 0, it's 'bool overwrite' applies also to the rest of the patchset
Quoted 2 lines
I'm doing this, the argument is 'bool', so the value should be false or true, even '0' being way shorter...
While doing that I wonder why is that we can't do it without those explicit start/end variables in all the call sites and passing overwrite, start and end as parameters...
Can't we just add 'overwrite, 'start' and 'end' to struct perf_mmap, then have perf_mmap__read_init() with just 'md' and 'overwrite' as parameters, initialize md->{start,end} and set md->overwrite to the 'overwrite' parameter in 'perf_mmap__read_init()' and then use just md as parameters for both perf_mmap__read_event() and perf_mmap__consume()?
What am I missing to have this much simpler without all this boilerplate?
Anyway, finishing the s/0/false/g, will leave this for later, but please comment on it.
- Arnaldo
Re: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
Quoted 39 lines · Arnaldo Carvalho de Melo
Em Mon, Mar 05, 2018 at 10:03:39AM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 31 lines
Em Sat, Mar 03, 2018 at 12:30:22AM +0100, Jiri Olsa escreveu:
Quoted 22 lines · On Thu, Mar 01, 2018 at 06:08:59PM -0500, [email protected] wrote:
Quoted 21 lines
From: Kan Liang <[email protected]>
The perf trace still use the legacy interface.
+++b/tools/perf/builtin-trace.ctools/perf/builtin-trace.c +7
-1@@ -2472,8 +2472,14 @@ static int trace__run(struct trace *trace, int argc, const char **argv)for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;@@ -2486,7 +2492,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)Quoted 7 lines
tools/perf/builtin-trace.c static int trace__run(struct trace *trace, int argc, const char **argv) · line 2495
Quoted 4 lines
tools/perf/builtin-trace.c +1
-1trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );could you call this with 'false' instead of 0, it's 'bool overwrite' applies also to the rest of the patchset
Quoted 2 lines
I'm doing this, the argument is 'bool', so the value should be false or true, even '0' being way shorter...
While doing that I wonder why is that we can't do it without those explicit start/end variables in all the call sites and passing overwrite, start and end as parameters...
Quoted 7 lines
Can't we just add 'overwrite, 'start' and 'end' to struct
perf_mmap, then haveperf_mmap__read_init()with just 'md' and 'overwrite' as parameters, initialize md->{start,end} and setmd->overwriteto the 'overwrite' parameter in 'perf_mmap__read_init()' and then use just md as parameters for bothperf_mmap__read_event()andperf_mmap__consume()?
I don't see any reason we cannot do this.
I will do some test. If it works well, I will submit the follow-up patch to clean up the interface.
Thanks,
Kan
Quoted 8 lines
What am I missing to have this much simpler without all this boilerplate?
Anyway, finishing the s/0/false/g, will leave this for later, but please comment on it.
- Arnaldo
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 02/14] perf trace: Apply new perf_mmap__read_event() interface
Em Mon, Mar 05, 2018 at 09:50:10AM -0500, Liang, Kan escreveu:
Quoted 18 lines · Arnaldo Carvalho de Melo
Quoted 8 lines
Em Mon, Mar 05, 2018 at 10:03:39AM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 2 lines
I'm doing this, the argument is 'bool', so the value should be false or true, even '0' being way shorter...
While doing that I wonder why is that we can't do it without those explicit start/end variables in all the call sites and passing overwrite, start and end as parameters...
Quoted 6 lines
Can't we just add 'overwrite, 'start' and 'end' to struct
perf_mmap, then haveperf_mmap__read_init()with just 'md' and 'overwrite' as parameters, initialize md->{start,end} and setmd->overwriteto the 'overwrite' parameter in 'perf_mmap__read_init()' and then use just md as parameters for bothperf_mmap__read_event()andperf_mmap__consume()?
Quoted 3 lines
I don't see any reason we cannot do this.
I will do some test. If it works well, I will submit the follow-up patch to clean up the interface.
Thanks a lot! The less boilerplate we have in such functions, making them easier to use for new people contributing to tools/perf/, the better.
- Arnaldo
tip-bot for Kan Liang
merge bot[tip:perf/core] perf trace: Switch to new perf_mmap__read_event() interface
In reply to [email protected]perf trace: Switch to new perf_mmap__read_event() interface
Commit-ID: d7f55c62e63461c4071afe8730851e406935d960 Gitweb: https://git.kernel.org/tip/d7f55c62e63461c4071afe8730851e406935d960 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:08:59 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:41:59 -0300
perf trace: Switch to new perf_mmap__read_event() interface
The 'perf trace' utility still use the legacy interface.
Switch to the new perf_mmap__read_event() interface.
No functional change.
--- tools/perf/builtin-trace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/builtin-trace.c +9 -2
@@ -2472,8 +2472,14 @@ again:for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {struct perf_sample sample; ++trace->nr_events;
@@ -2486,7 +2492,7 @@ again:trace__handle_event (trace, event, &sample); next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false);if (interrupted) goto out_disable;
@@ -2496,6 +2502,7 @@ next_event: draining = true; } } +perf_mmap__read_done (md); }if (trace->nr_events == before) {
PATCH 3/14 perf python: Apply new perf_mmap__read_event() interface
In reply to [email protected]From: Kan Liang <[email protected]>
The perf python still use the legacy interface.
No functional change.
--- tools/perf/util/python.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
tools/perf/util/python.c +9 -3
@@ -983,13 +983,19 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,union perf_event *event;int sample_id_all =1 , cpu;static char *kwlist[] = {"cpu" ,"sample_id_all" ,NULL }; +struct perf_mmap *md; +u64 end, start;int err;if (!PyArg_ParseTupleAndKeywords (args, kwargs,"i|i" , kwlist, &cpu, &sample_id_all))return NULL ; - event =perf_evlist__mmap_read (evlist, cpu); + md = &evlist->mmap[cpu]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) + goto end; + + event =perf_mmap__read_event (md,0 , &start, end);if (event !=NULL ) {PyObject *pyevent =pyrf_event__new (event);struct pyrf_event *pevent = (struct pyrf_event *)pyevent;
@@ -1007,14 +1013,14 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, err =perf_evsel__parse_sample (evsel, event, &pevent->sample);/* Consume the even only after we parsed it out. */ -perf_evlist__mmap_consume (evlist, cpu); +perf_mmap__consume (md,0 );if (err)return PyErr_Format (PyExc_OSError,"perf: can't parse sample, err=%d" , err);return pyevent; } - +end:Py_INCREF (Py_None);return Py_None; }
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf python: Switch to new perf_mmap__read_event() interface
perf python: Switch to new perf_mmap__read_event() interface
Commit-ID: 35b7cdc6379ea8300161f0f80fe8aad083a1c5d0 Gitweb: https://git.kernel.org/tip/35b7cdc6379ea8300161f0f80fe8aad083a1c5d0 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:00 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:47:07 -0300
perf python: Switch to new perf_mmap__read_event() interface
The perf python binding still use the legacy interface.
No functional change.
Committer notes:
Tested before and after with:
[root@jouet perf]# export PYTHONPATH=/tmp/build/perf/python
[root@jouet perf]# tools/perf/python/twatch.py
cpu: 0, pid: 1183, tid: 6293 { type: exit, pid: 1183, ppid: 1183, tid: 6293, ptid: 6293, time: 17886646588257}
cpu: 2, pid: 13820, tid: 13820 { type: fork, pid: 13820, ppid: 13820, tid: 6306, ptid: 13820, time: 17886869099529}
cpu: 1, pid: 13820, tid: 6306 { type: comm, pid: 13820, tid: 6306, comm: TaskSchedulerFo } ^CTraceback (most recent call last):
File "tools/perf/python/twatch.py", line 68, in <module>
main()
File "tools/perf/python/twatch.py", line 40, in main
evlist.poll(timeout = -1)
KeyboardInterrupt
[root@jouet perf]#
No problems found.
--- tools/perf/util/python.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
tools/perf/util/python.c +9 -3
@@ -983,13 +983,19 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,union perf_event *event;int sample_id_all =1 , cpu;static char *kwlist[] = {"cpu" ,"sample_id_all" ,NULL }; +struct perf_mmap *md; +u64 end, start;int err;if (!PyArg_ParseTupleAndKeywords (args, kwargs,"i|i" , kwlist, &cpu, &sample_id_all))return NULL ; - event =perf_evlist__mmap_read (evlist, cpu); + md = &evlist->mmap[cpu]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) + goto end; + + event =perf_mmap__read_event (md, false, &start, end);if (event !=NULL ) {PyObject *pyevent =pyrf_event__new (event);struct pyrf_event *pevent = (struct pyrf_event *)pyevent;
@@ -1007,14 +1013,14 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, err =perf_evsel__parse_sample (evsel, event, &pevent->sample);/* Consume the even only after we parsed it out. */ -perf_evlist__mmap_consume (evlist, cpu); +perf_mmap__consume (md, false);if (err)return PyErr_Format (PyExc_OSError,"perf: can't parse sample, err=%d" , err);return pyevent; } - +end:Py_INCREF (Py_None);return Py_None; }
PATCH 4/14 perf test: Apply new perf_mmap__read_event() interface for bpf
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'bpf' still use the legacy interface.
No functional change.
--- tools/perf/tests/bpf.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
tools/perf/tests/bpf.c +8 -1
@@ -176,13 +176,20 @@ static int do_test(struct bpf_object *obj, int (*func)(void),for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {const u32 type = event->header.type;if (type ==PERF_RECORD_SAMPLE ) count ++; } +perf_mmap__read_done (md); }if (count != expect) {
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for bpf
perf test: Switch to new perf_mmap__read_event() interface for bpf
Commit-ID: 2f54f3a4733c0cd857992d793af5e8321b281012 Gitweb: https://git.kernel.org/tip/2f54f3a4733c0cd857992d793af5e8321b281012 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:01 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:47:54 -0300
perf test: Switch to new perf_mmap__read_event() interface for bpf
The perf test 'bpf' still use the legacy interface.
No functional change.
Committer notes:
Tested with:
# perf test bpf 39: BPF filter : 39.1: Basic BPF filtering : Ok 39.2: BPF pinning : Ok 39.3: BPF prologue generation : Ok 39.4: BPF relocation checker : Ok #
--- tools/perf/tests/bpf.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
tools/perf/tests/bpf.c +8 -1
@@ -176,13 +176,20 @@ static int do_test(struct bpf_object *obj, int (*func)(void),for (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {const u32 type = event->header.type;if (type ==PERF_RECORD_SAMPLE ) count ++; } +perf_mmap__read_done (md); }if (count != expect) {
PATCH 5/14 perf test: Apply new perf_mmap__read_event() interface for code reading
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'object code reading' still use the legacy interface.
No functional change.
--- tools/perf/tests/code-reading.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/code-reading.c +9 -2
@@ -409,15 +409,22 @@ static int process_events(struct machine *machine, struct perf_evlist *evlist, struct state *state) {union perf_event *event; +struct perf_mmap *md; +u64 end, start;int i, ret;for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) { ret =process_event (machine, evlist, event, state); -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );if (ret <0 )return ret; } +perf_mmap__read_done (md); }return 0 ; }
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for 'code reading' test
perf test: Switch to new perf_mmap__read_event() interface for 'code reading' test
Commit-ID: 00fc2460e735fa0f6add802c7426273e7dbc2b27 Gitweb: https://git.kernel.org/tip/00fc2460e735fa0f6add802c7426273e7dbc2b27 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:02 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:48:36 -0300
perf test: Switch to new perf_mmap__read_event() interface for 'code reading' test
The perf test 'object code reading' still use the legacy interface.
No functional change.
Committer notes:
Testing:
# perf test reading 23: Object code reading: Ok #
--- tools/perf/tests/code-reading.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/code-reading.c +9 -2
@@ -409,15 +409,22 @@ static int process_events(struct machine *machine, struct perf_evlist *evlist, struct state *state) {union perf_event *event; +struct perf_mmap *md; +u64 end, start;int i, ret;for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) { ret =process_event (machine, evlist, event, state); -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false);if (ret <0 )return ret; } +perf_mmap__read_done (md); }return 0 ; }
PATCH 6/14 perf test: Apply new perf_mmap__read_event() interface for keep_tracking
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'keep_tracking' still use the legacy interface.
No functional change.
--- tools/perf/tests/keep-tracking.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
tools/perf/tests/keep-tracking.c +8 -2
@@ -27,18 +27,24 @@static int find_comm (struct perf_evlist *evlist,const char *comm) {union perf_event *event; +struct perf_mmap *md; +u64 end, start;int i, found; found =0 ;for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {if (event->header.type ==PERF_RECORD_COMM && (pid_t )event->comm.pid ==getpid () && (pid_t )event->comm.tid ==getpid () &&strcmp (event->comm.comm, comm) ==0 ) found +=1 ; -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 ); } +perf_mmap__read_done (md); }return found; }
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for "keep tracking" test
perf test: Switch to new perf_mmap__read_event() interface for "keep tracking" test
Commit-ID: 693d32aebf857ef1d1803b08ef1b631990ae3747 Gitweb: https://git.kernel.org/tip/693d32aebf857ef1d1803b08ef1b631990ae3747 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:03 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:49:01 -0300
perf test: Switch to new perf_mmap__read_event() interface for "keep tracking" test
The perf test 'keep tracking' still use the legacy interface.
No functional change.
Committer testing:
# perf test tracking 25: Use a dummy software event to keep tracking : Ok #
--- tools/perf/tests/keep-tracking.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
tools/perf/tests/keep-tracking.c +8 -2
@@ -27,18 +27,24 @@static int find_comm (struct perf_evlist *evlist,const char *comm) {union perf_event *event; +struct perf_mmap *md; +u64 end, start;int i, found; found =0 ;for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {if (event->header.type ==PERF_RECORD_COMM && (pid_t )event->comm.pid ==getpid () && (pid_t )event->comm.tid ==getpid () &&strcmp (event->comm.comm, comm) ==0 ) found +=1 ; -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false); } +perf_mmap__read_done (md); }return found; }
PATCH 7/14 perf test: Apply new perf_mmap__read_event() interface for mmap-basic
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'mmap-basic' still use the legacy interface.
No functional change.
--- tools/perf/tests/mmap-basic.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/perf/tests/mmap-basic.c +10 -2
@@ -38,6 +38,8 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse expected_nr_events[nsyscalls], i, j;struct perf_evsel *evsels[nsyscalls], *evsel;char sbuf[STRERR_BUFSIZE ]; +struct perf_mmap *md; +u64 end, start; threads =thread_map__new (-1 ,getpid (),UINT_MAX );if (threads ==NULL ) {
@@ -106,7 +108,11 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse ++foo; } -while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) { + md = &evlist->mmap[0 ]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) + goto out_init; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample;if (event->header.type !=PERF_RECORD_SAMPLE ) {
@@ -129,9 +135,11 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse goto out_delete_evlist; } nr_events[evsel->idx]++; -perf_evlist__mmap_consume (evlist,0 ); +perf_mmap__consume (md,0 ); } +perf_mmap__read_done (md); +out_init: err =0 ;evlist__for_each_entry (evlist, evsel) {if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) {
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for mmap-basic
perf test: Switch to new perf_mmap__read_event() interface for mmap-basic
Commit-ID: 334f823e2ab58b3c0e58fa71321680382c5f60ff Gitweb: https://git.kernel.org/tip/334f823e2ab58b3c0e58fa71321680382c5f60ff Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:04 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:49:37 -0300
perf test: Switch to new perf_mmap__read_event() interface for mmap-basic
The perf test 'mmap-basic' still use the legacy interface.
No functional change.
Committer notes:
Testing it:
# perf test "mmap interface" 4: Read samples using the mmap interface : Ok #
--- tools/perf/tests/mmap-basic.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/perf/tests/mmap-basic.c +10 -2
@@ -38,6 +38,8 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse expected_nr_events[nsyscalls], i, j;struct perf_evsel *evsels[nsyscalls], *evsel;char sbuf[STRERR_BUFSIZE ]; +struct perf_mmap *md; +u64 end, start; threads =thread_map__new (-1 ,getpid (),UINT_MAX );if (threads ==NULL ) {
@@ -106,7 +108,11 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse ++foo; } -while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) { + md = &evlist->mmap[0 ]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) + goto out_init; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {struct perf_sample sample;if (event->header.type !=PERF_RECORD_SAMPLE ) {
@@ -129,9 +135,11 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse goto out_delete_evlist; } nr_events[evsel->idx]++; -perf_evlist__mmap_consume (evlist,0 ); +perf_mmap__consume (md, false); } +perf_mmap__read_done (md); +out_init: err =0 ;evlist__for_each_entry (evlist, evsel) {if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) {
PATCH 8/14 perf test: Apply new perf_mmap__read_event() interface for tp fields
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'syscalls:sys_enter_openat event fields' still use the legacy interface.
No functional change.
--- tools/perf/tests/openat-syscall-tp-fields.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/openat-syscall-tp-fields.c +9 -2
@@ -86,8 +86,14 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtestfor (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {const u32 type = event->header.type;int tp_flags;struct perf_sample sample;
@@ -95,7 +101,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest ++nr_events;if (type !=PERF_RECORD_SAMPLE ) { -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );continue ; }
@@ -115,6 +121,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest goto out_ok; } +perf_mmap__read_done (md); }if (nr_events == before)
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for tp fields
perf test: Switch to new perf_mmap__read_event() interface for tp fields
Commit-ID: 1d1b5632ed0b797721a409bbed718d85384168a2 Gitweb: https://git.kernel.org/tip/1d1b5632ed0b797721a409bbed718d85384168a2 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:05 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:49:59 -0300
perf test: Switch to new perf_mmap__read_event() interface for tp fields
The perf test 'syscalls:sys_enter_openat event fields' still use the legacy interface.
No functional change.
Committer notes:
Testing it:
# perf test sys_enter_openat 15: syscalls:sys_enter_openat event fields : Ok #
--- tools/perf/tests/openat-syscall-tp-fields.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/openat-syscall-tp-fields.c +9 -2
@@ -86,8 +86,14 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtestfor (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {const u32 type = event->header.type;int tp_flags;struct perf_sample sample;
@@ -95,7 +101,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest ++nr_events;if (type !=PERF_RECORD_SAMPLE ) { -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false);continue ; }
@@ -115,6 +121,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest goto out_ok; } +perf_mmap__read_done (md); }if (nr_events == before)
PATCH 9/14 perf test: Apply new perf_mmap__read_event() interface for perf-record
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'perf-record' still use the legacy interface.
No functional change.
--- tools/perf/tests/perf-record.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/perf-record.c +9 -2
@@ -164,8 +164,14 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unusfor (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {const u32 type = event->header.type;const char *name =perf_event__name (type);
@@ -266,8 +272,9 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unus ++errs; } -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 ); } +perf_mmap__read_done (md); }/*
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for perf-record
perf test: Switch to new perf_mmap__read_event() interface for perf-record
Commit-ID: 88e37a4bbe6e05fd5ad103738c542658b81e76ea Gitweb: https://git.kernel.org/tip/88e37a4bbe6e05fd5ad103738c542658b81e76ea Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:06 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:50:21 -0300
perf test: Switch to new perf_mmap__read_event() interface for perf-record
The perf test 'perf-record' still use the legacy interface.
No functional change.
Committer notes:
Testing it:
# perf test PERF_RECORD 8: PERF_RECORD_* events & perf_sample fields : Ok #
--- tools/perf/tests/perf-record.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/perf-record.c +9 -2
@@ -164,8 +164,14 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unusfor (i =0 ; i < evlist->nr_mmaps; i++) {union perf_event *event; +struct perf_mmap *md; +u64 end, start; -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {const u32 type = event->header.type;const char *name =perf_event__name (type);
@@ -266,8 +272,9 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unus ++errs; } -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false); } +perf_mmap__read_done (md); }/*
PATCH 10/14 perf test: Apply new perf_mmap__read_event() interface for time-to-tsc
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'time-to-tsc' still use the legacy interface.
No functional change.
--- tools/perf/arch/x86/tests/perf-time-to-tsc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/arch/x86/tests/perf-time-to-tsc.c +9 -2
@@ -60,6 +60,8 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybeunion perf_event *event;u64 test_tsc, comm1_tsc, comm2_tsc;u64 test_time, comm1_time =0 , comm2_time =0 ; +struct perf_mmap *md; +u64 end, start; threads =thread_map__new (-1 ,getpid (),UINT_MAX );CHECK_NOT_NULL__ (threads);
@@ -109,7 +111,11 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybeperf_evlist__disable (evlist);for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample; if (event->header.type != PERF_RECORD_COMM ||
@@ -128,8 +134,9 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybe comm2_time = sample.time; } next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 ); } +perf_mmap__read_done (md); }if (!comm1_time || !comm2_time)
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for time-to-tsc
perf test: Switch to new perf_mmap__read_event() interface for time-to-tsc
Commit-ID: 9dfb85dfaffe6bc38f0c9f8a8622e2a7ca333e58 Gitweb: https://git.kernel.org/tip/9dfb85dfaffe6bc38f0c9f8a8622e2a7ca333e58 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:07 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:50:23 -0300
perf test: Switch to new perf_mmap__read_event() interface for time-to-tsc
The perf test 'time-to-tsc' still use the legacy interface.
No functional change.
Commiter notes:
Testing it:
# perf test tsc 57: Convert perf time to TSC : Ok #
--- tools/perf/arch/x86/tests/perf-time-to-tsc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/arch/x86/tests/perf-time-to-tsc.c +9 -2
@@ -60,6 +60,8 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybeunion perf_event *event;u64 test_tsc, comm1_tsc, comm2_tsc;u64 test_time, comm1_time =0 , comm2_time =0 ; +struct perf_mmap *md; +u64 end, start; threads =thread_map__new (-1 ,getpid (),UINT_MAX );CHECK_NOT_NULL__ (threads);
@@ -109,7 +111,11 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybeperf_evlist__disable (evlist);for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {struct perf_sample sample; if (event->header.type != PERF_RECORD_COMM ||
@@ -128,8 +134,9 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybe comm2_time = sample.time; } next_event: -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false); } +perf_mmap__read_done (md); }if (!comm1_time || !comm2_time)
PATCH 11/14 perf test: Apply new perf_mmap__read_event() interface for sw-clock
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'sw-clock' still use the legacy interface.
No functional change.
--- tools/perf/tests/sw-clock.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/perf/tests/sw-clock.c +10 -2
@@ -39,6 +39,8 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) };struct cpu_map *cpus;struct thread_map *threads; +struct perf_mmap *md; +u64 end, start; attr.sample_freq =500 ;
@@ -93,7 +95,11 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)perf_evlist__disable (evlist); -while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) { + md = &evlist->mmap[0 ]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) + goto out_init; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {struct perf_sample sample;if (event->header.type !=PERF_RECORD_SAMPLE )
@@ -108,9 +114,11 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) total_periods += sample.period; nr_samples++; next_event: -perf_evlist__mmap_consume (evlist,0 ); +perf_mmap__consume (md,0 ); } +perf_mmap__read_done (md); +out_init:if ((u64 ) nr_samples == total_periods) {pr_debug ("All (%d) samples have period value of 1!\n" , nr_samples);
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for sw-clock
perf test: Switch to new perf_mmap__read_event() interface for sw-clock
Commit-ID: 5d0007cdfc6612788badceb276156d6ccb30b6de Gitweb: https://git.kernel.org/tip/5d0007cdfc6612788badceb276156d6ccb30b6de Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:08 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:50:37 -0300
perf test: Switch to new perf_mmap__read_event() interface for sw-clock
The perf test 'sw-clock' still use the legacy interface.
No functional change.
Committer testing:
# perf test clock 22: Software clock events period values : Ok #
--- tools/perf/tests/sw-clock.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/perf/tests/sw-clock.c +10 -2
@@ -39,6 +39,8 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) };struct cpu_map *cpus;struct thread_map *threads; +struct perf_mmap *md; +u64 end, start; attr.sample_freq =500 ;
@@ -93,7 +95,11 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)perf_evlist__disable (evlist); -while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) { + md = &evlist->mmap[0 ]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) + goto out_init; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {struct perf_sample sample;if (event->header.type !=PERF_RECORD_SAMPLE )
@@ -108,9 +114,11 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) total_periods += sample.period; nr_samples++; next_event: -perf_evlist__mmap_consume (evlist,0 ); +perf_mmap__consume (md, false); } +perf_mmap__read_done (md); +out_init:if ((u64 ) nr_samples == total_periods) {pr_debug ("All (%d) samples have period value of 1!\n" , nr_samples);
PATCH 12/14 perf test: Apply new perf_mmap__read_event() interface for switch-tracking
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'switch-tracking' still use the legacy interface.
No functional change.
--- tools/perf/tests/switch-tracking.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/switch-tracking.c +9 -2
@@ -258,16 +258,23 @@ static int process_events(struct perf_evlist *evlist,unsigned pos, cnt =0 ;LIST_HEAD (events);struct event_node *events_array, *node; +struct perf_mmap *md; +u64 end, start;int i, ret;for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) { cnt +=1 ; ret =add_event (evlist, &events, event); -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md,0 );if (ret <0 ) goto out_free_nodes; } +perf_mmap__read_done (md); } events_array =calloc (cnt,sizeof (struct event_node ));
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for switch-tracking
perf test: Switch to new perf_mmap__read_event() interface for switch-tracking
Commit-ID: ee4024ff858211316c4824b16bea446f08765ae8 Gitweb: https://git.kernel.org/tip/ee4024ff858211316c4824b16bea446f08765ae8 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:09 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:50:50 -0300
perf test: Switch to new perf_mmap__read_event() interface for switch-tracking
The perf test 'switch-tracking' still use the legacy interface.
No functional change.
Committer testing:
# perf test switch 32: Track with sched_switch : Ok #
--- tools/perf/tests/switch-tracking.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/tests/switch-tracking.c +9 -2
@@ -258,16 +258,23 @@ static int process_events(struct perf_evlist *evlist,unsigned pos, cnt =0 ;LIST_HEAD (events);struct event_node *events_array, *node; +struct perf_mmap *md; +u64 end, start;int i, ret;for (i =0 ; i < evlist->nr_mmaps; i++) { -while ((event =perf_evlist__mmap_read (evlist, i)) !=NULL ) { + md = &evlist->mmap[i]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) +continue ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) { cnt +=1 ; ret =add_event (evlist, &events, event); -perf_evlist__mmap_consume (evlist, i); +perf_mmap__consume (md, false);if (ret <0 ) goto out_free_nodes; } +perf_mmap__read_done (md); } events_array =calloc (cnt,sizeof (struct event_node ));
PATCH 13/14 perf test: Apply new perf_mmap__read_event() interface for task-exit
In reply to [email protected]From: Kan Liang <[email protected]>
The perf test 'task-exit' still use the legacy interface.
No functional change.
--- tools/perf/tests/task-exit.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/perf/tests/task-exit.c +10 -2
@@ -47,6 +47,8 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unusedchar sbuf[STRERR_BUFSIZE ];struct cpu_map *cpus;struct thread_map *threads; +struct perf_mmap *md; +u64 end, start;signal (SIGCHLD , sig_handler);
@@ -110,13 +112,19 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unusedperf_evlist__start_workload (evlist); retry: -while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) { + md = &evlist->mmap[0 ]; +if (perf_mmap__read_init (md,0 , &start, &end) <0 ) + goto out_init; + +while ((event =perf_mmap__read_event (md,0 , &start, end)) !=NULL ) {if (event->header.type ==PERF_RECORD_EXIT ) nr_exit++; -perf_evlist__mmap_consume (evlist,0 ); +perf_mmap__consume (md,0 ); } +perf_mmap__read_done (md); +out_init:if (!exited || !nr_exit) {perf_evlist__poll (evlist,-1 ); goto retry;
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf test: Switch to new perf_mmap__read_event() interface for task-exit
perf test: Switch to new perf_mmap__read_event() interface for task-exit
Commit-ID: 759487307625cd44ac4aa241ee547b52b72bc4ad Gitweb: https://git.kernel.org/tip/759487307625cd44ac4aa241ee547b52b72bc4ad Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:10 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:51:00 -0300
perf test: Switch to new perf_mmap__read_event() interface for task-exit
The perf test 'task-exit' still use the legacy interface.
No functional change.
Committer notes:
Testing it:
# perf test exit 21: Number of exit events of a simple workload : Ok #
--- tools/perf/tests/task-exit.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/perf/tests/task-exit.c +10 -2
@@ -47,6 +47,8 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unusedchar sbuf[STRERR_BUFSIZE ];struct cpu_map *cpus;struct thread_map *threads; +struct perf_mmap *md; +u64 end, start;signal (SIGCHLD , sig_handler);
@@ -110,13 +112,19 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unusedperf_evlist__start_workload (evlist); retry: -while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) { + md = &evlist->mmap[0 ]; +if (perf_mmap__read_init (md, false, &start, &end) <0 ) + goto out_init; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) {if (event->header.type ==PERF_RECORD_EXIT ) nr_exit++; -perf_evlist__mmap_consume (evlist,0 ); +perf_mmap__consume (md, false); } +perf_mmap__read_done (md); +out_init:if (!exited || !nr_exit) {perf_evlist__poll (evlist,-1 ); goto retry;
PATCH 14/14 perf tools: Discard legacy interfaces for mmap read forward
In reply to [email protected]From: Kan Liang <[email protected]>
Discards legacy interfaces perf_evlist__mmap_read_forward(), perf_evlist__mmap_read() and perf_evlist__mmap_consume().
No tools use them.
--- tools/perf/util/evlist.c | 25 +------------------------ tools/perf/util/evlist.h | 4 ---- tools/perf/util/mmap.c | 21 +-------------------- 3 files changed, 2 insertions(+), 48 deletions(-)
tools/perf/util/evlist.c +1 -24
@@ -702,29 +702,6 @@ static int perf_evlist__resume(struct perf_evlist *evlist)return perf_evlist__set_paused (evlist, false); } -union perf_event *perf_evlist__mmap_read_forward (struct perf_evlist *evlist,int idx) -{ -struct perf_mmap *md = &evlist->mmap[idx]; - -/* -* Check messup is required for forward overwritable ring buffer: -* memory pointed by md->prev can be overwritten in this case. -* No need for read-write ring buffer: kernel stop outputting when -* it hit md->prev (perf_mmap__consume()). -*/ -return perf_mmap__read_forward (md); -} - -union perf_event *perf_evlist__mmap_read (struct perf_evlist *evlist,int idx) -{ -return perf_evlist__mmap_read_forward (evlist, idx); -} - -void perf_evlist__mmap_consume (struct perf_evlist *evlist,int idx) -{ -perf_mmap__consume (&evlist->mmap[idx], false); -} -static void perf_evlist__munmap_nofree (struct perf_evlist *evlist) {int i;
@@ -761,7 +738,7 @@ static struct perf_mmap *perf_evlist__alloc_mmap(struct perf_evlist *evlist) map[i].fd =-1 ;/* * When the perf_mmap() call is made we grab one refcount, plus -* one extra to let perf_evlist__mmap_consume() get the last +* one extra to let perf_mmap__consume() get the last * events after all real references (perf_mmap__get()) are * dropped. *
tools/perf/util/evlist.h +0 -4
@@ -129,10 +129,6 @@ struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);void perf_evlist__toggle_bkw_mmap (struct perf_evlist *evlist,enum bkw_mmap_state state); -union perf_event *perf_evlist__mmap_read (struct perf_evlist *evlist,int idx); - -union perf_event *perf_evlist__mmap_read_forward (struct perf_evlist *evlist, -int idx);void perf_evlist__mmap_consume (struct perf_evlist *evlist,int idx);int perf_evlist__open (struct perf_evlist *evlist);
tools/perf/util/mmap.c +1 -20
@@ -64,25 +64,6 @@ static union perf_event *perf_mmap__read(struct perf_mmap *map, }/* -* legacy interface for mmap read. -* Don't use it. Use perf_mmap__read_event(). -*/ -union perf_event *perf_mmap__read_forward (struct perf_mmap *map) -{ -u64 head; - -/* -* Check if event was unmapped due to a POLLHUP/POLLERR. -*/ -if (!refcount_read (&map->refcnt)) -return NULL ; - - head =perf_mmap__read_head (map); - -return perf_mmap__read (map, &map->prev, head); -} - -/* * Read event from ring buffer one by one. * Return one event for each call. *
@@ -191,7 +172,7 @@ void perf_mmap__munmap(struct perf_mmap *map)int perf_mmap__mmap (struct perf_mmap *map,struct mmap_params *mp,int fd) {/* -* The last one will be done at perf_evlist__mmap_consume(), so that we +* The last one will be done at perf_mmap__consume(), so that we * make sure we don't prevent tools from consuming every last event in * the ring buffer. *
Signature · 1 line
2.4.11
tip-bot for Kan Liang
merge bot[tip:perf/core] perf mmap: Discard legacy interfaces for mmap read forward
perf mmap: Discard legacy interfaces for mmap read forward
Commit-ID: 6afad54d2f0ddebacfcf3b829147d7fed8dab298 Gitweb: https://git.kernel.org/tip/6afad54d2f0ddebacfcf3b829147d7fed8dab298 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:09:11 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:51:10 -0300
perf mmap: Discard legacy interfaces for mmap read forward
Discards legacy interfaces perf_evlist__mmap_read_forward(), perf_evlist__mmap_read() and perf_evlist__mmap_consume().
No tools use them.
--- tools/perf/util/evlist.c | 25 +------------------------ tools/perf/util/evlist.h | 4 ---- tools/perf/util/mmap.c | 21 +-------------------- 3 files changed, 2 insertions(+), 48 deletions(-)
tools/perf/util/evlist.c +1 -24
@@ -702,29 +702,6 @@ static int perf_evlist__resume(struct perf_evlist *evlist)return perf_evlist__set_paused (evlist, false); } -union perf_event *perf_evlist__mmap_read_forward (struct perf_evlist *evlist,int idx) -{ -struct perf_mmap *md = &evlist->mmap[idx]; - -/* -* Check messup is required for forward overwritable ring buffer: -* memory pointed by md->prev can be overwritten in this case. -* No need for read-write ring buffer: kernel stop outputting when -* it hit md->prev (perf_mmap__consume()). -*/ -return perf_mmap__read_forward (md); -} - -union perf_event *perf_evlist__mmap_read (struct perf_evlist *evlist,int idx) -{ -return perf_evlist__mmap_read_forward (evlist, idx); -} - -void perf_evlist__mmap_consume (struct perf_evlist *evlist,int idx) -{ -perf_mmap__consume (&evlist->mmap[idx], false); -} -static void perf_evlist__munmap_nofree (struct perf_evlist *evlist) {int i;
@@ -761,7 +738,7 @@ static struct perf_mmap *perf_evlist__alloc_mmap(struct perf_evlist *evlist) map[i].fd =-1 ;/* * When the perf_mmap() call is made we grab one refcount, plus -* one extra to let perf_evlist__mmap_consume() get the last +* one extra to let perf_mmap__consume() get the last * events after all real references (perf_mmap__get()) are * dropped. *
tools/perf/util/evlist.h +0 -4
@@ -129,10 +129,6 @@ struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);void perf_evlist__toggle_bkw_mmap (struct perf_evlist *evlist,enum bkw_mmap_state state); -union perf_event *perf_evlist__mmap_read (struct perf_evlist *evlist,int idx); - -union perf_event *perf_evlist__mmap_read_forward (struct perf_evlist *evlist, -int idx);void perf_evlist__mmap_consume (struct perf_evlist *evlist,int idx);int perf_evlist__open (struct perf_evlist *evlist);
tools/perf/util/mmap.c +1 -20
@@ -63,25 +63,6 @@ static union perf_event *perf_mmap__read(struct perf_mmap *map,return event; } -/* -* legacy interface for mmap read. -* Don't use it. Use perf_mmap__read_event(). -*/ -union perf_event *perf_mmap__read_forward (struct perf_mmap *map) -{ -u64 head; - -/* -* Check if event was unmapped due to a POLLHUP/POLLERR. -*/ -if (!refcount_read (&map->refcnt)) -return NULL ; - - head =perf_mmap__read_head (map); - -return perf_mmap__read (map, &map->prev, head); -} -/* * Read event from ring buffer one by one. * Return one event for each call.
@@ -191,7 +172,7 @@ void perf_mmap__munmap(struct perf_mmap *map)int perf_mmap__mmap (struct perf_mmap *map,struct mmap_params *mp,int fd) {/* -* The last one will be done at perf_evlist__mmap_consume(), so that we +* The last one will be done at perf_mmap__consume(), so that we * make sure we don't prevent tools from consuming every last event in * the ring buffer. *
tip-bot for Kan Liang
merge bot[tip:perf/core] perf kvm: Switch to new perf_mmap__read_event() interface
In reply to [email protected]perf kvm: Switch to new perf_mmap__read_event() interface
Commit-ID: 53172f9057e92c9b27f0bbf2a46827d87f12b0d2 Gitweb: https://git.kernel.org/tip/53172f9057e92c9b27f0bbf2a46827d87f12b0d2 Author: Kan Liang <[email protected]> AuthorDate: Thu, 1 Mar 2018 18:08:58 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 10:41:36 -0300
perf kvm: Switch to new perf_mmap__read_event() interface
The perf kvm still use the legacy interface.
Switch to the new perf_mmap__read_event() interface for perf kvm.
No functional change.
Committer notes:
Tested before and after running:
# perf kvm stat record
On a machine with a kvm guest, then used:
# perf kvm stat report
Before/after results match and look like:
# perf kvm stat record -a sleep 5 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 2.132 MB perf.data.guest (1828 samples) ] # perf kvm stat report
Analyze events for all VMs, all VCPUs:
VM-EXIT Samples Samples% Time% Min Time Max Time Avg time
IO_INSTRUCTION 258 40.06% 0.08% 3.51us 122.54us 14.87us (+- 6.76%)
MSR_WRITE 178 27.64% 0.01% 0.47us 6.34us 2.18us (+- 4.80%)
EPT_MISCONFIG 148 22.98% 0.03% 3.76us 65.60us 11.22us (+- 8.14%)
HLT 47 7.30% 99.88% 181.69us 249988.06us 102061.36us (+-13.49%)
PAUSE_INSTRUCTION 5 0.78% 0.00% 0.38us 0.79us 0.47us (+-17.05%)
MSR_READ 4 0.62% 0.00% 1.14us 3.33us 2.67us (+-19.35%)
EXTERNAL_INTERRUPT 2 0.31% 0.00% 2.15us 2.17us 2.16us (+- 0.30%)
PENDING_INTERRUPT 1 0.16% 0.00% 2.56us 2.56us 2.56us (+- 0.00%)
PREEMPTION_TIMER 1 0.16% 0.00% 3.21us 3.21us 3.21us (+- 0.00%)Total Samples:644, Total events handled time:4802790.72us.
#
--- tools/perf/builtin-kvm.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
tools/perf/builtin-kvm.c +13 -4
@@ -743,16 +743,24 @@ static bool verify_vcpu(int vcpu)static s64 perf_kvm__mmap_read_idx (struct perf_kvm_stat *kvm,int idx,u64 *mmap_time) { +struct perf_evlist *evlist = kvm->evlist;union perf_event *event; +struct perf_mmap *md; +u64 end, start;u64 timestamp;s64 n =0 ;int err; *mmap_time =ULLONG_MAX ; -while ((event =perf_evlist__mmap_read (kvm->evlist, idx)) !=NULL ) { - err =perf_evlist__parse_sample_timestamp (kvm->evlist, event, ×tamp); + md = &evlist->mmap[idx]; + err =perf_mmap__read_init (md, false, &start, &end); +if (err <0 ) +return (err == -EAGAIN ) ?0 :-1 ; + +while ((event =perf_mmap__read_event (md, false, &start, end)) !=NULL ) { + err =perf_evlist__parse_sample_timestamp (evlist, event, ×tamp);if (err) { -perf_evlist__mmap_consume (kvm->evlist, idx); +perf_mmap__consume (md, false);pr_err ("Failed to parse sample\n" );return -1 ; }
@@ -762,7 +770,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,* FIXME: Here we can't consume the event, as perf_session__queue_event will * point to it, and it'll get possibly overwritten by the kernel. */ -perf_evlist__mmap_consume (kvm->evlist, idx); +perf_mmap__consume (md, false);if (err) {pr_err ("Failed to enqueue sample: %d\n" , err);
@@ -779,6 +787,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,break ; } +perf_mmap__read_done (md);return n; }