diff options
Diffstat (limited to 'arch/sparc/kernel/smp_64.c')
| -rw-r--r-- | arch/sparc/kernel/smp_64.c | 36 | 
1 files changed, 15 insertions, 21 deletions
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index e142545244f..41aa2478f3c 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -25,6 +25,7 @@  #include <linux/ftrace.h>  #include <linux/cpu.h>  #include <linux/slab.h> +#include <linux/kgdb.h>  #include <asm/head.h>  #include <asm/ptrace.h> @@ -35,6 +36,7 @@  #include <asm/hvtramp.h>  #include <asm/io.h>  #include <asm/timer.h> +#include <asm/setup.h>  #include <asm/irq.h>  #include <asm/irq_regs.h> @@ -52,8 +54,7 @@  #include <asm/pcr.h>  #include "cpumap.h" - -int sparc64_multi_core __read_mostly; +#include "kernel.h"  DEFINE_PER_CPU(cpumask_t, cpu_sibling_map) = CPU_MASK_NONE;  cpumask_t cpu_core_map[NR_CPUS] __read_mostly = @@ -123,11 +124,12 @@ void smp_callin(void)  		rmb();  	set_cpu_online(cpuid, true); -	local_irq_enable();  	/* idle thread is expected to have preempt disabled */  	preempt_disable(); +	local_irq_enable(); +  	cpu_startup_entry(CPUHP_ONLINE);  } @@ -150,7 +152,7 @@ void cpu_panic(void)  #define NUM_ROUNDS	64	/* magic value */  #define NUM_ITERS	5	/* likewise */ -static DEFINE_SPINLOCK(itc_sync_lock); +static DEFINE_RAW_SPINLOCK(itc_sync_lock);  static unsigned long go[SLAVE + 1];  #define DEBUG_TICK_SYNC	0 @@ -258,7 +260,7 @@ static void smp_synchronize_one_tick(int cpu)  	go[MASTER] = 0;  	membar_safe("#StoreLoad"); -	spin_lock_irqsave(&itc_sync_lock, flags); +	raw_spin_lock_irqsave(&itc_sync_lock, flags);  	{  		for (i = 0; i < NUM_ROUNDS*NUM_ITERS; i++) {  			while (!go[MASTER]) @@ -269,18 +271,10 @@ static void smp_synchronize_one_tick(int cpu)  			membar_safe("#StoreLoad");  		}  	} -	spin_unlock_irqrestore(&itc_sync_lock, flags); +	raw_spin_unlock_irqrestore(&itc_sync_lock, flags);  }  #if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU) -/* XXX Put this in some common place. XXX */ -static unsigned long kimage_addr_to_ra(void *p) -{ -	unsigned long val = (unsigned long) p; - -	return kern_base + (val - KERNBASE); -} -  static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg,  				void **descrp)  { @@ -868,11 +862,6 @@ extern unsigned long xcall_flush_dcache_page_cheetah;  #endif  extern unsigned long xcall_flush_dcache_page_spitfire; -#ifdef CONFIG_DEBUG_DCFLUSH -extern atomic_t dcpage_flushes; -extern atomic_t dcpage_flushes_xcall; -#endif -  static inline void __local_flush_dcache_page(struct page *page)  {  #ifdef DCACHE_ALIASING_POSSIBLE @@ -1399,8 +1388,13 @@ void __init smp_cpus_done(unsigned int max_cpus)  void smp_send_reschedule(int cpu)  { -	xcall_deliver((u64) &xcall_receive_signal, 0, 0, -		      cpumask_of(cpu)); +	if (cpu == smp_processor_id()) { +		WARN_ON_ONCE(preemptible()); +		set_softint(1 << PIL_SMP_RECEIVE_SIGNAL); +	} else { +		xcall_deliver((u64) &xcall_receive_signal, +			      0, 0, cpumask_of(cpu)); +	}  }  void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)  | 
