]> git.baikalelectronics.ru Git - kernel.git/commit
x86, perf, nmi: Disable perf if counters are not accessible
authorDon Zickus <dzickus@redhat.com>
Mon, 22 Nov 2010 21:55:23 +0000 (16:55 -0500)
committerIngo Molnar <mingo@elte.hu>
Fri, 26 Nov 2010 14:00:57 +0000 (15:00 +0100)
commit9cf18ec2488baf0932f81d50cb7d4f410412c985
treeca43baa684b371ee00cf93c5ee8268507bc7137c
parentb554f3e0cd921fe578314d5d9904e6ec894c209c
x86, perf, nmi: Disable perf if counters are not accessible

In a kvm virt guests, the perf counters are not emulated.  Instead they
return zero on a rdmsrl. The perf nmi handler uses the fact that crossing
a zero means the counter overflowed (for those counters that do not have
specific interrupt bits). Therefore on kvm guests, perf will swallow all
NMIs thinking the counters overflowed.

This causes problems for subsystems like kgdb which needs NMIs to do its
magic. This problem was discovered by running kgdb tests.

The solution is to write garbage into a perf counter during the
initialization and hopefully reading back the same number.  On kvm
guests, the value will be read back as zero and we disable perf as
a result.

Reported-by: Jason Wessel <jason.wessel@windriver.com>
Patch-inspired-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
LKML-Reference: <1290462923-30734-1-git-send-email-dzickus@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/cpu/perf_event.c