Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 205393
b: refs/heads/master
c: 10f9014
h: refs/heads/master
i:
  205391: 9269a48
v: v3
  • Loading branch information
Don Zickus authored and Frederic Weisbecker committed May 12, 2010
1 parent 70bdfaf commit 3f718c4
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 59 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7cbb7e7fa46f6e5229438ac9e4a5c72ec0d53e0b
refs/heads/master: 10f9014912a2b1cb59c39cdea777e6d9afa8f17e
58 changes: 0 additions & 58 deletions trunk/arch/x86/kernel/apic/hw_nmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,74 +9,16 @@
*
*/

#include <asm/apic.h>
#include <linux/smp.h>
#include <linux/cpumask.h>
#include <linux/sched.h>
#include <linux/percpu.h>
#include <linux/cpumask.h>
#include <linux/kernel_stat.h>
#include <asm/mce.h>
#include <linux/kdebug.h>
#include <linux/notifier.h>
#include <linux/kprobes.h>


#include <linux/nmi.h>
#include <linux/module.h>

/* For reliability, we're prepared to waste bits here. */
static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly;

static DEFINE_PER_CPU(unsigned, last_irq_sum);

/*
* Take the local apic timer and PIT/HPET into account. We don't
* know which one is active, when we have highres/dyntick on
*/
static inline unsigned int get_timer_irqs(int cpu)
{
unsigned int irqs = per_cpu(irq_stat, cpu).irq0_irqs;

#if defined(CONFIG_X86_LOCAL_APIC)
irqs += per_cpu(irq_stat, cpu).apic_timer_irqs;
#endif

return irqs;
}

static inline int mce_in_progress(void)
{
#if defined(CONFIG_X86_MCE)
return atomic_read(&mce_entry) > 0;
#endif
return 0;
}

int hw_nmi_is_cpu_stuck(struct pt_regs *regs)
{
unsigned int sum;
int cpu = smp_processor_id();

/* if we are doing an mce, just assume the cpu is not stuck */
/* Could check oops_in_progress here too, but it's safer not to */
if (mce_in_progress())
return 0;

/* We determine if the cpu is stuck by checking whether any
* interrupts have happened since we last checked. Of course
* an nmi storm could create false positives, but the higher
* level logic should account for that
*/
sum = get_timer_irqs(cpu);
if (__get_cpu_var(last_irq_sum) == sum) {
return 1;
} else {
__get_cpu_var(last_irq_sum) = sum;
return 0;
}
}

u64 hw_nmi_get_sample_period(void)
{
return (u64)(cpu_khz) * 1000 * 60;
Expand Down

0 comments on commit 3f718c4

Please sign in to comment.