forked from luck/tmp_suning_uos_patched
PM: QoS: Drop PM_QOS_CPU_DMA_LATENCY notifier chain
Notice that pm_qos_remove_notifier() is not used at all and the only caller of pm_qos_add_notifier() is the cpuidle core, which only needs the PM_QOS_CPU_DMA_LATENCY notifier to invoke wake_up_all_idle_cpus() upon changes of the PM_QOS_CPU_DMA_LATENCY target value. First, to ensure that wake_up_all_idle_cpus() will be called whenever the PM_QOS_CPU_DMA_LATENCY target value changes, modify the pm_qos_add/update/remove_request() family of functions to check if the effective constraint for the PM_QOS_CPU_DMA_LATENCY has changed and call wake_up_all_idle_cpus() directly in that case. Next, drop the PM_QOS_CPU_DMA_LATENCY notifier from cpuidle as it is not necessary any more. Finally, drop both pm_qos_add_notifier() and pm_qos_remove_notifier(), as they have no callers now, along with cpu_dma_lat_notifier which is only used by them. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org> Tested-by: Amit Kucheria <amit.kucheria@linaro.org>
This commit is contained in:
parent
02c92a3789
commit
3a4a004222
|
@ -736,53 +736,15 @@ int cpuidle_register(struct cpuidle_driver *drv,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(cpuidle_register);
|
EXPORT_SYMBOL_GPL(cpuidle_register);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function gets called when a part of the kernel has a new latency
|
|
||||||
* requirement. This means we need to get all processors out of their C-state,
|
|
||||||
* and then recalculate a new suitable C-state. Just do a cross-cpu IPI; that
|
|
||||||
* wakes them all right up.
|
|
||||||
*/
|
|
||||||
static int cpuidle_latency_notify(struct notifier_block *b,
|
|
||||||
unsigned long l, void *v)
|
|
||||||
{
|
|
||||||
wake_up_all_idle_cpus();
|
|
||||||
return NOTIFY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct notifier_block cpuidle_latency_notifier = {
|
|
||||||
.notifier_call = cpuidle_latency_notify,
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void latency_notifier_init(struct notifier_block *n)
|
|
||||||
{
|
|
||||||
pm_qos_add_notifier(PM_QOS_CPU_DMA_LATENCY, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* CONFIG_SMP */
|
|
||||||
|
|
||||||
#define latency_notifier_init(x) do { } while (0)
|
|
||||||
|
|
||||||
#endif /* CONFIG_SMP */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpuidle_init - core initializer
|
* cpuidle_init - core initializer
|
||||||
*/
|
*/
|
||||||
static int __init cpuidle_init(void)
|
static int __init cpuidle_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (cpuidle_disabled())
|
if (cpuidle_disabled())
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
ret = cpuidle_add_interface(cpu_subsys.dev_root);
|
return cpuidle_add_interface(cpu_subsys.dev_root);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
latency_notifier_init(&cpuidle_latency_notifier);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_param(off, int, 0444);
|
module_param(off, int, 0444);
|
||||||
|
|
|
@ -149,8 +149,6 @@ void pm_qos_update_request(struct pm_qos_request *req,
|
||||||
void pm_qos_remove_request(struct pm_qos_request *req);
|
void pm_qos_remove_request(struct pm_qos_request *req);
|
||||||
|
|
||||||
int pm_qos_request(int pm_qos_class);
|
int pm_qos_request(int pm_qos_class);
|
||||||
int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier);
|
|
||||||
int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier);
|
|
||||||
int pm_qos_request_active(struct pm_qos_request *req);
|
int pm_qos_request_active(struct pm_qos_request *req);
|
||||||
s32 pm_qos_read_value(struct pm_qos_constraints *c);
|
s32 pm_qos_read_value(struct pm_qos_constraints *c);
|
||||||
|
|
||||||
|
|
|
@ -56,14 +56,12 @@
|
||||||
*/
|
*/
|
||||||
static DEFINE_SPINLOCK(pm_qos_lock);
|
static DEFINE_SPINLOCK(pm_qos_lock);
|
||||||
|
|
||||||
static BLOCKING_NOTIFIER_HEAD(cpu_dma_lat_notifier);
|
|
||||||
static struct pm_qos_constraints cpu_dma_constraints = {
|
static struct pm_qos_constraints cpu_dma_constraints = {
|
||||||
.list = PLIST_HEAD_INIT(cpu_dma_constraints.list),
|
.list = PLIST_HEAD_INIT(cpu_dma_constraints.list),
|
||||||
.target_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,
|
.target_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,
|
||||||
.default_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,
|
.default_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,
|
||||||
.no_constraint_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,
|
.no_constraint_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,
|
||||||
.type = PM_QOS_MIN,
|
.type = PM_QOS_MIN,
|
||||||
.notifiers = &cpu_dma_lat_notifier,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -247,6 +245,14 @@ int pm_qos_request_active(struct pm_qos_request *req)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pm_qos_request_active);
|
EXPORT_SYMBOL_GPL(pm_qos_request_active);
|
||||||
|
|
||||||
|
static void cpu_latency_qos_update(struct pm_qos_request *req,
|
||||||
|
enum pm_qos_req_action action, s32 value)
|
||||||
|
{
|
||||||
|
int ret = pm_qos_update_target(req->qos, &req->node, action, value);
|
||||||
|
if (ret > 0)
|
||||||
|
wake_up_all_idle_cpus();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pm_qos_add_request - inserts new qos request into the list
|
* pm_qos_add_request - inserts new qos request into the list
|
||||||
* @req: pointer to a preallocated handle
|
* @req: pointer to a preallocated handle
|
||||||
|
@ -273,7 +279,7 @@ void pm_qos_add_request(struct pm_qos_request *req,
|
||||||
trace_pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY, value);
|
trace_pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY, value);
|
||||||
|
|
||||||
req->qos = &cpu_dma_constraints;
|
req->qos = &cpu_dma_constraints;
|
||||||
pm_qos_update_target(req->qos, &req->node, PM_QOS_ADD_REQ, value);
|
cpu_latency_qos_update(req, PM_QOS_ADD_REQ, value);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pm_qos_add_request);
|
EXPORT_SYMBOL_GPL(pm_qos_add_request);
|
||||||
|
|
||||||
|
@ -302,7 +308,7 @@ void pm_qos_update_request(struct pm_qos_request *req, s32 new_value)
|
||||||
if (new_value == req->node.prio)
|
if (new_value == req->node.prio)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pm_qos_update_target(req->qos, &req->node, PM_QOS_UPDATE_REQ, new_value);
|
cpu_latency_qos_update(req, PM_QOS_UPDATE_REQ, new_value);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pm_qos_update_request);
|
EXPORT_SYMBOL_GPL(pm_qos_update_request);
|
||||||
|
|
||||||
|
@ -327,42 +333,11 @@ void pm_qos_remove_request(struct pm_qos_request *req)
|
||||||
|
|
||||||
trace_pm_qos_remove_request(PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
|
trace_pm_qos_remove_request(PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
|
||||||
|
|
||||||
pm_qos_update_target(req->qos, &req->node, PM_QOS_REMOVE_REQ,
|
cpu_latency_qos_update(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE);
|
||||||
PM_QOS_DEFAULT_VALUE);
|
|
||||||
memset(req, 0, sizeof(*req));
|
memset(req, 0, sizeof(*req));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pm_qos_remove_request);
|
EXPORT_SYMBOL_GPL(pm_qos_remove_request);
|
||||||
|
|
||||||
/**
|
|
||||||
* pm_qos_add_notifier - sets notification entry for changes to target value
|
|
||||||
* @pm_qos_class: Ignored.
|
|
||||||
* @notifier: notifier block managed by caller.
|
|
||||||
*
|
|
||||||
* will register the notifier into a notification chain that gets called
|
|
||||||
* upon changes to the PM_QOS_CPU_DMA_LATENCY target value.
|
|
||||||
*/
|
|
||||||
int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier)
|
|
||||||
{
|
|
||||||
return blocking_notifier_chain_register(cpu_dma_constraints.notifiers,
|
|
||||||
notifier);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(pm_qos_add_notifier);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pm_qos_remove_notifier - deletes notification entry from chain.
|
|
||||||
* @pm_qos_class: Ignored.
|
|
||||||
* @notifier: notifier block to be removed.
|
|
||||||
*
|
|
||||||
* will remove the notifier from the notification chain that gets called
|
|
||||||
* upon changes to the PM_QOS_CPU_DMA_LATENCY target value.
|
|
||||||
*/
|
|
||||||
int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier)
|
|
||||||
{
|
|
||||||
return blocking_notifier_chain_unregister(cpu_dma_constraints.notifiers,
|
|
||||||
notifier);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(pm_qos_remove_notifier);
|
|
||||||
|
|
||||||
/* User space interface to global PM QoS via misc device. */
|
/* User space interface to global PM QoS via misc device. */
|
||||||
|
|
||||||
static int pm_qos_power_open(struct inode *inode, struct file *filp)
|
static int pm_qos_power_open(struct inode *inode, struct file *filp)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user