SMP/hotplug changes for v3.10
Subsystems (29)
Linus,
Please pull the latest smp-hotplug-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git smp-hotplug-for-linus
HEAD: d190e8195b90bc1e65c494fe08e54e9e581bfd16 idle: Remove GENERIC_IDLE_LOOP config switch
This is a pretty large, multi-arch series unifying and generalizing the various disjunct pieces of idle routines that architectures have historically copied from each other and have grown in random, wildly inconsistent and sometimes buggy directions:
101 files changed, 455 insertions(+), 1328 deletions(-)
this went through a number of review and test iterations before it was committed, it was tested on various architectures, was exposed to linux-next for quite some time - nevertheless it might cause problems on architectures that don't read the mailing lists and don't regularly test linux-next.
This cat herding excercise was motivated by the -rt kernel, and was brought to you by Thomas "the Whip" Gleixner.
Thanks,
Ingo
------------------>
Ingo Molnar (1):
bfin: Fix typo in arch_cpu_idle()
Paul Bolle (1):
idle: Remove unused ARCH_HAS_DEFAULT_IDLE
Richard Weinberger (1):
um: Use generic idle loop
Sam Ravnborg (1):
sparc: Use generic idle loop
Thomas Gleixner (35):
arch: Cleanup enable/disable_hlt
arch: Consolidate tsk_is_polling()
idle: Implement set/clr functions for need_resched poll
idle: Provide a generic entry point for the idle code
idle: Implement generic idle function
arc: Use generic idle loop
alpha: Use generic idle loop
arm: Use generic idle loop
arm64: Use generic idle loop
avr32: Use generic idle loop
bfin: Use generic idle loop
c6x: Use generic idle loop
cris: Use generic idle loop
frv: Use generic idle loop
h8300: Use generic idle loop
hexagon: Use generic idle loop
ia64: Use generic idle loop
m32r: Use generic idle loop
m68k: Use generic idle loop
metag: Use generic idle loop
microblaze: Use generic idle loop
mips: Use generic idle loop
mn10300: Use generic idle loop
openrisc: Use generic idle loop
parisc: Use generic idle loop
powerpc: Use generic idle loop
s390: Use generic idle loop
score: Use generic idle loop
sh: Use generic idle loop
tile: Enter idle with preemption disabled
tile: Use generic idle loop
unicore: Use generic idle loop
x86: Use generic idle loop
xtensa: Use generic idle loop
idle: Remove GENERIC_IDLE_LOOP config switch
Tony Luck (1):
ia64: Make sure interrupts enabled when we "safe_halt()"
arch/alpha/include/asm/thread_info.h | 2 - arch/alpha/kernel/process.c | 19 ------ arch/alpha/kernel/smp.c | 3 +- arch/arc/kernel/process.c | 27 +------- arch/arc/kernel/smp.c | 2 +- arch/arm/Kconfig | 1 + arch/arm/include/asm/system_misc.h | 3 - arch/arm/kernel/process.c | 100 ++++++++-------------------- arch/arm/kernel/smp.c | 2 +- arch/arm/mach-gemini/idle.c | 4 +- arch/arm/mach-gemini/irq.c | 4 +- arch/arm/mach-ixp4xx/common.c | 3 +- arch/arm/mach-omap1/pm.c | 6 +- arch/arm/mach-omap2/omap_hwmod.c | 7 +- arch/arm/mach-omap2/pm.c | 5 +- arch/arm/mach-orion5x/board-dt.c | 3 +- arch/arm/mach-orion5x/common.c | 2 +- arch/arm/mach-shark/core.c | 3 +- arch/arm/mach-shmobile/suspend.c | 6 +- arch/arm/mach-w90x900/dev.c | 3 +- arch/arm64/kernel/process.c | 43 ++---------- arch/arm64/kernel/smp.c | 2 +- arch/avr32/kernel/process.c | 13 +--- arch/avr32/kernel/time.c | 9 ++- arch/avr32/mach-at32ap/include/mach/pm.h | 24 ------- arch/avr32/mach-at32ap/pm-at32ap700x.S | 7 -- arch/blackfin/kernel/process.c | 32 ++------- arch/blackfin/mach-common/smp.c | 2 +- arch/c6x/kernel/process.c | 28 +------- arch/cris/arch-v10/kernel/process.c | 3 +- arch/cris/arch-v32/kernel/process.c | 12 +--- arch/cris/arch-v32/kernel/smp.c | 4 +- arch/cris/include/asm/processor.h | 7 -- arch/cris/kernel/process.c | 49 +------------- arch/frv/kernel/process.c | 27 ++------ arch/h8300/kernel/process.c | 35 ++-------- arch/hexagon/kernel/process.c | 23 +------ arch/hexagon/kernel/smp.c | 2 +- arch/ia64/include/asm/irqflags.h | 1 + arch/ia64/include/asm/thread_info.h | 2 - arch/ia64/kernel/perfmon.c | 14 ++-- arch/ia64/kernel/process.c | 78 +++++----------------- arch/ia64/kernel/smpboot.c | 2 +- arch/m32r/kernel/process.c | 18 ----- arch/m32r/kernel/smpboot.c | 2 +- arch/m68k/kernel/process.c | 32 ++------- arch/metag/include/asm/thread_info.h | 2 - arch/metag/kernel/process.c | 35 ++-------- arch/metag/kernel/smp.c | 2 +- arch/microblaze/Kconfig | 1 + arch/microblaze/include/asm/processor.h | 5 -- arch/microblaze/include/asm/thread_info.h | 1 - arch/microblaze/kernel/process.c | 65 ------------------ arch/mips/kernel/process.c | 48 +++++--------- arch/mips/kernel/smp.c | 2 +- arch/mn10300/include/asm/thread_info.h | 2 - arch/mn10300/kernel/process.c | 70 ++----------------- arch/mn10300/kernel/smp.c | 7 +- arch/openrisc/include/asm/thread_info.h | 2 - arch/openrisc/kernel/Makefile | 2 +- arch/openrisc/kernel/idle.c | 73 -------------------- arch/parisc/include/asm/thread_info.h | 2 - arch/parisc/kernel/process.c | 22 ------ arch/parisc/kernel/smp.c | 2 +- arch/powerpc/include/asm/thread_info.h | 2 - arch/powerpc/kernel/idle.c | 89 ++++++++----------------- arch/powerpc/kernel/smp.c | 2 +- arch/s390/kernel/process.c | 32 +++------ arch/s390/kernel/smp.c | 3 +- arch/s390/kernel/vtime.c | 5 -- arch/score/kernel/process.c | 18 ----- arch/sh/Kconfig | 4 +- arch/sh/include/asm/thread_info.h | 2 - arch/sh/kernel/idle.c | 101 +++------------------------- arch/sh/kernel/smp.c | 2 +- arch/sparc/include/asm/thread_info_32.h | 2 - arch/sparc/include/asm/thread_info_64.h | 2 - arch/sparc/kernel/hvtramp.S | 3 +- arch/sparc/kernel/process_32.c | 21 ++---- arch/sparc/kernel/process_64.c | 49 ++++---------- arch/sparc/kernel/smp_32.c | 2 +- arch/sparc/kernel/smp_64.c | 2 + arch/sparc/kernel/trampoline_64.S | 3 +- arch/tile/include/asm/thread_info.h | 2 - arch/tile/kernel/process.c | 65 +++--------------- arch/tile/kernel/smpboot.c | 4 +- arch/um/kernel/process.c | 27 ++------ arch/unicore32/kernel/process.c | 21 +----- arch/x86/Kconfig | 3 - arch/x86/include/asm/thread_info.h | 2 - arch/x86/kernel/process.c | 105 ++++++++--------------------- arch/x86/kernel/smpboot.c | 2 +- arch/x86/xen/smp.c | 2 +- arch/xtensa/kernel/process.c | 14 +--- include/linux/cpu.h | 16 +++++ include/linux/sched.h | 41 ++++++++++++ init/main.c | 2 +- kernel/Makefile | 1 + kernel/cpu/Makefile | 1 + kernel/cpu/idle.c | 107 ++++++++++++++++++++++++++++++ kernel/sched/core.c | 5 -- 101 files changed, 455 insertions(+), 1328 deletions(-) delete mode 100644 arch/openrisc/kernel/idle.c create mode 100644 kernel/cpu/Makefile create mode 100644 kernel/cpu/idle.c
arch/alpha/include/asm/thread_info.h +0 -2
@@ -95,8 +95,6 @@ register struct thread_info *__current_thread_info __asm__("$8");#define TS_POLLING 0x0010/* idle task polling need_resched, skip sending interrupt */ -#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) -#ifndef __ASSEMBLY__#define HAVE_SET_RESTORE_SIGMASK 1static inline void set_restore_sigmask (void )
arch/alpha/kernel/process.c +0 -19
@@ -46,25 +46,6 @@void (*pm_power_off)(void ) = machine_power_off;EXPORT_SYMBOL (pm_power_off); -void -cpu_idle (void ) -{ -current_thread_info ()->status |=TS_POLLING ; - -while (1 ) { -/* FIXME -- EV6 and LCA45 know how to power down -the CPU. */ - -rcu_idle_enter (); -while (!need_resched ()) -cpu_relax (); - -rcu_idle_exit (); -schedule_preempt_disabled (); - } -} - -struct halt_info {int mode;char *restart_cmd;
arch/alpha/kernel/smp.c +1 -2
@@ -167,8 +167,7 @@ smp_callin(void) cpuid, current, current->active_mm));preempt_disable (); -/* Do nothing. */ -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }/* Wait until hwrpb->txrdy is clear for cpu. Return -1 on timeout. */
arch/arc/kernel/process.c +1 -26
@@ -41,37 +41,12 @@ SYSCALL_DEFINE0(arc_gettls)return task_thread_info (current)->thr_ptr; } -static inline void arch_idle (void ) +void arch_cpu_idle (void ) {/* sleep, but enable all interrupts before committing */ __asm__("sleep 0x3" ); } -void cpu_idle (void ) -{ -/* Since we SLEEP in idle loop, TIF_POLLING_NRFLAG can't be set */ - -/* endless idle loop with no priority at all */ -while (1 ) { -tick_nohz_idle_enter (); -rcu_idle_enter (); - -doze: -local_irq_disable (); -if (!need_resched ()) { -arch_idle (); - goto doze; - }else { -local_irq_enable (); - } - -rcu_idle_exit (); -tick_nohz_idle_exit (); - -schedule_preempt_disabled (); - } -} - asmlinkage void ret_from_fork(void);/* Layout of Child kernel mode stack as setup at the end of this function is
arch/arc/kernel/smp.c +1 -1
@@ -141,7 +141,7 @@ void __cpuinit start_kernel_secondary(void)local_irq_enable ();preempt_disable (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }/*
arch/arm/Kconfig +1 -0
@@ -15,6 +15,7 @@ config ARM select GENERIC_IRQ_SHOW select GENERIC_PCI_IOMAP select GENERIC_SMP_IDLE_THREAD + select GENERIC_IDLE_POLL_SETUP select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNLEN_USER select HARDIRQS_SW_RESEND
arch/arm/include/asm/system_misc.h +0 -3
@@ -21,9 +21,6 @@ extern void (*arm_pm_idle)(void);extern unsigned int user_debug; -extern void disable_hlt (void ); -extern void enable_hlt (void ); -#endif /* !__ASSEMBLY__ */ #endif /* __ASM_ARM_SYSTEM_MISC_H */
arch/arm/kernel/process.c +26 -74
118 lines not on this page · raw message
arch/arm/kernel/smp.c +1 -1
@@ -336,7 +336,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void)/* * OK, it's off to the idle thread for us */ -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }void __init smp_cpus_done (unsigned int max_cpus)
arch/arm/mach-gemini/idle.c +3 -1
@@ -13,9 +13,11 @@ static void gemini_idle(void)* will never wakeup... Acctualy it is not very good to enable * interrupts first since scheduler can miss a tick, but there is * no other way around this. Platforms that needs it for power saving -* should call enable_hlt() in init code, since by default it is +* should enable it in init code, since by default it is * disabled. */ + +/* FIXME: Enabling interrupts here is racy! */ local_irq_enable ();cpu_do_idle (); }
arch/arm/mach-gemini/irq.c +3 -1
@@ -15,6 +15,8 @@#include <linux/stddef.h> #include <linux/list.h> #include <linux/sched.h> +#include <linux/cpu.h> +#include <asm/irq.h> #include <asm/mach/irq.h> #include <asm/system_misc.h>
@@ -77,7 +79,7 @@ void __init gemini_init_irq(void)* Disable the idle handler by default since it is buggy * For more info see arch/arm/mach-gemini/idle.c */ -disable_hlt (); +cpu_idle_poll_ctrl (true);request_resource (&iomem_resource, &irq_resource);
arch/arm/mach-ixp4xx/common.c +2 -1
@@ -29,6 +29,7 @@#include <linux/io.h> #include <linux/export.h> #include <linux/gpio.h> +#include <linux/cpu.h> #include <mach/udc.h> #include <mach/hardware.h>
@@ -239,7 +240,7 @@ void __init ixp4xx_init_irq(void)* ixp4xx does not implement the XScale PWRMODE register * so it must not call cpu_do_idle(). */ -disable_hlt (); +cpu_idle_poll_ctrl (true);/* Route all sources to IRQ instead of FIQ */ *IXP4XX_ICLR =0x0 ;
arch/arm/mach-omap1/pm.c +3 -3
@@ -43,6 +43,7 @@#include <linux/module.h> #include <linux/io.h> #include <linux/atomic.h> +#include <linux/cpu.h> #include <asm/fncpy.h> #include <asm/system_misc.h>
@@ -584,8 +585,7 @@ static void omap_pm_init_proc(void)static int omap_pm_prepare (void ) {/* We cannot sleep in idle until we have resumed */ -disable_hlt (); - +cpu_idle_poll_ctrl (true);return 0 ; }
@@ -621,7 +621,7 @@ static int omap_pm_enter(suspend_state_t state)static void omap_pm_finish (void ) { -enable_hlt (); +cpu_idle_poll_ctrl (false); }
arch/arm/mach-omap2/omap_hwmod.c +4 -3
@@ -138,6 +138,7 @@#include <linux/spinlock.h> #include <linux/slab.h> #include <linux/bootmem.h> +#include <linux/cpu.h> #include <asm/system_misc.h>
@@ -2157,7 +2158,7 @@ static int _enable(struct omap_hwmod *oh)if (soc_ops.enable_module) soc_ops.enable_module (oh);if (oh->flags &HWMOD_BLOCK_WFI ) -disable_hlt (); +cpu_idle_poll_ctrl (true);if (soc_ops.update_context_lost) soc_ops.update_context_lost (oh);
@@ -2221,7 +2222,7 @@ static int _idle(struct omap_hwmod *oh)_del_initiator_dep (oh, mpu_oh);if (oh->flags &HWMOD_BLOCK_WFI ) -enable_hlt (); +cpu_idle_poll_ctrl (false);if (soc_ops.disable_module) soc_ops.disable_module (oh);
@@ -2331,7 +2332,7 @@ static int _shutdown(struct omap_hwmod *oh)_del_initiator_dep (oh, mpu_oh);/* XXX what about the other system initiators here? dma, dsp */ if (oh->flags &HWMOD_BLOCK_WFI ) -enable_hlt (); +cpu_idle_poll_ctrl (false);if (soc_ops.disable_module) soc_ops.disable_module (oh);_disable_clocks (oh);
arch/arm/mach-omap2/pm.c +2 -3
@@ -218,7 +218,7 @@ static int omap_pm_enter(suspend_state_t suspend_state)static int omap_pm_begin (suspend_state_t state) { -disable_hlt (); +cpu_idle_poll_ctrl (true);if (cpu_is_omap34xx ())omap_prcm_irq_prepare ();return 0 ;
@@ -226,8 +226,7 @@ static int omap_pm_begin(suspend_state_t state)static void omap_pm_end (void ) { -enable_hlt (); -return ; +cpu_idle_poll_ctrl (false); }static void omap_pm_finish (void )
arch/arm/mach-orion5x/board-dt.c +2 -1
@@ -14,6 +14,7 @@#include <linux/init.h> #include <linux/of.h> #include <linux/of_platform.h> +#include <linux/cpu.h> #include <asm/system_misc.h> #include <asm/mach/arch.h> #include <mach/orion5x.h>
@@ -52,7 +53,7 @@ static void __init orion5x_dt_init(void)*/ if (dev ==MV88F5281_DEV_ID && rev ==MV88F5281_REV_D0 ) {printk (KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n" ); -disable_hlt (); +cpu_idle_poll_ctrl (true); }if (of_machine_is_compatible ("lacie,ethernet-disk-mini-v2" ))
arch/arm/mach-orion5x/common.c +1 -1
@@ -293,7 +293,7 @@ void __init orion5x_init(void)*/ if (dev ==MV88F5281_DEV_ID && rev ==MV88F5281_REV_D0 ) {printk (KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n" ); -disable_hlt (); +cpu_idle_poll_ctrl (true); }/*
arch/arm/mach-shark/core.c +2 -1
@@ -10,6 +10,7 @@#include <linux/sched.h> #include <linux/serial_8250.h> #include <linux/io.h> +#include <linux/cpu.h> #include <asm/setup.h> #include <asm/mach-types.h>
@@ -130,7 +131,7 @@ static void __init shark_timer_init(void)static void shark_init_early (void ) { -disable_hlt (); +cpu_idle_poll_ctrl (true); }MACHINE_START (SHARK ,"Shark" )
arch/arm/mach-shmobile/suspend.c +4 -2
@@ -12,6 +12,8 @@#include <linux/suspend.h> #include <linux/module.h> #include <linux/err.h> +#include <linux/cpu.h> +#include <asm/io.h> #include <asm/system_misc.h>
@@ -23,13 +25,13 @@ static int shmobile_suspend_default_enter(suspend_state_t suspend_state)static int shmobile_suspend_begin (suspend_state_t state) { -disable_hlt (); +cpu_idle_poll_ctrl (true);return 0 ; }static void shmobile_suspend_end (void ) { -enable_hlt (); +cpu_idle_poll_ctrl (false); }struct platform_suspend_ops shmobile_suspend_ops = {
arch/arm/mach-w90x900/dev.c +2 -1
@@ -19,6 +19,7 @@#include <linux/init.h> #include <linux/platform_device.h> #include <linux/slab.h> +#include <linux/cpu.h> #include <linux/mtd/physmap.h> #include <linux/mtd/mtd.h>
@@ -531,7 +532,7 @@ static struct platform_device *nuc900_public_dev[] __initdata = {void __init nuc900_board_init (struct platform_device **device,int size) { -disable_hlt (); +cpu_idle_poll_ctrl (true);platform_add_devices (device, size);platform_add_devices (nuc900_public_dev,ARRAY_SIZE (nuc900_public_dev)); spi_register_board_info(nuc900_spi_board_info,
arch/arm64/kernel/process.c +5 -38
59 lines not on this page · raw message
arch/arm64/kernel/smp.c +1 -1
@@ -216,7 +216,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void)/* * OK, it's off to the idle thread for us */ -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }void __init smp_cpus_done (unsigned int max_cpus)
arch/avr32/kernel/process.c +2 -11
@@ -30,18 +30,9 @@ EXPORT_SYMBOL(pm_power_off);* This file handles the architecture-dependent parts of process handling.. */ -void cpu_idle (void ) +void arch_cpu_idle (void ) { -/* endless idle loop with no priority at all */ -while (1 ) { -tick_nohz_idle_enter (); -rcu_idle_enter (); -while (!need_resched ()) -cpu_idle_sleep (); -rcu_idle_exit (); -tick_nohz_idle_exit (); -schedule_preempt_disabled (); - } +cpu_enter_idle (); }void machine_halt (void )
arch/avr32/kernel/time.c +7 -2
@@ -12,6 +12,7 @@#include <linux/irq.h> #include <linux/kernel.h> #include <linux/time.h> +#include <linux/cpu.h> #include <asm/sysreg.h>
@@ -87,13 +88,17 @@ static void comparator_mode(enum clock_event_mode mode,pr_debug ("%s: start\n" , evdev->name);/* FALLTHROUGH */ case CLOCK_EVT_MODE_RESUME : -cpu_disable_idle_sleep (); +/* +* If we're using the COUNT and COMPARE registers we +* need to force idle poll. +*/ +cpu_idle_poll_ctrl (true);break ;case CLOCK_EVT_MODE_UNUSED :case CLOCK_EVT_MODE_SHUTDOWN :sysreg_write (COMPARE ,0 );pr_debug ("%s: stop\n" , evdev->name); -cpu_enable_idle_sleep (); +cpu_idle_poll_ctrl (false);break ;default :BUG ();
arch/avr32/mach-at32ap/include/mach/pm.h +0 -24
@@ -21,30 +21,6 @@extern void cpu_enter_idle (void );extern void cpu_enter_standby (unsigned long sdramc_base); -extern bool disable_idle_sleep; - -static inline void cpu_disable_idle_sleep (void ) -{ - disable_idle_sleep = true; -} - -static inline void cpu_enable_idle_sleep (void ) -{ - disable_idle_sleep = false; -} - -static inline void cpu_idle_sleep (void ) -{ -/* -* If we're using the COUNT and COMPARE registers for -* timekeeping, we can't use the IDLE state. -*/ -if (disable_idle_sleep) -cpu_relax (); -else -cpu_enter_idle (); -} -void intc_set_suspend_handler (unsigned long offset);#endif
arch/avr32/mach-at32ap/pm-at32ap700x.S +0 -7
@@ -18,13 +18,6 @@ /* Same as 0xfff00000 but fits in a 21 bit signed immediate */ #define PM_BASE -0x100000 - .section .bss, "wa", @nobits - .global disable_idle_sleep - .type disable_idle_sleep, @object -disable_idle_sleep: - .int 4 - .size disable_idle_sleep, . - disable_idle_sleep - /* Keep this close to the irq handlers */ .section .irq.text, "ax", @progbits
arch/blackfin/kernel/process.c +6 -26
@@ -46,15 +46,14 @@ EXPORT_SYMBOL(pm_power_off);* The idle loop on BFIN */ #ifdef CONFIG_IDLE_L1 -static void default_idle (void )__attribute__((l1_text)); -void cpu_idle (void )__attribute__((l1_text)); +void arch_cpu_idle (void )__attribute__((l1_text));#endif /* * This is our default idle handler. We need to disable * interrupts here to ensure we don't miss a wakeup call. */ -static void default_idle (void ) +void arch_cpu_idle (void ) {#ifdef CONFIG_IPIPE ipipe_suspend_domain ();
@@ -66,31 +65,12 @@ static void default_idle(void)hard_local_irq_enable (); } -/* -* The idle thread. We try to conserve power, while trying to keep -* overall latency low. The architecture specific idle is passed -* a value to indicate the level of "idleness" of the system. -*/ -void cpu_idle (void ) -{ -/* endless idle loop with no priority at all */ -while (1 ) { -#ifdef CONFIG_HOTPLUG_CPU -if (cpu_is_offline (smp_processor_id ())) -cpu_die (); -#endif -tick_nohz_idle_enter (); -rcu_idle_enter (); -while (!need_resched ()) -default_idle (); -rcu_idle_exit (); -tick_nohz_idle_exit (); -preempt_enable_no_resched (); -schedule (); -preempt_disable (); - } +void arch_cpu_idle_dead (void ) +{ +cpu_die (); } +#endif /* * Do necessary setup to start up a newly executed thread.
arch/blackfin/mach-common/smp.c +1 -1
@@ -335,7 +335,7 @@ void __cpuinit secondary_start_kernel(void)*/ calibrate_delay (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }void __init smp_prepare_boot_cpu (void )
arch/c6x/kernel/process.c +1 -27
@@ -33,7 +33,7 @@ extern asmlinkage void ret_from_kernel_thread(void);void (*pm_power_off)(void );EXPORT_SYMBOL (pm_power_off); -static void c6x_idle (void ) +void arch_cpu_idle (void ) {unsigned long tmp;
@@ -49,32 +49,6 @@ static void c6x_idle(void) : "=b"(tmp)); } -/* -* The idle loop for C64x -*/ -void cpu_idle (void ) -{ -/* endless idle loop with no priority at all */ -while (1 ) { -tick_nohz_idle_enter (); -rcu_idle_enter (); -while (1 ) { -local_irq_disable (); -if (need_resched ()) { -local_irq_enable (); -break ; - } -c6x_idle ();/* enables local irqs */ - } -rcu_idle_exit (); -tick_nohz_idle_exit (); - -preempt_enable_no_resched (); -schedule (); -preempt_disable (); - } -} -static void halt_loop (void ) {printk (KERN_EMERG "System Halted, OK to turn off power\n" );
arch/cris/arch-v10/kernel/process.c +2 -1
@@ -30,8 +30,9 @@ void etrax_gpio_wake_up_check(void); /* drivers/gpio.c */void default_idle (void ) {#ifdef CONFIG_ETRAX_GPIO -etrax_gpio_wake_up_check (); +etrax_gpio_wake_up_check ();#endif +local_irq_enable (); }/*
arch/cris/arch-v32/kernel/process.c +3 -9
@@ -20,18 +20,12 @@extern void stop_watchdog (void ); -extern int cris_hlt_counter; -/* We use this if we don't have any better idle routine. */ void default_idle (void ) { -local_irq_disable (); -if (!need_resched () && !cris_hlt_counter) { -/* Halt until exception. */ - __asm__volatile ("ei \n\t" -"halt " ); - } -local_irq_enable (); +/* Halt until exception. */ + __asm__volatile ("ei \n\t" +"halt " ); }/*
arch/cris/arch-v32/kernel/smp.c +1 -3
@@ -145,8 +145,6 @@ smp_boot_one_cpu(int cpuid, struct task_struct idle)* specific stuff such as the local timer and the MMU. */ void __init smp_callin (void ) { -extern void cpu_idle (void ); -int cpu = cpu_now_booting;reg_intr_vect_rw_mask vect_mask = {0 };
@@ -170,7 +168,7 @@ void __init smp_callin(void)local_irq_enable ();set_cpu_online (cpu, true); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }/* Stop execution on this CPU.*/
arch/cris/include/asm/processor.h +0 -7
@@ -65,13 +65,6 @@ static inline void release_thread(struct task_struct *dead_task)#define cpu_relax () barrier() -/* -* disable hlt during certain critical i/o operations -*/ -#define HAVE_DISABLE_HLT -void disable_hlt (void ); -void enable_hlt (void ); -void default_idle (void );#endif /* __ASM_CRIS_PROCESSOR_H */
arch/cris/kernel/process.c +2 -47
61 lines not on this page · raw message
arch/frv/kernel/process.c +5 -22
@@ -59,29 +59,12 @@ static void core_sleep_idle(void)mb (); } -void (*idle)(void ) = core_sleep_idle; - -/* -* The idle thread. There's no useful work to be -* done, so just try to conserve power and have a -* low exit latency (ie sit in a loop waiting for -* somebody to say that they'd like to reschedule) -*/ -void cpu_idle (void ) +void arch_cpu_idle (void ) { -/* endless idle loop with no priority at all */ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) { -check_pgt_cache (); - -if (!frv_dma_inprogress && idle) -idle (); - } -rcu_idle_exit (); - -schedule_preempt_disabled (); - } +if (!frv_dma_inprogress) +core_sleep_idle (); +else +local_irq_enable (); }void machine_restart (char * __unused)
arch/h8300/kernel/process.c +4 -31
@@ -53,40 +53,13 @@ asmlinkage void ret_from_kernel_thread(void);* The idle loop on an H8/300.. */ #if !defined(CONFIG_H8300H_SIM ) && !defined(CONFIG_H8S_SIM ) -static void default_idle (void ) +void arch_cpu_idle (void ) { -local_irq_disable (); -if (!need_resched ()) { -local_irq_enable (); -/* XXX: race here! What if need_resched() gets set now? */ - __asm__("sleep" ); - }else -local_irq_enable (); -} -#else -static void default_idle (void ) -{ -cpu_relax (); +local_irq_enable (); +/* XXX: race here! What if need_resched() gets set now? */ + __asm__("sleep" ); }#endif -void (*idle)(void ) = default_idle; - -/* -* The idle thread. There's no useful work to be -* done, so just try to conserve power and have a -* low exit latency (ie sit in a loop waiting for -* somebody to say that they'd like to reschedule) -*/ -void cpu_idle (void ) -{ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) -idle (); -rcu_idle_exit (); -schedule_preempt_disabled (); - } -}void machine_restart (char * __unused) {
arch/hexagon/kernel/process.c +3 -20
@@ -51,28 +51,11 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)* If hardware or VM offer wait termination even though interrupts * are disabled. */ -static void default_idle (void ) +void arch_cpu_idle (void ) {__vmwait (); -} - -void (*idle_sleep)(void ) = default_idle; - -void cpu_idle (void ) -{ -while (1 ) { -tick_nohz_idle_enter (); -local_irq_disable (); -while (!need_resched ()) { -idle_sleep (); -/* interrupts wake us up, but aren't serviced */ -local_irq_enable ();/* service interrupt */ -local_irq_disable (); - } -local_irq_enable (); -tick_nohz_idle_exit (); -schedule (); - } +/* interrupts wake us up, but irqs are still disabled */ +local_irq_enable (); }/*
arch/hexagon/kernel/smp.c +1 -1
@@ -184,7 +184,7 @@ void __cpuinit start_secondary(void)local_irq_enable (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }
arch/ia64/include/asm/irqflags.h +1 -0
@@ -89,6 +89,7 @@ static inline bool arch_irqs_disabled(void)static inline void arch_safe_halt (void ) { +arch_local_irq_enable ();ia64_pal_halt_light ();/* PAL_HALT_LIGHT */ }
arch/ia64/include/asm/thread_info.h +0 -2
@@ -131,8 +131,6 @@ struct thread_info {#define TS_POLLING 1/* true if in idle loop and not sleeping */ #define TS_RESTORE_SIGMASK 2/* restore signal mask in do_signal() */ -#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) -#ifndef __ASSEMBLY__#define HAVE_SET_RESTORE_SIGMASK 1static inline void set_restore_sigmask (void )
arch/ia64/kernel/perfmon.c +5 -9
@@ -42,6 +42,7 @@#include <linux/completion.h> #include <linux/tracehook.h> #include <linux/slab.h> +#include <linux/cpu.h> #include <asm/errno.h> #include <asm/intrinsics.h>
@@ -1322,8 +1323,6 @@ out: }EXPORT_SYMBOL (pfm_unregister_buffer_fmt); -extern void update_pal_halt_status (int ); -static int pfm_reserve_session (struct task_struct *task,int is_syswide,unsigned int cpu) {
@@ -1371,9 +1370,9 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu) cpu));/* -* disable default_idle() to go to PAL_HALT +* Force idle() into poll mode */ -update_pal_halt_status (0 ); +cpu_idle_poll_ctrl (true);UNLOCK_PFS (flags);
@@ -1430,11 +1429,8 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu) is_syswide, cpu)); -/* -* if possible, enable default_idle() to go into PAL_HALT -*/ -if (pfm_sessions.pfs_task_sessions ==0 && pfm_sessions.pfs_sys_sessions ==0 ) -update_pal_halt_status (1 ); +/* Undo forced polling. Last session reenables pal_halt */ +cpu_idle_poll_ctrl (false);UNLOCK_PFS (flags);
arch/ia64/kernel/process.c +16 -62
104 lines not on this page · raw message
arch/ia64/kernel/smpboot.c +1 -1
@@ -455,7 +455,7 @@ start_secondary (void *unused)preempt_disable ();smp_callin (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE );return 0 ; }
arch/m32r/kernel/process.c +0 -18
@@ -47,24 +47,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)void (*pm_power_off)(void ) =NULL ;EXPORT_SYMBOL (pm_power_off); -/* -* The idle thread. There's no useful work to be -* done, so just try to conserve power and have a -* low exit latency (ie sit in a loop waiting for -* somebody to say that they'd like to reschedule) -*/ -void cpu_idle (void ) -{ -/* endless idle loop with no priority at all */ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) -cpu_relax (); -rcu_idle_exit (); -schedule_preempt_disabled (); - } -} -void machine_restart (char *__unused) {#if defined(CONFIG_PLAT_MAPPI3 )
arch/m32r/kernel/smpboot.c +1 -1
@@ -432,7 +432,7 @@ int __init start_secondary(void *unused)*/ local_flush_tlb_all (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE );return 0 ; }
arch/m68k/kernel/process.c +4 -28
@@ -51,40 +51,16 @@ unsigned long thread_saved_pc(struct task_struct *tsk)return sw->retpc; } -/* -* The idle loop on an m68k.. -*/ -static void default_idle (void ) +void arch_cpu_idle (void ) { - if (!need_resched())#if defined(MACH_ATARI_ONLY ) -/* block out HSYNC on the atari (falcon) */ - __asm__("stop #0x2200" : : :"cc" ); +/* block out HSYNC on the atari (falcon) */ + __asm__("stop #0x2200" : : :"cc" );#else - __asm__("stop #0x2000" : : :"cc" ); + __asm__("stop #0x2000" : : :"cc" );#endif } -void (*idle)(void ) = default_idle; - -/* -* The idle thread. There's no useful work to be -* done, so just try to conserve power and have a -* low exit latency (ie sit in a loop waiting for -* somebody to say that they'd like to reschedule) -*/ -void cpu_idle (void ) -{ -/* endless idle loop with no priority at all */ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) -idle (); -rcu_idle_exit (); -schedule_preempt_disabled (); - } -} -void machine_restart (char * __unused) {if (mach_reset)
arch/metag/include/asm/thread_info.h +0 -2
@@ -150,6 +150,4 @@ static inline int kstack_end(void *addr)#define _TIF_WORK_MASK (_TIF_ALLWORK_MASK & ~(_TIF_SYSCALL_TRACE | \ _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP)) -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* _ASM_THREAD_INFO_H */
arch/metag/kernel/process.c +6 -29
@@ -22,6 +22,7 @@#include <linux/pm.h> #include <linux/syscalls.h> #include <linux/uaccess.h> +#include <linux/smp.h> #include <asm/core_reg.h> #include <asm/user_gateway.h> #include <asm/tcm.h>
@@ -31,7 +32,7 @@/* * Wait for the next interrupt and enable local interrupts */ -static inline void arch_idle (void ) +void arch_cpu_idle (void ) {int tmp;
@@ -59,36 +60,12 @@ static inline void arch_idle(void) : "r" (get_trigger_mask())); } -void cpu_idle (void ) -{ -set_thread_flag (TIF_POLLING_NRFLAG ); - -while (1 ) { -tick_nohz_idle_enter (); -rcu_idle_enter (); - -while (!need_resched ()) { -/* -* We need to disable interrupts here to ensure we don't -* miss a wakeup call. -*/ -local_irq_disable (); -if (!need_resched ()) {#ifdef CONFIG_HOTPLUG_CPU -if (cpu_is_offline (smp_processor_id ())) -cpu_die (); -#endif -arch_idle (); - }else { -local_irq_enable (); - } - } - -rcu_idle_exit (); -tick_nohz_idle_exit (); -schedule_preempt_disabled (); - } +void arch_cpu_idle_dead (void ) +{ +cpu_die (); } +#endif void (*pm_power_off)(void );EXPORT_SYMBOL (pm_power_off);
arch/metag/kernel/smp.c +1 -1
@@ -297,7 +297,7 @@ asmlinkage void secondary_start_kernel(void)/* * OK, it's off to the idle thread for us */ -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }void __init smp_cpus_done (unsigned int max_cpus)
arch/microblaze/Kconfig +1 -0
@@ -26,6 +26,7 @@ config MICROBLAZE select GENERIC_CPU_DEVICES select GENERIC_ATOMIC64 select GENERIC_CLOCKEVENTS + select GENERIC_IDLE_POLL_SETUP select MODULES_USE_ELF_RELA select CLONE_BACKWARDS
arch/microblaze/include/asm/processor.h +0 -5
@@ -22,7 +22,6 @@extern const struct seq_operations cpuinfo_op;# define cpu_relax () barrier() -# define cpu_sleep () do {} while (0)#define task_pt_regs (tsk) \ (((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1)
@@ -160,10 +159,6 @@ unsigned long get_wchan(struct task_struct *p);# define STACK_TOP TASK_SIZE# define STACK_TOP_MAX STACK_TOP -void disable_hlt (void ); -void enable_hlt (void ); -void default_idle (void ); -#ifdef CONFIG_DEBUG_FS extern struct dentry *of_debugfs_root;#endif
arch/microblaze/include/asm/thread_info.h +0 -1
@@ -182,7 +182,6 @@ static inline bool test_and_clear_restore_sigmask(void) ti->status &= ~TS_RESTORE_SIGMASK ;return true; } -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)#endif #endif /* __KERNEL__ */
arch/microblaze/kernel/process.c +0 -65
71 lines not on this page · raw message
arch/mips/kernel/process.c +15 -33
59 lines not on this page · raw message
arch/mips/kernel/smp.c +1 -1
@@ -139,7 +139,7 @@ asmlinkage __cpuinit void start_secondary(void)WARN_ON_ONCE (!irqs_disabled ()); mp_ops->smp_finish (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }/*
arch/mn10300/include/asm/thread_info.h +0 -2
@@ -165,8 +165,6 @@ void arch_release_thread_info(struct thread_info *ti);#define _TIF_WORK_MASK 0x0000FFFE/* work to do on interrupt/exception return */ #define _TIF_ALLWORK_MASK 0x0000FFFF/* work to do on any return to u-space */ -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* __KERNEL__ */ #endif /* _ASM_THREAD_INFO_H */
arch/mn10300/kernel/process.c +6 -64
83 lines not on this page · raw message
arch/mn10300/kernel/smp.c +1 -6
@@ -675,7 +675,7 @@ int __init start_secondary(void *unused)#ifdef CONFIG_GENERIC_CLOCKEVENTS init_clockevents ();#endif -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE );return 0 ; }
@@ -935,8 +935,6 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)int timeout;#ifdef CONFIG_HOTPLUG_CPU -if (num_online_cpus () ==1 ) -disable_hlt ();if (sleep_mode[cpu])run_wakeup_cpu (cpu);#endif /* CONFIG_HOTPLUG_CPU */
@@ -1003,9 +1001,6 @@ int __cpu_disable(void)void __cpu_die (unsigned int cpu) {run_sleep_cpu (cpu); - -if (num_online_cpus () ==1 ) -enable_hlt (); }#ifdef CONFIG_MN10300_CACHE_ENABLED
arch/openrisc/include/asm/thread_info.h +0 -2
@@ -128,8 +128,6 @@ register struct thread_info *current_thread_info_reg asm("r10");/* For OpenRISC, this is anything in the LSW other than syscall trace */ #define _TIF_WORK_MASK (0xff & ~(_TIF_SYSCALL_TRACE|_TIF_SINGLESTEP)) -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* __KERNEL__ */ #endif /* _ASM_THREAD_INFO_H */
arch/openrisc/kernel/Makefile +1 -1
@@ -4,7 +4,7 @@ extra-y := head.o vmlinux.lds -obj-y := setup.o idle.o or32_ksyms.o process.o dma.o \ +obj-y := setup.o or32_ksyms.o process.o dma.o \ traps.o time.o irq.o entry.o ptrace.o signal.o \ sys_call_table.o
arch/openrisc/kernel/idle.c deleted +0 -73
73 lines not on this page · raw message
arch/parisc/include/asm/thread_info.h +0 -2
@@ -77,8 +77,6 @@ struct thread_info {#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ _TIF_BLOCKSTEP) -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* __KERNEL__ */ #endif /* _ASM_PARISC_THREAD_INFO_H */
arch/parisc/kernel/process.c +0 -22
@@ -59,28 +59,6 @@#include <asm/unwind.h> #include <asm/sections.h> -/* -* The idle thread. There's no useful work to be -* done, so just try to conserve power and have a -* low exit latency (ie sit in a loop waiting for -* somebody to say that they'd like to reschedule) -*/ -void cpu_idle (void ) -{ -set_thread_flag (TIF_POLLING_NRFLAG ); - -/* endless idle loop with no priority at all */ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) -barrier (); -rcu_idle_exit (); -schedule_preempt_disabled (); -check_pgt_cache (); - } -} - -#define COMMAND_GLOBAL F_EXTEND(0xfffe0030)#define CMD_RESET 5/* reset any module */
arch/parisc/kernel/smp.c +1 -1
@@ -329,7 +329,7 @@ void __init smp_callin(void)local_irq_enable ();/* Interrupts have been off until now */ -cpu_idle ();/* Wait for timer to schedule some work */ +cpu_startup_entry (CPUHP_ONLINE );/* NOTREACHED */ panic ("smp_callin() AAAAaaaaahhhh....\n" );
arch/powerpc/include/asm/thread_info.h +0 -2
@@ -182,8 +182,6 @@ static inline bool test_thread_local_flags(unsigned int flags)#define is_32bit_task () (1)#endif -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */
arch/powerpc/kernel/idle.c +29 -60
104 lines not on this page · raw message
arch/powerpc/kernel/smp.c +1 -1
@@ -669,7 +669,7 @@ __cpuinit void start_secondary(void *unused)local_irq_enable (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE );BUG (); }
arch/s390/kernel/process.c +9 -23
@@ -61,18 +61,8 @@ unsigned long thread_saved_pc(struct task_struct *tsk)return sf->gprs[8 ]; } -/* -* The idle loop on a S390... -*/ -static void default_idle (void ) +void arch_cpu_idle (void ) { -if (cpu_is_offline (smp_processor_id ())) -cpu_die (); -local_irq_disable (); -if (need_resched ()) { -local_irq_enable (); -return ; - }local_mcck_disable ();if (test_thread_flag (TIF_MCCK_PENDING )) {local_mcck_enable ();
@@ -83,19 +73,15 @@ static void default_idle(void)vtime_stop_cpu (); } -void cpu_idle (void ) +void arch_cpu_idle_exit (void ) { -for (;;) { -tick_nohz_idle_enter (); -rcu_idle_enter (); -while (!need_resched () && !test_thread_flag (TIF_MCCK_PENDING )) -default_idle (); -rcu_idle_exit (); -tick_nohz_idle_exit (); -if (test_thread_flag (TIF_MCCK_PENDING )) -s390_handle_mcck (); -schedule_preempt_disabled (); - } +if (test_thread_flag (TIF_MCCK_PENDING )) +s390_handle_mcck (); +} + +void arch_cpu_idle_dead (void ) +{ +cpu_die (); }extern void __kprobes kernel_thread_starter (void );
arch/s390/kernel/smp.c +1 -2
@@ -711,8 +711,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)set_cpu_online (smp_processor_id (), true);inc_irq_stat (CPU_RST );local_irq_enable (); -/* cpu_idle will call schedule for us */ -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }/* Upping and downing of CPUs */
arch/s390/kernel/vtime.c +0 -5
@@ -158,8 +158,6 @@ void __kprobes vtime_stop_cpu(void)unsigned long psw_mask;trace_hardirqs_on (); -/* Don't trace preempt off for idle. */ -stop_critical_timings ();/* Wait for external, I/O or machine check interrupt. */ psw_mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_DAT |
@@ -169,9 +167,6 @@ void __kprobes vtime_stop_cpu(void)/* Call the assembler magic in entry.S */ psw_idle (idle, psw_mask); -/* Reenable preemption tracer. */ -start_critical_timings (); -/* Account time spent with enabled wait psw loaded as idle time. */ idle->sequence++;smp_wmb ();
arch/score/kernel/process.c +0 -18
@@ -41,24 +41,6 @@ void machine_halt(void) {}/* If or when software machine-power-off is implemented, add code here. */ void machine_power_off (void ) {} -/* -* The idle thread. There's no useful work to be -* done, so just try to conserve power and have a -* low exit latency (ie sit in a loop waiting for -* somebody to say that they'd like to reschedule) -*/ -void __noreturn cpu_idle (void ) -{ -/* endless idle loop with no priority at all */ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) -barrier (); -rcu_idle_exit (); -schedule_preempt_disabled (); - } -} -void ret_from_fork (void );void ret_from_kernel_thread (void );
arch/sh/Kconfig +1 -3
@@ -33,6 +33,7 @@ config SUPERH select GENERIC_ATOMIC64 select GENERIC_IRQ_SHOW select GENERIC_SMP_IDLE_THREAD + select GENERIC_IDLE_POLL_SETUP select GENERIC_CLOCKEVENTS select GENERIC_CMOS_UPDATE if SH_SH03 || SH_DREAMCAST select GENERIC_STRNCPY_FROM_USER
@@ -148,9 +149,6 @@ config ARCH_HAS_ILOG2_U32 config ARCH_HAS_ILOG2_U64 def_bool n -config ARCH_HAS_DEFAULT_IDLE - def_bool y - config NO_IOPORT def_bool !PCI depends on !SH_CAYMAN && !SH_SH4202_MICRODEV && !SH_SHMIN && \
arch/sh/include/asm/thread_info.h +0 -2
@@ -207,8 +207,6 @@ static inline bool test_and_clear_restore_sigmask(void)return true; } -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */
arch/sh/kernel/idle.c +11 -90
122 lines not on this page · raw message
arch/sh/kernel/smp.c +1 -1
@@ -203,7 +203,7 @@ asmlinkage void __cpuinit start_secondary(void)set_cpu_online (cpu, true);per_cpu (cpu_state, cpu) =CPU_ONLINE ; -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); } extern struct {
arch/sparc/include/asm/thread_info_32.h +0 -2
@@ -132,8 +132,6 @@ register struct thread_info *current_thread_info_reg asm("g6");#define _TIF_DO_NOTIFY_RESUME_MASK (_TIF_NOTIFY_RESUME | \ _TIF_SIGPENDING) -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#endif /* __KERNEL__ */ #endif /* _ASM_THREAD_INFO_H */
arch/sparc/include/asm/thread_info_64.h +0 -2
@@ -256,8 +256,6 @@ static inline bool test_and_clear_restore_sigmask(void)return true; } -#define tsk_is_polling (t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) -#define thread32_stack_is_64bit (__SP) (((__SP) & 0x1) != 0)#define test_thread_64bit_stack (__SP) \ ((test_thread_flag(TIF_32BIT) && !thread32_stack_is_64bit(__SP)) ? \
arch/sparc/kernel/hvtramp.S +1 -2
@@ -128,8 +128,7 @@ hv_cpu_startup: call smp_callin nop - call cpu_idle - mov 0, %o0 + call cpu_panic nop
arch/sparc/kernel/process_32.c +5 -16
@@ -64,23 +64,12 @@ extern void fpsave(unsigned long *, unsigned long *, void *, unsigned long *);struct task_struct *last_task_used_math =NULL ;struct thread_info *current_set[NR_CPUS ]; -/* -* the idle loop on a Sparc... ;) -*/ -void cpu_idle (void ) +/* Idle loop support. */ +void arch_cpu_idle (void ) { -set_thread_flag (TIF_POLLING_NRFLAG ); - -/* endless idle loop with no priority at all */ -for (;;) { -while (!need_resched ()) { -if (sparc_idle) - (*sparc_idle)(); -else -cpu_relax (); - } -schedule_preempt_disabled (); - } +if (sparc_idle) + (*sparc_idle)(); +local_irq_enable (); }/* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */
arch/sparc/kernel/process_64.c +13 -36
76 lines not on this page · raw message
arch/sparc/kernel/smp_32.c +1 -1
@@ -369,7 +369,7 @@ void __cpuinit sparc_start_secondary(void *arg)local_irq_enable ();wmb (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE );/* We should never reach here! */ BUG ();
arch/sparc/kernel/smp_64.c +2 -0
@@ -127,6 +127,8 @@ void __cpuinit smp_callin(void)/* idle thread is expected to have preempt disabled */ preempt_disable (); + +cpu_startup_entry (CPUHP_ONLINE ); }void cpu_panic (void )
arch/sparc/kernel/trampoline_64.S +1 -2
@@ -407,8 +407,7 @@ after_lock_tlb: call smp_callin nop - call cpu_idle - mov 0, %o0 + call cpu_panic nop 1: b,a,pt %xcc, 1b
arch/tile/include/asm/thread_info.h +0 -2
@@ -153,8 +153,6 @@ extern void _cpu_idle(void);#define TS_POLLING 0x0004/* in idle loop but not sleeping */ #define TS_RESTORE_SIGMASK 0x0008/* restore signal mask in do_signal */ -#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) -#ifndef __ASSEMBLY__#define HAVE_SET_RESTORE_SIGMASK 1static inline void set_restore_sigmask (void )
arch/tile/kernel/process.c +9 -56
86 lines not on this page · raw message
arch/tile/kernel/smpboot.c +1 -3
@@ -207,9 +207,7 @@ void __cpuinit online_secondary(void)/* Set up tile-timer clock-event device on this cpu */ setup_tile_timer (); -preempt_enable (); - -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }int __cpuinit __cpu_up (unsigned int cpu,struct task_struct *tidle)
arch/um/kernel/process.c +4 -23
@@ -210,33 +210,14 @@ void initial_thread_cb(void (*proc)(void *), void *arg) kmalloc_ok = save_kmalloc_ok; } -void default_idle (void ) +void arch_cpu_idle (void ) {unsigned long long nsecs; -while (1 ) { -/* endless idle loop with no priority at all */ - -/* -* although we are an idle CPU, we do not want to -* get into the scheduler unnecessarily. -*/ -if (need_resched ()) -schedule (); - -tick_nohz_idle_enter (); -rcu_idle_enter (); - nsecs =disable_timer (); -idle_sleep (nsecs); -rcu_idle_exit (); -tick_nohz_idle_exit (); - } -} - -void cpu_idle (void ) -{ cpu_tasks[current_thread_info ()->cpu].pid =os_getpid (); -default_idle (); + nsecs =disable_timer (); +idle_sleep (nsecs); +local_irq_enable (); }int __cant_sleep (void ) {
arch/unicore32/kernel/process.c +3 -18
@@ -45,25 +45,10 @@ static const char * const processor_modes[] = { "UK18", "UK19", "UK1A", "EXTN", "UK1C", "UK1D", "UK1E", "SUSR" }; -void cpu_idle (void ) +void arch_cpu_idle (void ) { -/* endless idle loop with no priority at all */ -while (1 ) { -tick_nohz_idle_enter (); -rcu_idle_enter (); -while (!need_resched ()) { -local_irq_disable (); -stop_critical_timings (); -cpu_do_idle (); -local_irq_enable (); -start_critical_timings (); - } -rcu_idle_exit (); -tick_nohz_idle_exit (); -preempt_enable_no_resched (); -schedule (); -preempt_disable (); - } +cpu_do_idle (); +local_irq_enable (); }static char reboot_mode ='h' ;
arch/x86/Kconfig +0 -3
@@ -188,9 +188,6 @@ config GENERIC_CALIBRATE_DELAY config ARCH_HAS_CPU_RELAX def_bool y -config ARCH_HAS_DEFAULT_IDLE - def_bool y - config ARCH_HAS_CACHE_LINE_SIZE def_bool y
arch/x86/include/asm/thread_info.h +0 -2
@@ -241,8 +241,6 @@ static inline struct thread_info *current_thread_info(void)skip sending interrupt */ #define TS_RESTORE_SIGMASK 0x0008/* restore signal mask in do_signal() */ -#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) -#ifndef __ASSEMBLY__#define HAVE_SET_RESTORE_SIGMASK 1static inline void set_restore_sigmask (void )
arch/x86/kernel/process.c +27 -78
149 lines not on this page · raw message
arch/x86/kernel/smpboot.c +1 -1
@@ -284,7 +284,7 @@ notrace static void __cpuinit start_secondary(void *unused) x86_cpuinit.setup_percpu_clockev ();wmb (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }void __init smp_store_boot_cpu_info (void )
arch/x86/xen/smp.c +1 -1
@@ -95,7 +95,7 @@ static void __cpuinit cpu_bringup(void)static void __cpuinit cpu_bringup_and_idle (void ) {cpu_bringup (); -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }static int xen_smp_intr_init (unsigned int cpu)
arch/xtensa/kernel/process.c +2 -12
@@ -105,19 +105,9 @@ void coprocessor_flush_all(struct thread_info *ti)/* * Powermanagement idle function, if any is provided by the platform. */ - -void cpu_idle (void ) +void arch_cpu_idle (void ) { -local_irq_enable (); - -/* endless idle loop with no priority at all */ -while (1 ) { -rcu_idle_enter (); -while (!need_resched ()) -platform_idle (); -rcu_idle_exit (); -schedule_preempt_disabled (); - } +platform_idle (); }/*
include/linux/cpu.h +16 -0
@@ -212,4 +212,20 @@ static inline int disable_nonboot_cpus(void) { return 0; }static inline void enable_nonboot_cpus (void ) {}#endif /* !CONFIG_PM_SLEEP_SMP */ +enum cpuhp_state { +CPUHP_OFFLINE , +CPUHP_ONLINE , +}; + +void cpu_startup_entry (enum cpuhp_state state); +void cpu_idle (void ); + +void cpu_idle_poll_ctrl (bool enable); + +void arch_cpu_idle (void ); +void arch_cpu_idle_prepare (void ); +void arch_cpu_idle_enter (void ); +void arch_cpu_idle_exit (void ); +void arch_cpu_idle_dead (void ); +#endif /* _LINUX_CPU_H_ */
include/linux/sched.h +41 -0
47 lines not on this page · raw message
init/main.c +1 -1
@@ -384,7 +384,7 @@ static noinline void __init_refok rest_init(void)init_idle_bootup_task (current);schedule_preempt_disabled ();/* Call into cpu_idle with preempt disabled */ -cpu_idle (); +cpu_startup_entry (CPUHP_ONLINE ); }/* Check for early params. */
kernel/Makefile +1 -0
@@ -24,6 +24,7 @@ endif obj-y += sched/ obj-y += power/ +obj-y += cpu/ obj-$(CONFIG_CHECKPOINT_RESTORE) += kcmp.o obj-$(CONFIG_FREEZER) += freezer.o
kernel/cpu/Makefile new file +1 -0
@@ -0,0 +1 @@ +obj-y = idle.o
kernel/cpu/idle.c new file +107 -0
107 lines not on this page · raw message
kernel/sched/core.c +0 -5
@@ -512,11 +512,6 @@ static inline void init_hrtick(void)* the target CPU. */ #ifdef CONFIG_SMP - -#ifndef tsk_is_polling -#define tsk_is_polling (t) 0 -#endif -void resched_task (struct task_struct *p) {int cpu;