|
@@ -209,41 +209,13 @@ do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)
|
|
|
local_irq_disable(); /* force interrupt disable */
|
|
|
}
|
|
|
|
|
|
-static int pal_halt = 1;
|
|
|
-static int can_do_pal_halt = 1;
|
|
|
-
|
|
|
static int __init nohalt_setup(char * str)
|
|
|
{
|
|
|
- pal_halt = can_do_pal_halt = 0;
|
|
|
+ cpu_idle_poll_ctrl(true);
|
|
|
return 1;
|
|
|
}
|
|
|
__setup("nohalt", nohalt_setup);
|
|
|
|
|
|
-void
|
|
|
-update_pal_halt_status(int status)
|
|
|
-{
|
|
|
- can_do_pal_halt = pal_halt && status;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * We use this if we don't have any better idle routine..
|
|
|
- */
|
|
|
-void
|
|
|
-default_idle (void)
|
|
|
-{
|
|
|
- local_irq_enable();
|
|
|
- while (!need_resched()) {
|
|
|
- if (can_do_pal_halt) {
|
|
|
- local_irq_disable();
|
|
|
- if (!need_resched()) {
|
|
|
- safe_halt();
|
|
|
- }
|
|
|
- local_irq_enable();
|
|
|
- } else
|
|
|
- cpu_relax();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
/* We don't actually take CPU down, just spin without interrupts. */
|
|
|
static inline void play_dead(void)
|
|
@@ -270,47 +242,29 @@ static inline void play_dead(void)
|
|
|
}
|
|
|
#endif /* CONFIG_HOTPLUG_CPU */
|
|
|
|
|
|
-void __attribute__((noreturn))
|
|
|
-cpu_idle (void)
|
|
|
+void arch_cpu_idle_dead(void)
|
|
|
+{
|
|
|
+ play_dead();
|
|
|
+}
|
|
|
+
|
|
|
+void arch_cpu_idle(void)
|
|
|
{
|
|
|
void (*mark_idle)(int) = ia64_mark_idle;
|
|
|
- int cpu = smp_processor_id();
|
|
|
-
|
|
|
- /* endless idle loop with no priority at all */
|
|
|
- while (1) {
|
|
|
- rcu_idle_enter();
|
|
|
- if (can_do_pal_halt) {
|
|
|
- current_thread_info()->status &= ~TS_POLLING;
|
|
|
- /*
|
|
|
- * TS_POLLING-cleared state must be visible before we
|
|
|
- * test NEED_RESCHED:
|
|
|
- */
|
|
|
- smp_mb();
|
|
|
- } else {
|
|
|
- current_thread_info()->status |= TS_POLLING;
|
|
|
- }
|
|
|
|
|
|
- if (!need_resched()) {
|
|
|
#ifdef CONFIG_SMP
|
|
|
- min_xtp();
|
|
|
+ min_xtp();
|
|
|
#endif
|
|
|
- rmb();
|
|
|
- if (mark_idle)
|
|
|
- (*mark_idle)(1);
|
|
|
+ rmb();
|
|
|
+ if (mark_idle)
|
|
|
+ (*mark_idle)(1);
|
|
|
+
|
|
|
+ safe_halt();
|
|
|
|
|
|
- default_idle();
|
|
|
- if (mark_idle)
|
|
|
- (*mark_idle)(0);
|
|
|
+ if (mark_idle)
|
|
|
+ (*mark_idle)(0);
|
|
|
#ifdef CONFIG_SMP
|
|
|
- normal_xtp();
|
|
|
+ normal_xtp();
|
|
|
#endif
|
|
|
- }
|
|
|
- rcu_idle_exit();
|
|
|
- schedule_preempt_disabled();
|
|
|
- check_pgt_cache();
|
|
|
- if (cpu_is_offline(cpu))
|
|
|
- play_dead();
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
void
|