Re: [PATCH 3/5] perf_counter: rework ioctl()s

From: Corey Ashford
Date: Tue May 12 2009 - 12:17:26 EST


Paul Mackerras wrote:
Corey Ashford writes:

I was seeing that on Power5. On 5/6/2009, I sent along a test case that was supposed to duplicate the sequence of operations, without using PAPI, to Peter Zijlstra, cc'ing you. However, I was unable to get any signals delivered to user space with that code, so I was unable to reproduce the problem outside of the PAPI test case. I don't know why signal delivery doesn't work with that test case... I spent quite a lot of time verifying that it was doing the right thing, but could never get it to work.

I tried your test program out today, with the ioctl calls changed to
add an extra 0 argument, like this:

ioctl(fd[0], PERF_COUNTER_IOC_ENABLE, 0);

and similarly for the disable call. It all seemed to be fine. There
is still a little problem with enabling counters - it doesn't happen
right away. I have a patch to fix that, which I'll send out, and with
that patch I get:

# ./test_group_disable evt[0].config = 0
evt[1].config = 4
group_leader = -1
evt[i].wakeup_events = 0
successfully opened evt[0]. fd[0] = 3
group_leader = 3
evt[i].wakeup_events = 0
successfully opened evt[1]. fd[1] = 4
successfully attached signal handler
fd 3's mmap buffer is located at 0xfffab4b3000
successfully tuned up fd 3
fd 4's mmap buffer is located at 0xfffab4aa000
successfully tuned up fd 4
enable was successful
CYCLES: 20904
BRANCHES: 2413
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 4
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 4
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 4
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
signal received while counters are enabled. fd = 3
disable was successful
CYCLES: 180149676
BRANCHES: 30030826
CYCLES: 180149676
BRANCHES: 30030826
CYCLES data_head: 141b0
BRANCHES data_head: 35a0
#

So clearly it is getting signals when the leader is enabled, one per
page of events, and not when the leader is disabled. I notice you
have evt[].wakeup_events set to 0, which is presumably why we don't
get more signals than we do.

Interesting. Thanks for finding that ioctl error! That really had me stumped.

Another hypothesis is that the old PAPI code would open, mmap, close, then reopen, and mmap again. I wonder if because I wasn't munmap'ing before the close, that I got some strange behavior from the kernel. I'll try that today with that test case.

Thanks!

- Corey


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/