kernel/sched/walt: kernel space adaptive_low/high_freq values

Add kernel-space adaptive_low_freq and adaptive_high_freq to the
waltgov cpufreq policies, such that kernel space code or vendor
kernel space code can manipulate these values directly.

Set the actual in-use adaptive freq values to the max of the
user space value and the kernel space value.

Change-Id: I59deca1cd60bcd8bd63170e6e1bced63456b41d6
Signed-off-by: Stephen Dickey <quic_dickey@quicinc.com>
This commit is contained in:
Stephen Dickey 2022-08-29 11:14:05 -07:00 committed by Sai Harshini Nimmala
parent 3de224c444
commit d3e9a484ac
2 changed files with 113 additions and 4 deletions

View File

@ -25,6 +25,8 @@ struct waltgov_tunables {
unsigned int rtg_boost_freq;
unsigned int adaptive_low_freq;
unsigned int adaptive_high_freq;
unsigned int adaptive_low_freq_kernel;
unsigned int adaptive_high_freq_kernel;
unsigned int target_load_thresh;
unsigned int target_load_shift;
bool pl;
@ -220,6 +222,18 @@ static inline unsigned long walt_map_util_freq(unsigned long util,
return (fmax + (fmax >> 2)) * util / cap;
}
static inline unsigned int get_adaptive_low_freq(struct waltgov_policy *wg_policy)
{
return(max(wg_policy->tunables->adaptive_low_freq,
wg_policy->tunables->adaptive_low_freq_kernel));
}
static inline unsigned int get_adaptive_high_freq(struct waltgov_policy *wg_policy)
{
return(max(wg_policy->tunables->adaptive_high_freq,
wg_policy->tunables->adaptive_high_freq_kernel));
}
static unsigned int get_next_freq(struct waltgov_policy *wg_policy,
unsigned long util, unsigned long max,
struct waltgov_cpu *wg_cpu, u64 time)
@ -232,11 +246,11 @@ static unsigned int get_next_freq(struct waltgov_policy *wg_policy,
freq = raw_freq;
if (wg_policy->tunables->adaptive_high_freq) {
if (raw_freq < wg_policy->tunables->adaptive_low_freq) {
freq = wg_policy->tunables->adaptive_low_freq;
if (raw_freq < get_adaptive_low_freq(wg_policy)) {
freq = get_adaptive_low_freq(wg_policy);
wg_driv_cpu->reasons = CPUFREQ_REASON_ADAPTIVE_LOW;
} else if (raw_freq <= wg_policy->tunables->adaptive_high_freq) {
freq = wg_policy->tunables->adaptive_high_freq;
} else if (raw_freq <= get_adaptive_high_freq(wg_policy)) {
freq = get_adaptive_high_freq(wg_policy);
wg_driv_cpu->reasons = CPUFREQ_REASON_ADAPTIVE_HIGH;
}
}
@ -669,6 +683,91 @@ static ssize_t boost_store(struct gov_attr_set *attr_set, const char *buf,
return count;
}
/**
* cpufreq_walt_set_adaptive_freq() - set the waltgov adaptive freq for cpu
* @cpu: the cpu for which the values should be set
* @adaptive_low_freq: low freq
* @adaptive_high_freq:high_freq
*
* Configure the adaptive_low/high_freq for the cpu specified. This will impact all
* cpus governed by the policy (e.g. all cpus in a cluster). The actual value used
* for adaptive frequencies will be governed by the user space setting for the
* policy, and this value.
*
* Return: 0 if successful, error otherwise
*/
int cpufreq_walt_set_adaptive_freq(unsigned int cpu, unsigned int adaptive_low_freq,
unsigned int adaptive_high_freq)
{
struct waltgov_cpu *wg_cpu = &per_cpu(waltgov_cpu, cpu);
struct waltgov_policy *wg_policy = wg_cpu->wg_policy;
struct cpufreq_policy *policy = wg_policy->policy;
if (!cpu_possible(cpu))
return -EFAULT;
if (policy->min <= adaptive_low_freq && policy->max >= adaptive_high_freq) {
wg_policy->tunables->adaptive_low_freq_kernel = adaptive_low_freq;
wg_policy->tunables->adaptive_high_freq_kernel = adaptive_high_freq;
return 0;
}
return -EINVAL;
}
EXPORT_SYMBOL(cpufreq_walt_set_adaptive_freq);
/**
* cpufreq_walt_get_adaptive_freq() - get the waltgov adaptive freq for cpu
* @cpu: the cpu for which the values should be returned
* @adaptive_low_freq: pointer to write the current kernel adaptive_low_freq value
* @adaptive_high_freq:pointer to write the current kernel adaptive_high_freq value
*
* Get the currently active adaptive_low/high_freq for the cpu specified.
*
* Return: 0 if successful, error otherwise
*/
int cpufreq_walt_get_adaptive_freq(unsigned int cpu, unsigned int *adaptive_low_freq,
unsigned int *adaptive_high_freq)
{
struct waltgov_cpu *wg_cpu = &per_cpu(waltgov_cpu, cpu);
struct waltgov_policy *wg_policy = wg_cpu->wg_policy;
if (!cpu_possible(cpu))
return -EFAULT;
if (adaptive_low_freq && adaptive_high_freq) {
*adaptive_low_freq = get_adaptive_low_freq(wg_policy);
*adaptive_high_freq = get_adaptive_high_freq(wg_policy);
return 0;
}
return -EINVAL;
}
EXPORT_SYMBOL(cpufreq_walt_get_adaptive_freq);
/**
* cpufreq_walt_reset_adaptive_freq() - reset the waltgov adaptive freq for cpu
* @cpu: the cpu for which the values should be set
*
* Reset the kernel adaptive_low/high_freq to zero.
*
* Return: 0 if successful, error otherwise
*/
int cpufreq_walt_reset_adaptive_freq(unsigned int cpu)
{
struct waltgov_cpu *wg_cpu = &per_cpu(waltgov_cpu, cpu);
struct waltgov_policy *wg_policy = wg_cpu->wg_policy;
if (!cpu_possible(cpu))
return -EFAULT;
wg_policy->tunables->adaptive_low_freq_kernel = 0;
wg_policy->tunables->adaptive_high_freq_kernel = 0;
return 0;
}
EXPORT_SYMBOL(cpufreq_walt_reset_adaptive_freq);
#define WALTGOV_ATTR_RW(_name) \
static struct governor_attr _name = \
__ATTR(_name, 0644, show_##_name, store_##_name) \
@ -826,6 +925,8 @@ static void waltgov_tunables_save(struct cpufreq_policy *policy,
cached->boost = tunables->boost;
cached->adaptive_low_freq = tunables->adaptive_low_freq;
cached->adaptive_high_freq = tunables->adaptive_high_freq;
cached->adaptive_low_freq_kernel = tunables->adaptive_low_freq_kernel;
cached->adaptive_high_freq_kernel = tunables->adaptive_high_freq_kernel;
cached->target_load_thresh = tunables->target_load_thresh;
cached->target_load_shift = tunables->target_load_shift;
}
@ -848,6 +949,8 @@ static void waltgov_tunables_restore(struct cpufreq_policy *policy)
tunables->boost = cached->boost;
tunables->adaptive_low_freq = cached->adaptive_low_freq;
tunables->adaptive_high_freq = cached->adaptive_high_freq;
tunables->adaptive_low_freq_kernel = cached->adaptive_low_freq_kernel;
tunables->adaptive_high_freq_kernel = cached->adaptive_high_freq_kernel;
tunables->target_load_thresh = cached->target_load_thresh;
tunables->target_load_shift = cached->target_load_shift;
}

View File

@ -221,6 +221,12 @@ extern unsigned int sysctl_sched_hyst_min_coloc_ns;
extern unsigned int sysctl_sched_long_running_rt_task_ms;
extern unsigned int sysctl_ed_boost_pct;
extern int cpufreq_walt_set_adaptive_freq(unsigned int cpu, unsigned int adaptive_low_freq,
unsigned int adaptive_high_freq);
extern int cpufreq_walt_get_adaptive_freq(unsigned int cpu, unsigned int *adaptive_low_freq,
unsigned int *adaptive_high_freq);
extern int cpufreq_walt_reset_adaptive_freq(unsigned int cpu);
#define WALT_MANY_WAKEUP_DEFAULT 1000
extern unsigned int sysctl_sched_many_wakeup_threshold;
extern unsigned int sysctl_walt_rtg_cfs_boost_prio;