Skip to content

Commit 601ef1f

Browse files
committed
Merge branches 'pm-cpufreq-sched' and 'pm-cpuidle'
* pm-cpufreq-sched: cpufreq: schedutil: Avoid missing updates for one-CPU policies schedutil: Allow cpufreq requests to be made even when kthread kicked cpufreq: Rename cpufreq_can_do_remote_dvfs() cpufreq: schedutil: Cleanup and document iowait boost cpufreq: schedutil: Fix iowait boost reset cpufreq: schedutil: Don't set next_freq to UINT_MAX Revert "cpufreq: schedutil: Don't restrict kthread to related_cpus unnecessarily" * pm-cpuidle: cpuidle: governors: Consolidate PM QoS handling cpuidle: governors: Drop redundant checks related to PM QoS
3 parents e27f84e + a61dec7 + 0fc784f commit 601ef1f

File tree

7 files changed

+200
-104
lines changed

7 files changed

+200
-104
lines changed

drivers/cpufreq/cpufreq_governor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ static void dbs_update_util_handler(struct update_util_data *data, u64 time,
278278
struct policy_dbs_info *policy_dbs = cdbs->policy_dbs;
279279
u64 delta_ns, lst;
280280

281-
if (!cpufreq_can_do_remote_dvfs(policy_dbs->policy))
281+
if (!cpufreq_this_cpu_can_update(policy_dbs->policy))
282282
return;
283283

284284
/*

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 & 9 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,16 +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-
resume_latency != PM_QOS_RESUME_LATENCY_NO_CONSTRAINT)
81-
latency_req = resume_latency;
73+
int latency_req = cpuidle_governor_latency_req(dev->cpu);
8274

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

drivers/cpuidle/governors/menu.c

Lines changed: 1 addition & 9 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,26 +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-
resume_latency != PM_QOS_RESUME_LATENCY_NO_CONSTRAINT)
307-
latency_req = resume_latency;
308-
309301
/* Special case when user has set very strict latency requirement */
310302
if (unlikely(latency_req == 0)) {
311303
*stop_tick = false;

include/linux/cpufreq.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ struct governor_attr {
571571
size_t count);
572572
};
573573

574-
static inline bool cpufreq_can_do_remote_dvfs(struct cpufreq_policy *policy)
574+
static inline bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy)
575575
{
576576
/*
577577
* Allow remote callbacks if:

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)