Skip to content

Commit 5aa9ba6

Browse files
dlezcanorafaeljw
authored andcommitted
cpuidle: Pass exit latency limit to cpuidle_use_deepest_state()
Modify cpuidle_use_deepest_state() to take an additional exit latency limit argument to be passed to find_deepest_idle_state() and make cpuidle_idle_call() pass dev->forced_idle_latency_limit_ns to it for forced idle. Suggested-by: Rafael J. Wysocki <[email protected]> Signed-off-by: Daniel Lezcano <[email protected]> [ rjw: Rebase and rearrange code, subject & changelog ] Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent c55b51a commit 5aa9ba6

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

drivers/cpuidle/cpuidle.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,10 @@ void cpuidle_use_deepest_state(u64 latency_limit_ns)
123123
* @dev: cpuidle device for the given CPU.
124124
*/
125125
int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
126-
struct cpuidle_device *dev)
126+
struct cpuidle_device *dev,
127+
u64 latency_limit_ns)
127128
{
128-
return find_deepest_state(drv, dev, U64_MAX, 0, false);
129+
return find_deepest_state(drv, dev, latency_limit_ns, 0, false);
129130
}
130131

131132
#ifdef CONFIG_SUSPEND

include/linux/cpuidle.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,15 @@ static inline struct cpuidle_device *cpuidle_get_device(void) {return NULL; }
213213

214214
#ifdef CONFIG_CPU_IDLE
215215
extern int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
216-
struct cpuidle_device *dev);
216+
struct cpuidle_device *dev,
217+
u64 latency_limit_ns);
217218
extern int cpuidle_enter_s2idle(struct cpuidle_driver *drv,
218219
struct cpuidle_device *dev);
219220
extern void cpuidle_use_deepest_state(u64 latency_limit_ns);
220221
#else
221222
static inline int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
222-
struct cpuidle_device *dev)
223+
struct cpuidle_device *dev,
224+
u64 latency_limit_ns)
223225
{return -ENODEV; }
224226
static inline int cpuidle_enter_s2idle(struct cpuidle_driver *drv,
225227
struct cpuidle_device *dev)

kernel/sched/idle.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ static void cpuidle_idle_call(void)
166166
*/
167167

168168
if (idle_should_enter_s2idle() || dev->forced_idle_latency_limit_ns) {
169+
u64 max_latency_ns;
170+
169171
if (idle_should_enter_s2idle()) {
170172
rcu_idle_enter();
171173

@@ -176,12 +178,16 @@ static void cpuidle_idle_call(void)
176178
}
177179

178180
rcu_idle_exit();
181+
182+
max_latency_ns = U64_MAX;
183+
} else {
184+
max_latency_ns = dev->forced_idle_latency_limit_ns;
179185
}
180186

181187
tick_nohz_idle_stop_tick();
182188
rcu_idle_enter();
183189

184-
next_state = cpuidle_find_deepest_state(drv, dev);
190+
next_state = cpuidle_find_deepest_state(drv, dev, max_latency_ns);
185191
call_cpuidle(drv, dev, next_state);
186192
} else {
187193
bool stop_tick = true;

0 commit comments

Comments
 (0)