Blame view

kernel/sched/idle.c 7.25 KB
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
1
2
3
4
5
6
7
8
9
  /*
   * Generic entry point for the idle threads
   */
  #include <linux/sched.h>
  #include <linux/cpu.h>
  #include <linux/cpuidle.h>
  #include <linux/tick.h>
  #include <linux/mm.h>
  #include <linux/stackprotector.h>
381063133   Rafael J. Wysocki   PM / sleep: Re-im...
10
  #include <linux/suspend.h>
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
11
12
13
14
  
  #include <asm/tlb.h>
  
  #include <trace/events/power.h>
e3baac47f   Peter Zijlstra   sched/idle: Optim...
15
  #include "sched.h"
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  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
  
  static inline int cpu_idle_poll(void)
  {
  	rcu_idle_enter();
  	trace_cpu_idle_rcuidle(0, smp_processor_id());
  	local_irq_enable();
ff6f2d29b   Preeti U Murthy   sched/idle: Add m...
49
50
  	while (!tif_need_resched() &&
  		(cpu_idle_force_poll || tick_check_broadcast_expired()))
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  		cpu_relax();
  	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();
  }
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
67
68
69
70
  /**
   * cpuidle_idle_call - the main idle function
   *
   * NOTE: no locks or semaphores should be used here
82c65d60d   Andy Lutomirski   sched/idle: Clear...
71
72
73
74
   *
   * 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.
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
75
   */
08c373e51   Rafael J. Wysocki   sched/idle: Make ...
76
  static void cpuidle_idle_call(void)
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
77
78
79
  {
  	struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
  	struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
37352273a   Peter Zijlstra   sched/idle: Reflo...
80
  	int next_state, entered_state;
ef2b22ac5   Rafael J. Wysocki   cpuidle / sleep: ...
81
  	bool reflect;
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
82

a1d028bd6   Daniel Lezcano   sched/idle: Add m...
83
84
  	/*
  	 * Check if the idle task must be rescheduled. If it is the
c444117f0   Peter Zijlstra   sched/idle: Delay...
85
  	 * case, exit the function after re-enabling the local irq.
a1d028bd6   Daniel Lezcano   sched/idle: Add m...
86
  	 */
c444117f0   Peter Zijlstra   sched/idle: Delay...
87
  	if (need_resched()) {
8ca3c6424   Daniel Lezcano   sched/idle: Move ...
88
  		local_irq_enable();
08c373e51   Rafael J. Wysocki   sched/idle: Make ...
89
  		return;
8ca3c6424   Daniel Lezcano   sched/idle: Move ...
90
  	}
a1d028bd6   Daniel Lezcano   sched/idle: Add m...
91
92
93
94
  	/*
  	 * During the idle period, stop measuring the disabled irqs
  	 * critical sections latencies
  	 */
c8cc7d4de   Daniel Lezcano   sched/idle: Reorg...
95
  	stop_critical_timings();
a1d028bd6   Daniel Lezcano   sched/idle: Add m...
96
97
98
99
100
101
  
  	/*
  	 * 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
  	 */
c8cc7d4de   Daniel Lezcano   sched/idle: Reorg...
102
  	rcu_idle_enter();
ef2b22ac5   Rafael J. Wysocki   cpuidle / sleep: ...
103
104
  	if (cpuidle_not_available(drv, dev))
  		goto use_default;
a1d028bd6   Daniel Lezcano   sched/idle: Add m...
105
  	/*
381063133   Rafael J. Wysocki   PM / sleep: Re-im...
106
107
108
109
110
111
112
113
114
  	 * 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.
  	 */
  	if (idle_should_freeze()) {
ef2b22ac5   Rafael J. Wysocki   cpuidle / sleep: ...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  		entered_state = cpuidle_enter_freeze(drv, dev);
  		if (entered_state >= 0) {
  			local_irq_enable();
  			goto exit_idle;
  		}
  
  		reflect = false;
  		next_state = cpuidle_find_deepest_state(drv, dev);
  	} else {
  		reflect = true;
  		/*
  		 * Ask the cpuidle framework to choose a convenient idle state.
  		 */
  		next_state = cpuidle_select(drv, dev);
381063133   Rafael J. Wysocki   PM / sleep: Re-im...
129
  	}
ef2b22ac5   Rafael J. Wysocki   cpuidle / sleep: ...
130
  	/* Fall back to the default arch idle method on errors. */
dfcacc154   Rafael J. Wysocki   cpuidle: Clean up...
131
132
  	if (next_state < 0)
  		goto use_default;
37352273a   Peter Zijlstra   sched/idle: Reflo...
133
134
135
136
137
138
139
140
141
142
143
  
  	/*
  	 * The idle task must be scheduled, it is pointless to
  	 * go to idle, just update no idle residency and get
  	 * out of this function
  	 */
  	if (current_clr_polling_and_test()) {
  		dev->last_residency = 0;
  		entered_state = next_state;
  		local_irq_enable();
  		goto exit_idle;
c444117f0   Peter Zijlstra   sched/idle: Delay...
144
  	}
8ca3c6424   Daniel Lezcano   sched/idle: Move ...
145

442bf3aaf   Daniel Lezcano   sched: Let the sc...
146
147
  	/* Take note of the planned idle state. */
  	idle_set_state(this_rq(), &drv->states[next_state]);
37352273a   Peter Zijlstra   sched/idle: Reflo...
148
149
150
151
152
153
  	/*
  	 * 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
  	 */
  	entered_state = cpuidle_enter(drv, dev, next_state);
442bf3aaf   Daniel Lezcano   sched: Let the sc...
154
155
  	/* The cpu is no longer idle or about to enter idle. */
  	idle_set_state(this_rq(), NULL);
df8d9eead   Rafael J. Wysocki   cpuidle: Run tick...
156
157
  	if (entered_state == -EBUSY)
  		goto use_default;
37352273a   Peter Zijlstra   sched/idle: Reflo...
158
159
160
161
  
  	/*
  	 * Give the governor an opportunity to reflect on the outcome
  	 */
ef2b22ac5   Rafael J. Wysocki   cpuidle / sleep: ...
162
163
  	if (reflect)
  		cpuidle_reflect(dev, entered_state);
37352273a   Peter Zijlstra   sched/idle: Reflo...
164
165
  
  exit_idle:
8ca3c6424   Daniel Lezcano   sched/idle: Move ...
166
  	__current_set_polling();
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
167

a1d028bd6   Daniel Lezcano   sched/idle: Add m...
168
  	/*
37352273a   Peter Zijlstra   sched/idle: Reflo...
169
  	 * It is up to the idle functions to reenable local interrupts
a1d028bd6   Daniel Lezcano   sched/idle: Add m...
170
  	 */
c8cc7d4de   Daniel Lezcano   sched/idle: Reorg...
171
172
173
174
175
  	if (WARN_ON_ONCE(irqs_disabled()))
  		local_irq_enable();
  
  	rcu_idle_exit();
  	start_critical_timings();
dfcacc154   Rafael J. Wysocki   cpuidle: Clean up...
176
177
178
179
180
181
182
183
184
185
186
187
188
  	return;
  
  use_default:
  	/*
  	 * We can't use the cpuidle framework, let's use the default
  	 * idle routine.
  	 */
  	if (current_clr_polling_and_test())
  		local_irq_enable();
  	else
  		arch_cpu_idle();
  
  	goto exit_idle;
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
189
  }
