Skip to content

Commit 0fc784f

Browse files
committed
cpuidle: governors: Consolidate PM QoS handling
There is some code duplication related to the PM QoS handling between the existing cpuidle governors, so move that code to a common helper function and call that from the governors. Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent cf7eeea commit 0fc784f

File tree

4 files changed

+19
-17
lines changed

4 files changed

+19
-17
lines changed

drivers/cpuidle/governor.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
* This code is licenced under the GPL.
99
*/
1010

11-
#include <linux/mutex.h>
11+
#include <linux/cpu.h>
1212
#include <linux/cpuidle.h>
13+
#include <linux/mutex.h>
14+
#include <linux/pm_qos.h>
1315

1416
#include "cpuidle.h"
1517

@@ -93,3 +95,16 @@ int cpuidle_register_governor(struct cpuidle_governor *gov)
9395

9496
return ret;
9597
}
98+
99+
/**
100+
* cpuidle_governor_latency_req - Compute a latency constraint for CPU
101+
* @cpu: Target CPU
102+
*/
103+
int cpuidle_governor_latency_req(unsigned int cpu)
104+
{
105+
int global_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
106+
struct device *device = get_cpu_device(cpu);
107+
int device_req = dev_pm_qos_raw_read_value(device);
108+
109+
return device_req < global_req ? device_req : global_req;
110+
}

drivers/cpuidle/governors/ladder.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414

1515
#include <linux/kernel.h>
1616
#include <linux/cpuidle.h>
17-
#include <linux/pm_qos.h>
1817
#include <linux/jiffies.h>
1918
#include <linux/tick.h>
20-
#include <linux/cpu.h>
2119

2220
#include <asm/io.h>
2321
#include <linux/uaccess.h>
@@ -69,15 +67,10 @@ static int ladder_select_state(struct cpuidle_driver *drv,
6967
struct cpuidle_device *dev, bool *dummy)
7068
{
7169
struct ladder_device *ldev = this_cpu_ptr(&ladder_devices);
72-
struct device *device = get_cpu_device(dev->cpu);
7370
struct ladder_device_state *last_state;
7471
int last_residency, last_idx = ldev->last_state_idx;
7572
int first_idx = drv->states[0].flags & CPUIDLE_FLAG_POLLING ? 1 : 0;
76-
int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
77-
int resume_latency = dev_pm_qos_raw_read_value(device);
78-
79-
if (resume_latency < latency_req)
80-
latency_req = resume_latency;
73+
int latency_req = cpuidle_governor_latency_req(dev->cpu);
8174

8275
/* Special case when user has set very strict latency requirement */
8376
if (unlikely(latency_req == 0)) {

drivers/cpuidle/governors/menu.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
#include <linux/kernel.h>
1414
#include <linux/cpuidle.h>
15-
#include <linux/pm_qos.h>
1615
#include <linux/time.h>
1716
#include <linux/ktime.h>
1817
#include <linux/hrtimer.h>
@@ -21,7 +20,6 @@
2120
#include <linux/sched/loadavg.h>
2221
#include <linux/sched/stat.h>
2322
#include <linux/math64.h>
24-
#include <linux/cpu.h>
2523

2624
/*
2725
* Please note when changing the tuning values:
@@ -286,25 +284,20 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
286284
bool *stop_tick)
287285
{
288286
struct menu_device *data = this_cpu_ptr(&menu_devices);
289-
struct device *device = get_cpu_device(dev->cpu);
290-
int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
287+
int latency_req = cpuidle_governor_latency_req(dev->cpu);
291288
int i;
292289
int first_idx;
293290
int idx;
294291
unsigned int interactivity_req;
295292
unsigned int expected_interval;
296293
unsigned long nr_iowaiters, cpu_load;
297-
int resume_latency = dev_pm_qos_raw_read_value(device);
298294
ktime_t delta_next;
299295

300296
if (data->needs_update) {
301297
menu_update(drv, dev);
302298
data->needs_update = 0;
303299
}
304300

305-
if (resume_latency < latency_req)
306-
latency_req = resume_latency;
307-
308301
/* Special case when user has set very strict latency requirement */
309302
if (unlikely(latency_req == 0)) {
310303
*stop_tick = false;

include/linux/cpuidle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ struct cpuidle_governor {
258258

259259
#ifdef CONFIG_CPU_IDLE
260260
extern int cpuidle_register_governor(struct cpuidle_governor *gov);
261+
extern int cpuidle_governor_latency_req(unsigned int cpu);
261262
#else
262263
static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
263264
{return 0;}

0 commit comments

Comments
 (0)