2014-01-26 23:42:01 -05:00
/*
* Generic entry point for the idle threads
*/
# include <linux/sched.h>
2017-02-01 16:36:40 +01:00
# include <linux/sched/idle.h>
2014-01-26 23:42:01 -05:00
# include <linux/cpu.h>
# include <linux/cpuidle.h>
2016-02-26 18:43:41 +00:00
# include <linux/cpuhotplug.h>
2014-01-26 23:42:01 -05:00
# include <linux/tick.h>
# include <linux/mm.h>
# include <linux/stackprotector.h>
2015-02-12 23:33:15 +01:00
# include <linux/suspend.h>
2014-01-26 23:42:01 -05:00
# include <asm/tlb.h>
# include <trace/events/power.h>
2014-06-04 10:31:18 -07:00
# include "sched.h"
2016-10-07 17:02:55 -07:00
/* Linker adds these: start and end of __cpuidle functions */
extern char __cpuidle_text_start [ ] , __cpuidle_text_end [ ] ;
2015-05-10 01:18:03 +02:00
/**
* sched_idle_set_state - Record idle state for the current CPU .
* @ idle_state : State to record .
*/
void sched_idle_set_state ( struct cpuidle_state * idle_state )
{
idle_set_state ( this_rq ( ) , idle_state ) ;
}
2014-01-26 23:42:01 -05:00
static int __read_mostly cpu_idle_force_poll ;
void cpu_idle_poll_ctrl ( bool enable )
{
if ( enable ) {
cpu_idle_force_poll + + ;
} else {
cpu_idle_force_poll - - ;
WARN_ON_ONCE ( cpu_idle_force_poll < 0 ) ;
}
}
# ifdef CONFIG_GENERIC_IDLE_POLL_SETUP
static int __init cpu_idle_poll_setup ( char * __unused )
{
cpu_idle_force_poll = 1 ;
return 1 ;
}
__setup ( " nohlt " , cpu_idle_poll_setup ) ;
static int __init cpu_idle_nopoll_setup ( char * __unused )
{
cpu_idle_force_poll = 0 ;
return 1 ;
}
__setup ( " hlt " , cpu_idle_nopoll_setup ) ;
# endif
2016-10-07 17:02:55 -07:00
static noinline int __cpuidle cpu_idle_poll ( void )
2014-01-26 23:42:01 -05:00
{
rcu_idle_enter ( ) ;
trace_cpu_idle_rcuidle ( 0 , smp_processor_id ( ) ) ;
local_irq_enable ( ) ;
2015-10-08 15:36:06 -03:00
stop_critical_timings ( ) ;
2015-01-21 16:27:25 +05:30
while ( ! tif_need_resched ( ) & &
( cpu_idle_force_poll | | tick_check_broadcast_expired ( ) ) )
2014-01-26 23:42:01 -05:00
cpu_relax ( ) ;
2015-10-08 15:36:06 -03:00
start_critical_timings ( ) ;
2014-01-26 23:42:01 -05:00
trace_cpu_idle_rcuidle ( PWR_EVENT_EXIT , smp_processor_id ( ) ) ;
rcu_idle_exit ( ) ;
return 1 ;
}
/* Weak implementations for optional arch specific functions */
void __weak arch_cpu_idle_prepare ( void ) { }
void __weak arch_cpu_idle_enter ( void ) { }
void __weak arch_cpu_idle_exit ( void ) { }
void __weak arch_cpu_idle_dead ( void ) { }
void __weak arch_cpu_idle ( void )
{
cpu_idle_force_poll = 1 ;
local_irq_enable ( ) ;
}
2015-05-10 01:18:46 +02:00
/**
* default_idle_call - Default CPU idle routine .
*
* To use when the cpuidle framework cannot be used .
*/
2016-10-07 17:02:55 -07:00
void __cpuidle default_idle_call ( void )
2015-05-04 22:53:22 +02:00
{
2015-07-20 18:34:50 +02:00
if ( current_clr_polling_and_test ( ) ) {
2015-05-04 22:53:22 +02:00
local_irq_enable ( ) ;
2015-07-20 18:34:50 +02:00
} else {
stop_critical_timings ( ) ;
2015-05-04 22:53:22 +02:00
arch_cpu_idle ( ) ;
2015-07-20 18:34:50 +02:00
start_critical_timings ( ) ;
}
2015-05-04 22:53:22 +02:00
}
2015-05-04 22:53:35 +02:00
static int call_cpuidle ( struct cpuidle_driver * drv , struct cpuidle_device * dev ,
int next_state )
{
/*
* The idle task must be scheduled , it is pointless to go to idle , just
* update no idle residency and return .
*/
if ( current_clr_polling_and_test ( ) ) {
dev - > last_residency = 0 ;
local_irq_enable ( ) ;
return - EBUSY ;
}
/*
* Enter the idle state previously returned by the governor decision .
* This function will block until an interrupt occurs and will take
* care of re - enabling the local interrupts
*/
2015-05-10 01:18:46 +02:00
return cpuidle_enter ( drv , dev , next_state ) ;
2015-05-04 22:53:35 +02:00
}
2014-03-03 08:48:51 +01:00
/**
* cpuidle_idle_call - the main idle function
*
* NOTE : no locks or semaphores should be used here
2014-06-04 10:31:16 -07:00
*
* On archs that support TIF_POLLING_NRFLAG , is called with polling
* set , and it returns with polling set . If it ever stops polling , it
* must clear the polling bit .
2014-03-03 08:48:51 +01:00
*/
2014-04-21 01:26:58 +02:00
static void cpuidle_idle_call ( void )
2014-03-03 08:48:51 +01:00
{
2016-06-01 18:52:16 +01:00
struct cpuidle_device * dev = cpuidle_get_device ( ) ;
2014-03-03 08:48:51 +01:00
struct cpuidle_driver * drv = cpuidle_get_cpu_driver ( dev ) ;
2014-04-11 13:55:48 +02:00
int next_state , entered_state ;
2014-03-03 08:48:51 +01:00
2014-03-03 08:48:54 +01:00
/*
* Check if the idle task must be rescheduled . If it is the
2014-04-11 13:47:16 +02:00
* case , exit the function after re - enabling the local irq .
2014-03-03 08:48:54 +01:00
*/
2014-04-11 13:47:16 +02:00
if ( need_resched ( ) ) {
2014-03-03 08:48:53 +01:00
local_irq_enable ( ) ;
2014-04-21 01:26:58 +02:00
return ;
2014-03-03 08:48:53 +01:00
}
2014-03-03 08:48:54 +01:00
/*
* Tell the RCU framework we are entering an idle section ,
* so no more rcu read side critical sections and one more
* step to the grace period
*/
2014-03-03 08:48:52 +01:00
rcu_idle_enter ( ) ;
2015-05-04 22:53:22 +02:00
if ( cpuidle_not_available ( drv , dev ) ) {
default_idle_call ( ) ;
goto exit_idle ;
}
2015-03-02 22:26:55 +01:00
2015-02-12 23:33:15 +01:00
/*
* Suspend - to - idle ( " freeze " ) is a system state in which all user space
* has been frozen , all I / O devices have been suspended and the only
* activity happens here and in iterrupts ( if any ) . In that case bypass
* the cpuidle governor and go stratight for the deepest idle state
* available . Possibly also suspend the local tick and the entire
* timekeeping to prevent timer interrupts from kicking us out of idle
* until a proper wakeup interrupt happens .
*/
2016-11-28 23:03:04 -08:00
if ( idle_should_freeze ( ) | | dev - > use_deepest_state ) {
if ( idle_should_freeze ( ) ) {
entered_state = cpuidle_enter_freeze ( drv , dev ) ;
if ( entered_state > 0 ) {
local_irq_enable ( ) ;
goto exit_idle ;
}
2015-03-02 22:26:55 +01:00
}
next_state = cpuidle_find_deepest_state ( drv , dev ) ;
2015-05-04 22:53:35 +02:00
call_cpuidle ( drv , dev , next_state ) ;
2015-03-02 22:26:55 +01:00
} else {
/*
* Ask the cpuidle framework to choose a convenient idle state .
*/
next_state = cpuidle_select ( drv , dev ) ;
2015-05-04 22:53:35 +02:00
entered_state = call_cpuidle ( drv , dev , next_state ) ;
/*
* Give the governor an opportunity to reflect on the outcome
*/
2015-03-02 22:26:55 +01:00
cpuidle_reflect ( dev , entered_state ) ;
2015-05-04 22:53:35 +02:00
}
2014-04-11 13:55:48 +02:00
exit_idle :
2014-03-03 08:48:53 +01:00
__current_set_polling ( ) ;
2014-03-03 08:48:51 +01:00
2014-03-03 08:48:54 +01:00
/*
2014-04-11 13:55:48 +02:00
* It is up to the idle functions to reenable local interrupts
2014-03-03 08:48:54 +01:00
*/
2014-03-03 08:48:52 +01:00
if ( WARN_ON_ONCE ( irqs_disabled ( ) ) )
local_irq_enable ( ) ;
rcu_idle_exit ( ) ;
2014-03-03 08:48:51 +01:00
}
2014-01-26 23:42:01 -05:00
/*
* Generic idle loop implementation
2014-06-04 10:31:16 -07:00
*
* Called with polling cleared .
2014-01-26 23:42:01 -05:00
*/
2016-11-28 23:03:05 -08:00
static void do_idle ( void )
2014-01-26 23:42:01 -05:00
{
2016-11-28 23:03:05 -08:00
/*
* If the arch has a polling bit , we maintain an invariant :
*
* Our polling bit is clear if we ' re not scheduled ( i . e . if rq - > curr ! =
* rq - > idle ) . This means that , if rq - > idle has the polling bit set ,
* then setting need_resched is guaranteed to cause the CPU to
* reschedule .
*/
2014-01-26 23:42:01 -05:00
2016-11-28 23:03:05 -08:00
__current_set_polling ( ) ;
tick_nohz_idle_enter ( ) ;
2014-01-26 23:42:01 -05:00
2016-11-28 23:03:05 -08:00
while ( ! need_resched ( ) ) {
check_pgt_cache ( ) ;
rmb ( ) ;
2014-01-26 23:42:01 -05:00
2016-11-28 23:03:05 -08:00
if ( cpu_is_offline ( smp_processor_id ( ) ) ) {
cpuhp_report_idle_dead ( ) ;
arch_cpu_idle_dead ( ) ;
2014-01-26 23:42:01 -05:00
}
2014-02-24 18:22:07 +01:00
2016-11-28 23:03:05 -08:00
local_irq_disable ( ) ;
arch_cpu_idle_enter ( ) ;
2014-06-04 10:31:16 -07:00
/*
2016-11-28 23:03:05 -08:00
* In poll mode we reenable interrupts and spin . Also if we
* detected in the wakeup from idle path that the tick
* broadcast device expired for us , we don ' t want to go deep
* idle as we know that the IPI is going to arrive right away .
2014-06-04 10:31:16 -07:00
*/
2016-11-28 23:03:05 -08:00
if ( cpu_idle_force_poll | | tick_check_broadcast_expired ( ) )
cpu_idle_poll ( ) ;
else
cpuidle_idle_call ( ) ;
arch_cpu_idle_exit ( ) ;
2014-01-26 23:42:01 -05:00
}
2016-11-28 23:03:05 -08:00
/*
* Since we fell out of the loop above , we know TIF_NEED_RESCHED must
* be set , propagate it into PREEMPT_NEED_RESCHED .
*
* This is required because for polling idle loops we will not have had
* an IPI to fold the state for us .
*/
preempt_set_need_resched ( ) ;
tick_nohz_idle_exit ( ) ;
__current_clr_polling ( ) ;
/*
* We promise to call sched_ttwu_pending ( ) and reschedule if
* need_resched ( ) is set while polling is set . That means that clearing
* polling needs to be visible before doing these things .
*/
smp_mb__after_atomic ( ) ;
sched_ttwu_pending ( ) ;
schedule_preempt_disabled ( ) ;
2014-01-26 23:42:01 -05:00
}
2016-10-07 17:02:55 -07:00
bool cpu_in_idle ( unsigned long pc )
{
return pc > = ( unsigned long ) __cpuidle_text_start & &
pc < ( unsigned long ) __cpuidle_text_end ;
}
2016-11-28 23:03:05 -08:00
struct idle_timer {
struct hrtimer timer ;
int done ;
} ;
static enum hrtimer_restart idle_inject_timer_fn ( struct hrtimer * timer )
{
struct idle_timer * it = container_of ( timer , struct idle_timer , timer ) ;
WRITE_ONCE ( it - > done , 1 ) ;
set_tsk_need_resched ( current ) ;
return HRTIMER_NORESTART ;
}
void play_idle ( unsigned long duration_ms )
{
struct idle_timer it ;
/*
* Only FIFO tasks can disable the tick since they don ' t need the forced
* preemption .
*/
WARN_ON_ONCE ( current - > policy ! = SCHED_FIFO ) ;
WARN_ON_ONCE ( current - > nr_cpus_allowed ! = 1 ) ;
WARN_ON_ONCE ( ! ( current - > flags & PF_KTHREAD ) ) ;
WARN_ON_ONCE ( ! ( current - > flags & PF_NO_SETAFFINITY ) ) ;
WARN_ON_ONCE ( ! duration_ms ) ;
rcu_sleep_check ( ) ;
preempt_disable ( ) ;
current - > flags | = PF_IDLE ;
cpuidle_use_deepest_state ( true ) ;
it . done = 0 ;
hrtimer_init_on_stack ( & it . timer , CLOCK_MONOTONIC , HRTIMER_MODE_REL ) ;
it . timer . function = idle_inject_timer_fn ;
hrtimer_start ( & it . timer , ms_to_ktime ( duration_ms ) , HRTIMER_MODE_REL_PINNED ) ;
while ( ! READ_ONCE ( it . done ) )
do_idle ( ) ;
cpuidle_use_deepest_state ( false ) ;
current - > flags & = ~ PF_IDLE ;
preempt_fold_need_resched ( ) ;
preempt_enable ( ) ;
}
EXPORT_SYMBOL_GPL ( play_idle ) ;
2014-01-26 23:42:01 -05:00
void cpu_startup_entry ( enum cpuhp_state state )
{
/*
* This # ifdef needs to die , but it ' s too late in the cycle to
* make this generic ( arm and sh have never invoked the canary
* init for the non boot cpus ! ) . Will be fixed in 3.11
*/
# ifdef CONFIG_X86
/*
* If we ' re the non - boot CPU , nothing set the stack canary up
* for us . The boot CPU already has it initialized but no harm
* in doing it again . This is a good place for updating it , as
* we wont ever return from this function ( so the invalid
* canaries already on the stack wont ever trigger ) .
*/
boot_init_stack_canary ( ) ;
# endif
arch_cpu_idle_prepare ( ) ;
2016-02-26 18:43:41 +00:00
cpuhp_online_idle ( state ) ;
2016-11-28 23:03:05 -08:00
while ( 1 )
do_idle ( ) ;
2014-01-26 23:42:01 -05:00
}