qos: Pass the list of cpus with affected qos to notifer
Send the list of cpus whose qos has been affected along with the changed value. Driver listening in for notifier can use this to apply the qos value for the respective cpus. Wakeup cpus even if the aggregated qos value does not change but the cpumask changes. Change-Id: I8f3c2ea624784c806c55de41cc7c7fcf8ebf02da Signed-off-by: Mahesh Sivasubramanian <msivasub@codeaurora.org> Signed-off-by: Maulik Shah <mkshah@codeaurora.org>
This commit is contained in:
parent
06e4dc680e
commit
7ce01e7d47
1 changed files with 17 additions and 6 deletions
|
|
@ -267,7 +267,8 @@ static const struct file_operations pm_qos_debug_fops = {
|
|||
.release = single_release,
|
||||
};
|
||||
|
||||
static inline void pm_qos_set_value_for_cpus(struct pm_qos_constraints *c)
|
||||
static inline void pm_qos_set_value_for_cpus(struct pm_qos_constraints *c,
|
||||
struct cpumask *cpus)
|
||||
{
|
||||
struct pm_qos_request *req = NULL;
|
||||
int cpu;
|
||||
|
|
@ -294,8 +295,11 @@ static inline void pm_qos_set_value_for_cpus(struct pm_qos_constraints *c)
|
|||
}
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
for_each_possible_cpu(cpu) {
|
||||
if (c->target_per_cpu[cpu] != qos_val[cpu])
|
||||
cpumask_set_cpu(cpu, cpus);
|
||||
c->target_per_cpu[cpu] = qos_val[cpu];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -316,6 +320,7 @@ int pm_qos_update_target(struct pm_qos_constraints *c,
|
|||
unsigned long flags;
|
||||
int prev_value, curr_value, new_value;
|
||||
struct plist_node *node = &req->node;
|
||||
struct cpumask cpus;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&pm_qos_lock, flags);
|
||||
|
|
@ -346,18 +351,24 @@ int pm_qos_update_target(struct pm_qos_constraints *c,
|
|||
}
|
||||
|
||||
curr_value = pm_qos_get_value(c);
|
||||
cpumask_clear(&cpus);
|
||||
pm_qos_set_value(c, curr_value);
|
||||
pm_qos_set_value_for_cpus(c);
|
||||
pm_qos_set_value_for_cpus(c, &cpus);
|
||||
|
||||
spin_unlock_irqrestore(&pm_qos_lock, flags);
|
||||
|
||||
trace_pm_qos_update_target(action, prev_value, curr_value);
|
||||
if (prev_value != curr_value) {
|
||||
|
||||
/*
|
||||
* if cpu mask bits are set, call the notifier call chain
|
||||
* to update the new qos restriction for the cores
|
||||
*/
|
||||
|
||||
if (!cpumask_empty(&cpus)) {
|
||||
ret = 1;
|
||||
if (c->notifiers)
|
||||
blocking_notifier_call_chain(c->notifiers,
|
||||
(unsigned long)curr_value,
|
||||
NULL);
|
||||
(unsigned long)curr_value, &cpus);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue