cpuidle: Add cpuidle_use_deepest_state_mask() helper function

The cpuidle_use_deepest_state() function introduced in commit
2847a3ac96d32 only affects the calling CPU. Add a helper function that
affects all CPUs in a given cpumask to make it easier to toggle
use_deepest_state for multiple CPUs at once and reduce boilerplate code
wherever such behavior is desired.

Signed-off-by: kdrag0n <dragon@khronodragon.com>
This commit is contained in:
kdrag0n 2019-03-09 18:52:04 -08:00 committed by xxmustafacooTR
parent 88ef894b09
commit bef0d9ad57
No known key found for this signature in database
GPG key ID: 520B6FE385CBF5C9
2 changed files with 35 additions and 1 deletions

View file

@ -19,6 +19,7 @@
#include <linux/ktime.h>
#include <linux/hrtimer.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/suspend.h>
#include <linux/tick.h>
#include <trace/events/power.h>
@ -128,6 +129,32 @@ void cpuidle_use_deepest_state(bool enable)
preempt_enable();
}
static void set_uds_callback(void *info)
{
bool enable = *(bool *)info;
cpuidle_use_deepest_state(enable);
}
/**
* cpuidle_use_deepest_state_mask - Set use_deepest_state on specific CPUs.
* @target: cpumask of CPUs to update use_deepest_state on.
* @enable: whether to enforce the deepest idle state on those CPUs.
*/
int cpuidle_use_deepest_state_mask(const struct cpumask *target, bool enable)
{
bool *info = kmalloc(sizeof(bool), GFP_KERNEL);
if (!info)
return -ENOMEM;
*info = enable;
on_each_cpu_mask(target, set_uds_callback, info, 1);
kfree(info);
return 0;
}
/**
* cpuidle_find_deepest_state - Find the deepest available idle state.
* @drv: cpuidle driver for the given CPU.

View file

@ -199,6 +199,8 @@ extern int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
extern int cpuidle_enter_freeze(struct cpuidle_driver *drv,
struct cpuidle_device *dev);
extern void cpuidle_use_deepest_state(bool enable);
extern int cpuidle_use_deepest_state_mask(const struct cpumask *target,
bool enable);
#else
static inline int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
struct cpuidle_device *dev)
@ -209,6 +211,11 @@ static inline int cpuidle_enter_freeze(struct cpuidle_driver *drv,
static inline void cpuidle_use_deepest_state(bool enable)
{
}
static inline int cpuidle_use_deepest_state_mask(const struct cpumask *target,
bool enable)
{
return -ENODEV;
}
#endif
/* kernel/sched/idle.c */