x86, perf: P4 PMU - fix counters management logic
Jaswinder reported this #GP: | | Message from syslogd@ht at May 14 09:39:32 ... | kernel:[ 314.908612] EIP: [<c100ccca>] | x86_perf_event_set_period+0x19d/0x1b2 SS:ESP 0068:edac3d70 | Ming has narrowed it down to a comparision issue between arguments with different sizes and signs. As result event index reached a wrong value which in turn led to a GP fault. At the same time it was found that p4_next_cntr has broken logic and should return the counter index only if it was not yet borrowed for another event. Reported-by: Jaswinder Singh Rajput <jaswinderlinux@gmail.com> Reported-by: Lin Ming <ming.m.lin@intel.com> Bisected-by: Lin Ming <ming.m.lin@intel.com> Tested-by: Jaswinder Singh Rajput <jaswinderlinux@gmail.com> Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> CC: Peter Zijlstra <a.p.zijlstra@chello.nl> CC: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <20100514190815.GG13509@lenovo> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
5d2be7cb19
commit
1ff3d7d792
1 changed files with 4 additions and 4 deletions
|
@ -18,7 +18,7 @@
|
|||
struct p4_event_bind {
|
||||
unsigned int opcode; /* Event code and ESCR selector */
|
||||
unsigned int escr_msr[2]; /* ESCR MSR for this event */
|
||||
unsigned char cntr[2][P4_CNTR_LIMIT]; /* counter index (offset), -1 on abscence */
|
||||
char cntr[2][P4_CNTR_LIMIT]; /* counter index (offset), -1 on abscence */
|
||||
};
|
||||
|
||||
struct p4_cache_event_bind {
|
||||
|
@ -747,11 +747,11 @@ static int p4_get_escr_idx(unsigned int addr)
|
|||
static int p4_next_cntr(int thread, unsigned long *used_mask,
|
||||
struct p4_event_bind *bind)
|
||||
{
|
||||
int i = 0, j;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < P4_CNTR_LIMIT; i++) {
|
||||
j = bind->cntr[thread][i++];
|
||||
if (j == -1 || !test_bit(j, used_mask))
|
||||
j = bind->cntr[thread][i];
|
||||
if (j != -1 && !test_bit(j, used_mask))
|
||||
return j;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue