Browse Source

i386: do not BUG_ON() when MSR is unknown

Here is a small patch to change the behavior of the PMU msr allocator
to avoid BUG_ON() when the MSR is unknwon. Instead, it now returns
ok, which means "I do not manage". The current allocator is not
yet managing the full set of PMU registers (e.g., GLOBAL_* on Core 2).

[watchdog] do not BUG_ON() in the MSR allocator if MSR is unknown, return ok
instead

Signed-off-by: Stephane Eranian <eranian@hpl.hp.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Stephane Eranian 17 years ago
parent
commit
124d395fd0
1 changed files with 12 additions and 4 deletions
  1. 12 4
      arch/x86/kernel/cpu/perfctr-watchdog.c

+ 12 - 4
arch/x86/kernel/cpu/perfctr-watchdog.c

@@ -120,7 +120,9 @@ int reserve_perfctr_nmi(unsigned int msr)
 	unsigned int counter;
 	unsigned int counter;
 
 
 	counter = nmi_perfctr_msr_to_bit(msr);
 	counter = nmi_perfctr_msr_to_bit(msr);
-	BUG_ON(counter > NMI_MAX_COUNTER_BITS);
+	/* register not managed by the allocator? */
+	if (counter > NMI_MAX_COUNTER_BITS)
+		return 1;
 
 
 	if (!test_and_set_bit(counter, perfctr_nmi_owner))
 	if (!test_and_set_bit(counter, perfctr_nmi_owner))
 		return 1;
 		return 1;
@@ -132,7 +134,9 @@ void release_perfctr_nmi(unsigned int msr)
 	unsigned int counter;
 	unsigned int counter;
 
 
 	counter = nmi_perfctr_msr_to_bit(msr);
 	counter = nmi_perfctr_msr_to_bit(msr);
-	BUG_ON(counter > NMI_MAX_COUNTER_BITS);
+	/* register not managed by the allocator? */
+	if (counter > NMI_MAX_COUNTER_BITS)
+		return;
 
 
 	clear_bit(counter, perfctr_nmi_owner);
 	clear_bit(counter, perfctr_nmi_owner);
 }
 }
@@ -142,7 +146,9 @@ int reserve_evntsel_nmi(unsigned int msr)
 	unsigned int counter;
 	unsigned int counter;
 
 
 	counter = nmi_evntsel_msr_to_bit(msr);
 	counter = nmi_evntsel_msr_to_bit(msr);
-	BUG_ON(counter > NMI_MAX_COUNTER_BITS);
+	/* register not managed by the allocator? */
+	if (counter > NMI_MAX_COUNTER_BITS)
+		return 1;
 
 
 	if (!test_and_set_bit(counter, evntsel_nmi_owner))
 	if (!test_and_set_bit(counter, evntsel_nmi_owner))
 		return 1;
 		return 1;
@@ -154,7 +160,9 @@ void release_evntsel_nmi(unsigned int msr)
 	unsigned int counter;
 	unsigned int counter;
 
 
 	counter = nmi_evntsel_msr_to_bit(msr);
 	counter = nmi_evntsel_msr_to_bit(msr);
-	BUG_ON(counter > NMI_MAX_COUNTER_BITS);
+	/* register not managed by the allocator? */
+	if (counter > NMI_MAX_COUNTER_BITS)
+		return;
 
 
 	clear_bit(counter, evntsel_nmi_owner);
 	clear_bit(counter, evntsel_nmi_owner);
 }
 }