mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
cpuidle: Do not unset the driver if it is there already
commit918c1fe9fb
upstream. Fix __cpuidle_set_driver() to check if any of the CPUs in the mask has a driver different from drv already and, if so, return -EBUSY before updating any cpuidle_drivers per-CPU pointers. Fixes:82467a5a88
("cpuidle: simplify multiple driver support") Cc: 3.11+ <stable@vger.kernel.org> # 3.11+ Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com> [ rjw: Subject & changelog ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
dc857d605b
commit
768cfe8321
1 changed files with 8 additions and 9 deletions
|
@ -62,25 +62,24 @@ static inline void __cpuidle_unset_driver(struct cpuidle_driver *drv)
|
||||||
* __cpuidle_set_driver - set per CPU driver variables for the given driver.
|
* __cpuidle_set_driver - set per CPU driver variables for the given driver.
|
||||||
* @drv: a valid pointer to a struct cpuidle_driver
|
* @drv: a valid pointer to a struct cpuidle_driver
|
||||||
*
|
*
|
||||||
* For each CPU in the driver's cpumask, unset the registered driver per CPU
|
* Returns 0 on success, -EBUSY if any CPU in the cpumask have a driver
|
||||||
* to @drv.
|
* different from drv already.
|
||||||
*
|
|
||||||
* Returns 0 on success, -EBUSY if the CPUs have driver(s) already.
|
|
||||||
*/
|
*/
|
||||||
static inline int __cpuidle_set_driver(struct cpuidle_driver *drv)
|
static inline int __cpuidle_set_driver(struct cpuidle_driver *drv)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
for_each_cpu(cpu, drv->cpumask) {
|
for_each_cpu(cpu, drv->cpumask) {
|
||||||
|
struct cpuidle_driver *old_drv;
|
||||||
|
|
||||||
if (__cpuidle_get_cpu_driver(cpu)) {
|
old_drv = __cpuidle_get_cpu_driver(cpu);
|
||||||
__cpuidle_unset_driver(drv);
|
if (old_drv && old_drv != drv)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
|
||||||
|
|
||||||
per_cpu(cpuidle_drivers, cpu) = drv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for_each_cpu(cpu, drv->cpumask)
|
||||||
|
per_cpu(cpuidle_drivers, cpu) = drv;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue