[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20100514190815.GG13509@lenovo>
Date: Fri, 14 May 2010 23:08:15 +0400
From: Cyrill Gorcunov <gorcunov@...il.com>
To: Ingo Molnar <mingo@...e.hu>, Lin Ming <ming.m.lin@...el.com>,
Jaswinder Singh Rajput <jaswinderlinux@...il.com>
Cc: Peter Zijlstra <a.p.zijlstra@...llo.nl>,
Frederic Weisbecker <fweisbec@...il.com>,
LKML <linux-kernel@...r.kernel.org>
Subject: [PATCH -tip/master] x86,perf: P4 PMU - fix counters management
logic
Jaswinder reported 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 comparision issue between arguments with
different sizes and signs. As result event index reached wrong value
which in turn led to GP fault.
Same time was found that p4_next_cntr has a broken logic and should
return counter index if only it was not yet borrowed for another event.
Reported-by: Jaswinder Singh Rajput <jaswinderlinux@...il.com>
Reported-by: Lin Ming <ming.m.lin@...el.com>
Bisected-by: Lin Ming <ming.m.lin@...el.com>
Tested-by: Jaswinder Singh Rajput <jaswinderlinux@...il.com>
CC: Peter Zijlstra <a.p.zijlstra@...llo.nl>
CC: Ingo Molnar <mingo@...e.hu>
CC: Frederic Weisbecker <fweisbec@...il.com>
Signed-off-by: Cyrill Gorcunov <gorcunov@...nvz.org>
---
Forgot to CC LKML in first place, sorry for message duplication.
arch/x86/kernel/cpu/perf_event_p4.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Index: linux-2.6.git/arch/x86/kernel/cpu/perf_event_p4.c
=====================================================================
--- linux-2.6.git.orig/arch/x86/kernel/cpu/perf_event_p4.c
+++ linux-2.6.git/arch/x86/kernel/cpu/perf_event_p4.c
@@ -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
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;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists