aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64/kernel/process.c')
-rw-r--r--arch/sparc64/kernel/process.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
index 2f89206e008f..02f9dec1d459 100644
--- a/arch/sparc64/kernel/process.c
+++ b/arch/sparc64/kernel/process.c
@@ -85,23 +85,31 @@ void cpu_idle(void)
85 85
86/* 86/*
87 * the idle loop on a UltraMultiPenguin... 87 * the idle loop on a UltraMultiPenguin...
88 *
89 * TIF_POLLING_NRFLAG is set because we do not sleep the cpu
90 * inside of the idler task, so an interrupt is not needed
91 * to get a clean fast response.
92 *
93 * XXX Reverify this assumption... -DaveM
94 *
95 * Addendum: We do want it to do something for the signal
96 * delivery case, we detect that by just seeing
97 * if we are trying to send this to an idler or not.
88 */ 98 */
89#define idle_me_harder() (cpu_data(smp_processor_id()).idle_volume += 1)
90#define unidle_me() (cpu_data(smp_processor_id()).idle_volume = 0)
91void cpu_idle(void) 99void cpu_idle(void)
92{ 100{
101 cpuinfo_sparc *cpuinfo = &local_cpu_data();
93 set_thread_flag(TIF_POLLING_NRFLAG); 102 set_thread_flag(TIF_POLLING_NRFLAG);
103
94 while(1) { 104 while(1) {
95 if (need_resched()) { 105 if (need_resched()) {
96 unidle_me(); 106 cpuinfo->idle_volume = 0;
97 clear_thread_flag(TIF_POLLING_NRFLAG);
98 preempt_enable_no_resched(); 107 preempt_enable_no_resched();
99 schedule(); 108 schedule();
100 preempt_disable(); 109 preempt_disable();
101 set_thread_flag(TIF_POLLING_NRFLAG);
102 check_pgt_cache(); 110 check_pgt_cache();
103 } 111 }
104 idle_me_harder(); 112 cpuinfo->idle_volume++;
105 113
106 /* The store ordering is so that IRQ handlers on 114 /* The store ordering is so that IRQ handlers on
107 * other cpus see our increasing idleness for the buddy 115 * other cpus see our increasing idleness for the buddy