|
@@ -99,8 +99,7 @@ static DEFINE_PER_CPU(struct cpu_dbs_info_s, od_cpu_dbs_info);
|
|
|
static unsigned int dbs_enable; /* number of CPUs using this policy */
|
|
|
|
|
|
/*
|
|
|
- * dbs_mutex protects data in dbs_tuners_ins from concurrent changes on
|
|
|
- * different CPUs. It protects dbs_enable in governor start/stop.
|
|
|
+ * dbs_mutex protects dbs_enable in governor start/stop.
|
|
|
*/
|
|
|
static DEFINE_MUTEX(dbs_mutex);
|
|
|
|
|
@@ -235,21 +234,12 @@ static void ondemand_powersave_bias_init(void)
|
|
|
|
|
|
/************************** sysfs interface ************************/
|
|
|
|
|
|
-static ssize_t show_sampling_rate_max(struct kobject *kobj,
|
|
|
- struct attribute *attr, char *buf)
|
|
|
-{
|
|
|
- printk_once(KERN_INFO "CPUFREQ: ondemand sampling_rate_max "
|
|
|
- "sysfs file is deprecated - used by: %s\n", current->comm);
|
|
|
- return sprintf(buf, "%u\n", -1U);
|
|
|
-}
|
|
|
-
|
|
|
static ssize_t show_sampling_rate_min(struct kobject *kobj,
|
|
|
struct attribute *attr, char *buf)
|
|
|
{
|
|
|
return sprintf(buf, "%u\n", min_sampling_rate);
|
|
|
}
|
|
|
|
|
|
-define_one_global_ro(sampling_rate_max);
|
|
|
define_one_global_ro(sampling_rate_min);
|
|
|
|
|
|
/* cpufreq_ondemand Governor Tunables */
|
|
@@ -266,32 +256,6 @@ show_one(sampling_down_factor, sampling_down_factor);
|
|
|
show_one(ignore_nice_load, ignore_nice);
|
|
|
show_one(powersave_bias, powersave_bias);
|
|
|
|
|
|
-/*** delete after deprecation time ***/
|
|
|
-
|
|
|
-#define DEPRECATION_MSG(file_name) \
|
|
|
- printk_once(KERN_INFO "CPUFREQ: Per core ondemand sysfs " \
|
|
|
- "interface is deprecated - " #file_name "\n");
|
|
|
-
|
|
|
-#define show_one_old(file_name) \
|
|
|
-static ssize_t show_##file_name##_old \
|
|
|
-(struct cpufreq_policy *unused, char *buf) \
|
|
|
-{ \
|
|
|
- printk_once(KERN_INFO "CPUFREQ: Per core ondemand sysfs " \
|
|
|
- "interface is deprecated - " #file_name "\n"); \
|
|
|
- return show_##file_name(NULL, NULL, buf); \
|
|
|
-}
|
|
|
-show_one_old(sampling_rate);
|
|
|
-show_one_old(up_threshold);
|
|
|
-show_one_old(ignore_nice_load);
|
|
|
-show_one_old(powersave_bias);
|
|
|
-show_one_old(sampling_rate_min);
|
|
|
-show_one_old(sampling_rate_max);
|
|
|
-
|
|
|
-cpufreq_freq_attr_ro_old(sampling_rate_min);
|
|
|
-cpufreq_freq_attr_ro_old(sampling_rate_max);
|
|
|
-
|
|
|
-/*** delete after deprecation time ***/
|
|
|
-
|
|
|
static ssize_t store_sampling_rate(struct kobject *a, struct attribute *b,
|
|
|
const char *buf, size_t count)
|
|
|
{
|
|
@@ -300,11 +264,7 @@ static ssize_t store_sampling_rate(struct kobject *a, struct attribute *b,
|
|
|
ret = sscanf(buf, "%u", &input);
|
|
|
if (ret != 1)
|
|
|
return -EINVAL;
|
|
|
-
|
|
|
- mutex_lock(&dbs_mutex);
|
|
|
dbs_tuners_ins.sampling_rate = max(input, min_sampling_rate);
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -317,11 +277,7 @@ static ssize_t store_io_is_busy(struct kobject *a, struct attribute *b,
|
|
|
ret = sscanf(buf, "%u", &input);
|
|
|
if (ret != 1)
|
|
|
return -EINVAL;
|
|
|
-
|
|
|
- mutex_lock(&dbs_mutex);
|
|
|
dbs_tuners_ins.io_is_busy = !!input;
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -336,11 +292,7 @@ static ssize_t store_up_threshold(struct kobject *a, struct attribute *b,
|
|
|
input < MIN_FREQUENCY_UP_THRESHOLD) {
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
-
|
|
|
- mutex_lock(&dbs_mutex);
|
|
|
dbs_tuners_ins.up_threshold = input;
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -353,7 +305,6 @@ static ssize_t store_sampling_down_factor(struct kobject *a,
|
|
|
|
|
|
if (ret != 1 || input > MAX_SAMPLING_DOWN_FACTOR || input < 1)
|
|
|
return -EINVAL;
|
|
|
- mutex_lock(&dbs_mutex);
|
|
|
dbs_tuners_ins.sampling_down_factor = input;
|
|
|
|
|
|
/* Reset down sampling multiplier in case it was active */
|
|
@@ -362,8 +313,6 @@ static ssize_t store_sampling_down_factor(struct kobject *a,
|
|
|
dbs_info = &per_cpu(od_cpu_dbs_info, j);
|
|
|
dbs_info->rate_mult = 1;
|
|
|
}
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -382,9 +331,7 @@ static ssize_t store_ignore_nice_load(struct kobject *a, struct attribute *b,
|
|
|
if (input > 1)
|
|
|
input = 1;
|
|
|
|
|
|
- mutex_lock(&dbs_mutex);
|
|
|
if (input == dbs_tuners_ins.ignore_nice) { /* nothing to do */
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
return count;
|
|
|
}
|
|
|
dbs_tuners_ins.ignore_nice = input;
|
|
@@ -399,8 +346,6 @@ static ssize_t store_ignore_nice_load(struct kobject *a, struct attribute *b,
|
|
|
dbs_info->prev_cpu_nice = kstat_cpu(j).cpustat.nice;
|
|
|
|
|
|
}
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -417,11 +362,8 @@ static ssize_t store_powersave_bias(struct kobject *a, struct attribute *b,
|
|
|
if (input > 1000)
|
|
|
input = 1000;
|
|
|
|
|
|
- mutex_lock(&dbs_mutex);
|
|
|
dbs_tuners_ins.powersave_bias = input;
|
|
|
ondemand_powersave_bias_init();
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -433,7 +375,6 @@ define_one_global_rw(ignore_nice_load);
|
|
|
define_one_global_rw(powersave_bias);
|
|
|
|
|
|
static struct attribute *dbs_attributes[] = {
|
|
|
- &sampling_rate_max.attr,
|
|
|
&sampling_rate_min.attr,
|
|
|
&sampling_rate.attr,
|
|
|
&up_threshold.attr,
|
|
@@ -449,43 +390,6 @@ static struct attribute_group dbs_attr_group = {
|
|
|
.name = "ondemand",
|
|
|
};
|
|
|
|
|
|
-/*** delete after deprecation time ***/
|
|
|
-
|
|
|
-#define write_one_old(file_name) \
|
|
|
-static ssize_t store_##file_name##_old \
|
|
|
-(struct cpufreq_policy *unused, const char *buf, size_t count) \
|
|
|
-{ \
|
|
|
- printk_once(KERN_INFO "CPUFREQ: Per core ondemand sysfs " \
|
|
|
- "interface is deprecated - " #file_name "\n"); \
|
|
|
- return store_##file_name(NULL, NULL, buf, count); \
|
|
|
-}
|
|
|
-write_one_old(sampling_rate);
|
|
|
-write_one_old(up_threshold);
|
|
|
-write_one_old(ignore_nice_load);
|
|
|
-write_one_old(powersave_bias);
|
|
|
-
|
|
|
-cpufreq_freq_attr_rw_old(sampling_rate);
|
|
|
-cpufreq_freq_attr_rw_old(up_threshold);
|
|
|
-cpufreq_freq_attr_rw_old(ignore_nice_load);
|
|
|
-cpufreq_freq_attr_rw_old(powersave_bias);
|
|
|
-
|
|
|
-static struct attribute *dbs_attributes_old[] = {
|
|
|
- &sampling_rate_max_old.attr,
|
|
|
- &sampling_rate_min_old.attr,
|
|
|
- &sampling_rate_old.attr,
|
|
|
- &up_threshold_old.attr,
|
|
|
- &ignore_nice_load_old.attr,
|
|
|
- &powersave_bias_old.attr,
|
|
|
- NULL
|
|
|
-};
|
|
|
-
|
|
|
-static struct attribute_group dbs_attr_group_old = {
|
|
|
- .attrs = dbs_attributes_old,
|
|
|
- .name = "ondemand",
|
|
|
-};
|
|
|
-
|
|
|
-/*** delete after deprecation time ***/
|
|
|
-
|
|
|
/************************** sysfs end ************************/
|
|
|
|
|
|
static void dbs_freq_increase(struct cpufreq_policy *p, unsigned int freq)
|
|
@@ -642,12 +546,7 @@ static void do_dbs_timer(struct work_struct *work)
|
|
|
unsigned int cpu = dbs_info->cpu;
|
|
|
int sample_type = dbs_info->sample_type;
|
|
|
|
|
|
- /* We want all CPUs to do sampling nearly on same jiffy */
|
|
|
- int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate
|
|
|
- * dbs_info->rate_mult);
|
|
|
-
|
|
|
- if (num_online_cpus() > 1)
|
|
|
- delay -= jiffies % delay;
|
|
|
+ int delay;
|
|
|
|
|
|
mutex_lock(&dbs_info->timer_mutex);
|
|
|
|
|
@@ -660,10 +559,20 @@ static void do_dbs_timer(struct work_struct *work)
|
|
|
/* Setup timer for SUB_SAMPLE */
|
|
|
dbs_info->sample_type = DBS_SUB_SAMPLE;
|
|
|
delay = dbs_info->freq_hi_jiffies;
|
|
|
+ } else {
|
|
|
+ /* We want all CPUs to do sampling nearly on
|
|
|
+ * same jiffy
|
|
|
+ */
|
|
|
+ delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate
|
|
|
+ * dbs_info->rate_mult);
|
|
|
+
|
|
|
+ if (num_online_cpus() > 1)
|
|
|
+ delay -= jiffies % delay;
|
|
|
}
|
|
|
} else {
|
|
|
__cpufreq_driver_target(dbs_info->cur_policy,
|
|
|
dbs_info->freq_lo, CPUFREQ_RELATION_H);
|
|
|
+ delay = dbs_info->freq_lo_jiffies;
|
|
|
}
|
|
|
schedule_delayed_work_on(cpu, &dbs_info->work, delay);
|
|
|
mutex_unlock(&dbs_info->timer_mutex);
|
|
@@ -727,12 +636,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|
|
|
|
|
mutex_lock(&dbs_mutex);
|
|
|
|
|
|
- rc = sysfs_create_group(&policy->kobj, &dbs_attr_group_old);
|
|
|
- if (rc) {
|
|
|
- mutex_unlock(&dbs_mutex);
|
|
|
- return rc;
|
|
|
- }
|
|
|
-
|
|
|
dbs_enable++;
|
|
|
for_each_cpu(j, policy->cpus) {
|
|
|
struct cpu_dbs_info_s *j_dbs_info;
|
|
@@ -785,7 +688,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|
|
dbs_timer_exit(this_dbs_info);
|
|
|
|
|
|
mutex_lock(&dbs_mutex);
|
|
|
- sysfs_remove_group(&policy->kobj, &dbs_attr_group_old);
|
|
|
mutex_destroy(&this_dbs_info->timer_mutex);
|
|
|
dbs_enable--;
|
|
|
mutex_unlock(&dbs_mutex);
|