diff options
author | David S. Miller <davem@davemloft.net> | 2009-09-10 08:59:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-10 08:59:24 -0400 |
commit | 5686f9c3d67d5a20108fa26105c98b042df13123 (patch) | |
tree | cac519fa1a6e8cdcd90787753352b8930d2cfaab | |
parent | 2d0740c4562493b60f59ca9b0330a2d5e01d43ec (diff) |
sparc64: Implement a real set_perf_counter_pending().
When the perf counter subsystem needs to reschedule work out
from an NMI, it invokes set_perf_counter_pending().
This triggers a non-NMI irq which should invoke
perf_counter_do_pending().
Currently this won't trigger because sparc64 won't trigger
the perf counter subsystem from NMIs, but when the HW counter
support is added it will.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc/include/asm/perf_counter.h | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/pcr.c | 14 |
2 files changed, 14 insertions, 2 deletions
diff --git a/arch/sparc/include/asm/perf_counter.h b/arch/sparc/include/asm/perf_counter.h index f07c587a8304..38d644546435 100644 --- a/arch/sparc/include/asm/perf_counter.h +++ b/arch/sparc/include/asm/perf_counter.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef __ASM_SPARC_PERF_COUNTER_H | 1 | #ifndef __ASM_SPARC_PERF_COUNTER_H |
2 | #define __ASM_SPARC_PERF_COUNTER_H | 2 | #define __ASM_SPARC_PERF_COUNTER_H |
3 | 3 | ||
4 | static inline void set_perf_counter_pending(void) { } | 4 | extern void set_perf_counter_pending(void); |
5 | 5 | ||
6 | #define PERF_COUNTER_INDEX_OFFSET 0 | 6 | #define PERF_COUNTER_INDEX_OFFSET 0 |
7 | 7 | ||
diff --git a/arch/sparc/kernel/pcr.c b/arch/sparc/kernel/pcr.c index 1ae8cdd7e703..68ff00107073 100644 --- a/arch/sparc/kernel/pcr.c +++ b/arch/sparc/kernel/pcr.c | |||
@@ -7,6 +7,8 @@ | |||
7 | #include <linux/init.h> | 7 | #include <linux/init.h> |
8 | #include <linux/irq.h> | 8 | #include <linux/irq.h> |
9 | 9 | ||
10 | #include <linux/perf_counter.h> | ||
11 | |||
10 | #include <asm/pil.h> | 12 | #include <asm/pil.h> |
11 | #include <asm/pcr.h> | 13 | #include <asm/pcr.h> |
12 | #include <asm/nmi.h> | 14 | #include <asm/nmi.h> |
@@ -34,10 +36,20 @@ unsigned int picl_shift; | |||
34 | */ | 36 | */ |
35 | void deferred_pcr_work_irq(int irq, struct pt_regs *regs) | 37 | void deferred_pcr_work_irq(int irq, struct pt_regs *regs) |
36 | { | 38 | { |
39 | struct pt_regs *old_regs; | ||
40 | |||
37 | clear_softint(1 << PIL_DEFERRED_PCR_WORK); | 41 | clear_softint(1 << PIL_DEFERRED_PCR_WORK); |
42 | |||
43 | old_regs = set_irq_regs(regs); | ||
44 | irq_enter(); | ||
45 | #ifdef CONFIG_PERF_COUNTERS | ||
46 | perf_counter_do_pending(); | ||
47 | #endif | ||
48 | irq_exit(); | ||
49 | set_irq_regs(old_regs); | ||
38 | } | 50 | } |
39 | 51 | ||
40 | void schedule_deferred_pcr_work(void) | 52 | void set_perf_counter_pending(void) |
41 | { | 53 | { |
42 | set_softint(1 << PIL_DEFERRED_PCR_WORK); | 54 | set_softint(1 << PIL_DEFERRED_PCR_WORK); |
43 | } | 55 | } |