git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
arch
/
sh
/
kernel
/
smp.c
diff --git
a/arch/sh/kernel/smp.c
b/arch/sh/kernel/smp.c
index
97ed434
..
dbebadd
100644
(file)
--- a/
arch/sh/kernel/smp.c
+++ b/
arch/sh/kernel/smp.c
@@
-10,7
+10,6
@@
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
-#include <linux/config.h>
#include <linux/cache.h>
#include <linux/cpumask.h>
#include <linux/delay.h>
#include <linux/cache.h>
#include <linux/cpumask.h>
#include <linux/delay.h>
@@
-22,11
+21,11
@@
#include <linux/time.h>
#include <linux/timex.h>
#include <linux/sched.h>
#include <linux/time.h>
#include <linux/timex.h>
#include <linux/sched.h>
+#include <linux/module.h>
#include <asm/atomic.h>
#include <asm/processor.h>
#include <asm/system.h>
#include <asm/atomic.h>
#include <asm/processor.h>
#include <asm/system.h>
-#include <asm/hardirq.h>
#include <asm/mmu_context.h>
#include <asm/smp.h>
#include <asm/mmu_context.h>
#include <asm/smp.h>
@@
-35,15
+34,15
@@
* but is designed to be usable regardless if there's an MMU
* present or not.
*/
* but is designed to be usable regardless if there's an MMU
* present or not.
*/
-int smp_threads_ready = 0;
struct sh_cpuinfo cpu_data[NR_CPUS];
struct sh_cpuinfo cpu_data[NR_CPUS];
-extern int cpu_idle(void *unused);
extern void per_cpu_trap_init(void);
cpumask_t cpu_possible_map;
extern void per_cpu_trap_init(void);
cpumask_t cpu_possible_map;
+EXPORT_SYMBOL(cpu_possible_map);
+
cpumask_t cpu_online_map;
cpumask_t cpu_online_map;
-
unsigned long cache_decay_ticks = HZ / 100
;
+
EXPORT_SYMBOL(cpu_online_map)
;
static atomic_t cpus_booted = ATOMIC_INIT(0);
/* These are defined by the board-specific code. */
static atomic_t cpus_booted = ATOMIC_INIT(0);
/* These are defined by the board-specific code. */
@@
-98,20
+97,13
@@
void __devinit smp_prepare_boot_cpu(void)
int __cpu_up(unsigned int cpu)
{
struct task_struct *tsk;
int __cpu_up(unsigned int cpu)
{
struct task_struct *tsk;
- struct pt_regs regs;
- memset(®s, 0, sizeof(struct pt_regs));
- tsk = copy_process(CLONE_VM | CLONE_IDLETASK, 0, ®s, 0, 0, 0);
+ tsk = fork_idle(cpu);
if (IS_ERR(tsk))
panic("Failed forking idle task for cpu %d\n", cpu);
if (IS_ERR(tsk))
panic("Failed forking idle task for cpu %d\n", cpu);
- wake_up_forked_process(tsk);
-
- init_idle(tsk, cpu);
- unhash_process(tsk);
-
- tsk->thread_info->cpu = cpu;
+ task_thread_info(tsk)->cpu = cpu;
cpu_set(cpu, cpu_online_map);
cpu_set(cpu, cpu_online_map);
@@
-120,7
+112,9
@@
int __cpu_up(unsigned int cpu)
int start_secondary(void *unused)
{
int start_secondary(void *unused)
{
- unsigned int cpu = smp_processor_id();
+ unsigned int cpu;
+
+ cpu = smp_processor_id();
atomic_inc(&init_mm.mm_count);
current->active_mm = &init_mm;
atomic_inc(&init_mm.mm_count);
current->active_mm = &init_mm;
@@
-128,16
+122,17
@@
int start_secondary(void *unused)
smp_store_cpu_info(cpu);
__smp_slave_init(cpu);
smp_store_cpu_info(cpu);
__smp_slave_init(cpu);
+ preempt_disable();
per_cpu_trap_init();
atomic_inc(&cpus_booted);
per_cpu_trap_init();
atomic_inc(&cpus_booted);
- return cpu_idle(0);
+ cpu_idle();
+ return 0;
}
void __init smp_cpus_done(unsigned int max_cpus)
{
}
void __init smp_cpus_done(unsigned int max_cpus)
{
- smp_threads_ready = 1;
smp_mb();
}
smp_mb();
}
@@
-181,6
+176,9
@@
int smp_call_function(void (*func)(void *info), void *info, int retry, int wait)
if (nr_cpus < 2)
return 0;
if (nr_cpus < 2)
return 0;
+ /* Can deadlock when called with interrupts disabled */
+ WARN_ON(irqs_disabled());
+
spin_lock(&smp_fn_call.lock);
atomic_set(&smp_fn_call.finished, 0);
spin_lock(&smp_fn_call.lock);
atomic_set(&smp_fn_call.finished, 0);