Prev: [tip:x86/urgent] x86, k8: Fix build error when K8_NB is disabled
Next: usb: gadget: g_mass_storage: static data instead of dynamic allocation
From: Cyrill Gorcunov on 14 May 2010 15:10 Jaswinder reported GP: | | Message from syslogd(a)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(a)gmail.com> Reported-by: Lin Ming <ming.m.lin(a)intel.com> Bisected-by: Lin Ming <ming.m.lin(a)intel.com> Tested-by: Jaswinder Singh Rajput <jaswinderlinux(a)gmail.com> CC: Peter Zijlstra <a.p.zijlstra(a)chello.nl> CC: Ingo Molnar <mingo(a)elte.hu> CC: Frederic Weisbecker <fweisbec(a)gmail.com> Signed-off-by: Cyrill Gorcunov <gorcunov(a)openvz.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(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |