Call init_idle() which (re-)initializes the idle task structure before
it gets used on a new cpu.
That way we can also get rid of the odd preempt_enable_no_resched()
call we have in the cpu offline path within cpu_idle(). That call
prevented preempt count imbalances between cpu hotplug operations.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
 
 extern int __cpu_disable (void);
 extern void __cpu_die (unsigned int cpu);
-extern void cpu_die (void) __attribute__ ((noreturn));
 extern int __cpu_up (unsigned int cpu);
 
 extern struct mutex smp_cpu_state_mutex;
 
 #ifdef CONFIG_HOTPLUG_CPU
 extern int smp_rescan_cpus(void);
+extern void __noreturn cpu_die(void);
 #else
 static inline int smp_rescan_cpus(void) { return 0; }
+static inline void cpu_die(void) { }
 #endif
 
 #endif /* __ASM_SMP_H */
 
 #include <asm/irq.h>
 #include <asm/timer.h>
 #include <asm/nmi.h>
+#include <asm/smp.h>
 #include "entry.h"
 
 asmlinkage void ret_from_fork(void) asm ("ret_from_fork");
  */
 static void default_idle(void)
 {
-       /* CPU is going idle. */
-#ifdef CONFIG_HOTPLUG_CPU
-       if (cpu_is_offline(smp_processor_id())) {
-               preempt_enable_no_resched();
+       if (cpu_is_offline(smp_processor_id()))
                cpu_die();
-       }
-#endif
        local_irq_disable();
        if (need_resched()) {
                local_irq_enable();
 
                idle = c_idle.idle;
                current_set[cpu] = c_idle.idle;
        }
+       init_idle(idle, cpu);
        if (smp_alloc_lowcore(cpu))
                return -ENOMEM;
        do {