30cdd69e2   Daniel Lezcano   cpuidle/idle: Mov...
190

528a25b00   Paul E. McKenney   cpu: Make CPU-off...
191
  DEFINE_PER_CPU(bool, cpu_dead_idle);
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
192
193
  /*
   * Generic idle loop implementation
82c65d60d   Andy Lutomirski   sched/idle: Clear...
194
195
   *
   * Called with polling cleared.
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
196
197
198
199
   */
  static void cpu_idle_loop(void)
  {
  	while (1) {
82c65d60d   Andy Lutomirski   sched/idle: Clear...
200
201
202
203
204
205
206
207
208
209
  		/*
  		 * 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.
  		 */
  
  		__current_set_polling();
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
210
211
212
213
214
  		tick_nohz_idle_enter();
  
  		while (!need_resched()) {
  			check_pgt_cache();
  			rmb();
528a25b00   Paul E. McKenney   cpu: Make CPU-off...
215
  			if (cpu_is_offline(smp_processor_id())) {
88428cc5c   Paul E. McKenney   rcu: Handle outgo...
216
217
  				rcu_cpu_notify(NULL, CPU_DYING_IDLE,
  					       (void *)(long)smp_processor_id());
528a25b00   Paul E. McKenney   cpu: Make CPU-off...
218
219
  				smp_mb(); /* all activity before dead. */
  				this_cpu_write(cpu_dead_idle, true);
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
220
  				arch_cpu_idle_dead();
528a25b00   Paul E. McKenney   cpu: Make CPU-off...
221
  			}
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
222
223
224
225
226
227
228
229
230
231
232
233
234
  
  			local_irq_disable();
  			arch_cpu_idle_enter();
  
  			/*
  			 * 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
  			 */
8ca3c6424   Daniel Lezcano   sched/idle: Move ...
235
  			if (cpu_idle_force_poll || tick_check_broadcast_expired())
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
236
  				cpu_idle_poll();
8ca3c6424   Daniel Lezcano   sched/idle: Move ...
237
238
  			else
  				cpuidle_idle_call();
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
239
  			arch_cpu_idle_exit();
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
240
  		}
06d50c65b   Peter Zijlstra   sched/idle: Remov...
241
242
243
244
245
246
247
248
249
250
  
  		/*
  		 * 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();
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
251
  		tick_nohz_idle_exit();
82c65d60d   Andy Lutomirski   sched/idle: Clear...
252
253
254
  		__current_clr_polling();
  
  		/*
e3baac47f   Peter Zijlstra   sched/idle: Optim...
255
256
257
258
  		 * 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.
82c65d60d   Andy Lutomirski   sched/idle: Clear...
259
260
  		 */
  		smp_mb__after_atomic();
e3baac47f   Peter Zijlstra   sched/idle: Optim...
261
  		sched_ttwu_pending();
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
  		schedule_preempt_disabled();
  	}
  }
  
  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
cf37b6b48   Nicolas Pitre   sched/idle: Move ...
283
284
285
  	arch_cpu_idle_prepare();
  	cpu_idle_loop();
  }