提交 a5b518ed 编写于 作者: P Paul Mackerras

ppc64/powerpc: Fix time initialization on SMP systems

This moves smp_space_timers from arch/ppc64/kernel/smp.c to
arch/powerpc/kernel/time.c and makes it initialize last_jiffy[]
instead of paca[].next_jiffy_update_tb, since last_jiffy[] is
now what the time code uses.  It also declares smp_space_timers
in include/asm-powerpc/time.h and gets rid of an ifdef in
div128_by_32.
Signed-off-by: NPaul Mackerras <paulus@samba.org>
上级 e2b55306
...@@ -458,7 +458,7 @@ void wakeup_decrementer(void) ...@@ -458,7 +458,7 @@ void wakeup_decrementer(void)
per_cpu(last_jiffy, i) = tb_last_stamp; per_cpu(last_jiffy, i) = tb_last_stamp;
} }
#ifdef CONFIG_SMPxxx #ifdef CONFIG_SMP
void __init smp_space_timers(unsigned int max_cpus) void __init smp_space_timers(unsigned int max_cpus)
{ {
int i; int i;
...@@ -948,16 +948,6 @@ void div128_by_32(u64 dividend_high, u64 dividend_low, ...@@ -948,16 +948,6 @@ void div128_by_32(u64 dividend_high, u64 dividend_low,
w = a / divisor; w = a / divisor;
ra = ((u64)(a - (w * divisor)) << 32) + b; ra = ((u64)(a - (w * divisor)) << 32) + b;
#ifdef CONFIG_PPC64
x = ra / divisor;
rb = ((ra - (x * divisor)) << 32) + c;
y = rb / divisor;
rc = ((rb - (y * divisor)) << 32) + d;
z = rc / divisor;
#else
/* for 32-bit, use do_div from div64.h */
rb = ((u64) do_div(ra, divisor) << 32) + c; rb = ((u64) do_div(ra, divisor) << 32) + c;
x = ra; x = ra;
...@@ -966,10 +956,8 @@ void div128_by_32(u64 dividend_high, u64 dividend_low, ...@@ -966,10 +956,8 @@ void div128_by_32(u64 dividend_high, u64 dividend_low,
do_div(rc, divisor); do_div(rc, divisor);
z = rc; z = rc;
#endif
dr->result_high = ((u64)w << 32) + x; dr->result_high = ((u64)w << 32) + x;
dr->result_low = ((u64)y << 32) + z; dr->result_low = ((u64)y << 32) + z;
} }
...@@ -105,21 +105,6 @@ void __devinit smp_generic_kick_cpu(int nr) ...@@ -105,21 +105,6 @@ void __devinit smp_generic_kick_cpu(int nr)
#endif /* CONFIG_MPIC */ #endif /* CONFIG_MPIC */
static void __init smp_space_timers(unsigned int max_cpus)
{
int i;
unsigned long offset = tb_ticks_per_jiffy / max_cpus;
unsigned long previous_tb = paca[boot_cpuid].next_jiffy_update_tb;
for_each_cpu(i) {
if (i != boot_cpuid) {
paca[i].next_jiffy_update_tb =
previous_tb + offset;
previous_tb = paca[i].next_jiffy_update_tb;
}
}
}
void smp_message_recv(int msg, struct pt_regs *regs) void smp_message_recv(int msg, struct pt_regs *regs)
{ {
switch(msg) { switch(msg) {
......
...@@ -196,9 +196,11 @@ static inline unsigned long tb_ticks_since(unsigned long tstamp) ...@@ -196,9 +196,11 @@ static inline unsigned long tb_ticks_since(unsigned long tstamp)
extern u64 mulhdu(u64, u64); extern u64 mulhdu(u64, u64);
#endif #endif
unsigned mulhwu_scale_factor(unsigned, unsigned); extern void smp_space_timers(unsigned int);
void div128_by_32(u64 dividend_high, u64 dividend_low,
unsigned divisor, struct div_result *dr); extern unsigned mulhwu_scale_factor(unsigned, unsigned);
extern void div128_by_32(u64 dividend_high, u64 dividend_low,
unsigned divisor, struct div_result *dr);
/* Used to store Processor Utilization register (purr) values */ /* Used to store Processor Utilization register (purr) values */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册