diff options
author | Anton Blanchard <anton@samba.org> | 2011-11-23 15:07:22 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-11-24 22:11:26 -0500 |
commit | 7df1027542c9353bef4d027cb4ab8e99f69017b7 (patch) | |
tree | 297c93c0937a05a66235f24fbab1c58e8dd93514 /arch/powerpc/kernel/irq.c | |
parent | 621692cb7efb6d0e38c62e41844a6360c6719b20 (diff) |
powerpc/time: Optimise decrementer_check_overflow
decrementer_check_overflow is called from arch_local_irq_restore so
we want to make it as light weight as possible. As such, turn
decrementer_check_overflow into an inline function.
To avoid a circular mess of includes, separate out the two components
of struct decrementer_clock and keep the struct clock_event_device
part local to time.c.
The fast path improves from:
arch_local_irq_restore
0: mflr r0
4: std r0,16(r1)
8: stdu r1,-112(r1)
c: stb r3,578(r13)
10: cmpdi cr7,r3,0
14: beq- cr7,24 <.arch_local_irq_restore+0x24>
...
24: addi r1,r1,112
28: ld r0,16(r1)
2c: mtlr r0
30: blr
to:
arch_local_irq_restore
0: std r30,-16(r1)
4: ld r30,0(r2)
8: stb r3,578(r13)
c: cmpdi cr7,r3,0
10: beq- cr7,6c <.arch_local_irq_restore+0x6c>
...
6c: ld r30,-16(r1)
70: blr
Unfortunately we still setup a local TOC (due to -mminimal-toc). Yet
another sign we should be moving to -mcmodel=medium.
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 745c1e7c10fd..2ff4f5e59620 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -115,6 +115,15 @@ static inline notrace void set_soft_enabled(unsigned long enable) | |||
115 | : : "r" (enable), "i" (offsetof(struct paca_struct, soft_enabled))); | 115 | : : "r" (enable), "i" (offsetof(struct paca_struct, soft_enabled))); |
116 | } | 116 | } |
117 | 117 | ||
118 | static inline notrace void decrementer_check_overflow(void) | ||
119 | { | ||
120 | u64 now = get_tb_or_rtc(); | ||
121 | u64 *next_tb = &__get_cpu_var(decrementers_next_tb); | ||
122 | |||
123 | if (now >= *next_tb) | ||
124 | set_dec(1); | ||
125 | } | ||
126 | |||
118 | notrace void arch_local_irq_restore(unsigned long en) | 127 | notrace void arch_local_irq_restore(unsigned long en) |
119 | { | 128 | { |
120 | /* | 129 | /* |