Messages in this thread Patch in this message | | | Subject | Re: 'perf test backward' failing with older kernels, should Skip | From | "Wangnan (F)" <> | Date | Fri, 1 Jul 2016 09:53:56 +0800 |
| |
On 2016/7/1 5:00, Arnaldo Carvalho de Melo wrote: > Hi Wang, > > I booted a machine with the f24 distro kernel and the backward > ring buffer test started FAILing, when it should've noticed that the > kernel doesn't support it and Skip instead: > > [root@jouet ~]# perf test -v backward > 45: Test backward reading from ring buffer : > --- start --- > <SNIP> > mmap size 1052672B > Unexpected counter: sample_count=0, comm_count=0 > ---- end ---- > Test backward reading from ring buffer: FAILED! > [root@jouet ~]# >
I didn't test it on old kernel, but I tested it by forcing sys_perf_event_open return -EINVAL when attr->backward is true by following patch:
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 1d8f2bb..3e91c63 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1418,6 +1418,9 @@ retry_open: pr_debug2("sys_perf_event_open: pid %d cpu %d group_fd %d flags %#lx\n", pid, cpus->map[cpu], group_fd, flags);
+ if (evsel->attr.write_backward) + FD(evsel, cpu, thread) = -EINVAL; + else FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, pid, cpus->map[cpu],
'perf test' skips this test. Let me switch to an old kernel and try again...
Oops... It does FAILED...
Seems the code I use to emulate old kernel is wrong. I should set errno to EINVAL and make FD(...) = -1.
I agree with your patch. Thank you for pointing it out.
> Ok, so I think the patch below should do the trick, is that right? With it > I get: > > [root@jouet ~]# perf test backward > 45: Test backward reading from ring buffer : Skip > [root@jouet ~]# > > diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/backward-ring-buffer.c > index e70313fac5a5..0731b0bf9552 100644 > --- a/tools/perf/tests/backward-ring-buffer.c > +++ b/tools/perf/tests/backward-ring-buffer.c > @@ -118,8 +118,10 @@ int test__backward_ring_buffer(int subtest __maybe_unused) > perf_evlist__config(evlist, &opts, NULL); > > /* Set backward bit, ring buffer should be writing from end */ > - evlist__for_each_entry(evlist, evsel) > + evlist__for_each_entry(evlist, evsel) { > + evsel->overwrite = true; > evsel->attr.write_backward = 1; > + } > > err = perf_evlist__open(evlist); > if (err < 0) {
| |