Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 305490
b: refs/heads/master
c: 5d2b86d
h: refs/heads/master
v: v3
  • Loading branch information
Don Zickus authored and Ingo Molnar committed May 14, 2012
1 parent 4d7ac54 commit 18665d1
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 58 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: 144d102b926f887d3d9f909b69a5c4f504ae0d40
refs/heads/master: 5d2b86d90f7cc4a41316cef3d41560da6141f45c
59 changes: 2 additions & 57 deletions trunk/arch/x86/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include <asm/mmu_context.h>
#include <asm/proto.h>
#include <asm/apic.h>
#include <asm/nmi.h>
/*
* Some notes on x86 processor bugs affecting SMP operation:
*
Expand Down Expand Up @@ -149,60 +148,6 @@ void native_send_call_func_ipi(const struct cpumask *mask)
free_cpumask_var(allbutself);
}

static atomic_t stopping_cpu = ATOMIC_INIT(-1);

static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs)
{
/* We are registered on stopping cpu too, avoid spurious NMI */
if (raw_smp_processor_id() == atomic_read(&stopping_cpu))
return NMI_HANDLED;

stop_this_cpu(NULL);

return NMI_HANDLED;
}

static void native_nmi_stop_other_cpus(int wait)
{
unsigned long flags;
unsigned long timeout;

if (reboot_force)
return;

/*
* Use an own vector here because smp_call_function
* does lots of things not suitable in a panic situation.
*/
if (num_online_cpus() > 1) {
/* did someone beat us here? */
if (atomic_cmpxchg(&stopping_cpu, -1, safe_smp_processor_id()) != -1)
return;

if (register_nmi_handler(NMI_LOCAL, smp_stop_nmi_callback,
NMI_FLAG_FIRST, "smp_stop"))
/* Note: we ignore failures here */
return;

/* sync above data before sending NMI */
wmb();

apic->send_IPI_allbutself(NMI_VECTOR);

/*
* Don't wait longer than a second if the caller
* didn't ask us to wait.
*/
timeout = USEC_PER_SEC;
while (num_online_cpus() > 1 && (wait || timeout--))
udelay(1);
}

local_irq_save(flags);
disable_local_APIC();
local_irq_restore(flags);
}

/*
* this function calls the 'stop' function on all other CPUs in the system.
*/
Expand All @@ -215,7 +160,7 @@ asmlinkage void smp_reboot_interrupt(void)
irq_exit();
}

static void native_irq_stop_other_cpus(int wait)
static void native_stop_other_cpus(int wait)
{
unsigned long flags;
unsigned long timeout;
Expand Down Expand Up @@ -298,7 +243,7 @@ struct smp_ops smp_ops = {
.smp_prepare_cpus = native_smp_prepare_cpus,
.smp_cpus_done = native_smp_cpus_done,

.stop_other_cpus = native_nmi_stop_other_cpus,
.stop_other_cpus = native_stop_other_cpus,
.smp_send_reschedule = native_smp_send_reschedule,

.cpu_up = native_cpu_up,
Expand Down

0 comments on commit 18665d1

Please sign in to comment.