From 072de836f53be56a70cecf70b43ae43b7ce17376 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 10:08:36 +0000
Subject: [PATCH] mk-rootfs.sh
---
kernel/drivers/cpufreq/cpufreq_interactive.c | 120 +++++++++---------------------------------------------------
1 files changed, 18 insertions(+), 102 deletions(-)
diff --git a/kernel/drivers/cpufreq/cpufreq_interactive.c b/kernel/drivers/cpufreq/cpufreq_interactive.c
index 06f7679..a486993 100644
--- a/kernel/drivers/cpufreq/cpufreq_interactive.c
+++ b/kernel/drivers/cpufreq/cpufreq_interactive.c
@@ -126,7 +126,6 @@
struct interactive_policy *ipolicy;
struct irq_work irq_work;
- struct irq_work boost_irq_work;
u64 last_sample_time;
unsigned long next_sample_jiffies;
bool work_in_progress;
@@ -149,9 +148,6 @@
u64 pol_hispeed_val_time; /* policy hispeed_validate_time */
u64 loc_hispeed_val_time; /* per-cpu hispeed_validate_time */
int cpu;
- unsigned int task_boost_freq;
- unsigned long task_boost_util;
- u64 task_boos_endtime;
};
static DEFINE_PER_CPU(struct interactive_cpu, interactive_cpu);
@@ -427,9 +423,6 @@
new_freq < tunables->touchboost_freq) {
new_freq = tunables->touchboost_freq;
}
- if ((now < icpu->task_boos_endtime) && (new_freq < icpu->task_boost_freq)) {
- new_freq = icpu->task_boost_freq;
- }
#endif
if (policy->cur >= tunables->hispeed_freq &&
new_freq > policy->cur &&
@@ -676,25 +669,31 @@
unsigned long val, void *data)
{
struct cpufreq_freqs *freq = data;
- struct interactive_cpu *icpu = &per_cpu(interactive_cpu, freq->cpu);
+ struct cpufreq_policy *policy = freq->policy;
+ struct interactive_cpu *icpu;
unsigned long flags;
+ int cpu;
if (val != CPUFREQ_POSTCHANGE)
return 0;
- if (!down_read_trylock(&icpu->enable_sem))
- return 0;
+ for_each_cpu(cpu, policy->cpus) {
+ icpu = &per_cpu(interactive_cpu, cpu);
- if (!icpu->ipolicy) {
+ if (!down_read_trylock(&icpu->enable_sem))
+ continue;
+
+ if (!icpu->ipolicy) {
+ up_read(&icpu->enable_sem);
+ continue;
+ }
+
+ spin_lock_irqsave(&icpu->load_lock, flags);
+ update_load(icpu, cpu);
+ spin_unlock_irqrestore(&icpu->load_lock, flags);
+
up_read(&icpu->enable_sem);
- return 0;
}
-
- spin_lock_irqsave(&icpu->load_lock, flags);
- update_load(icpu, freq->cpu);
- spin_unlock_irqrestore(&icpu->load_lock, flags);
-
- up_read(&icpu->enable_sem);
return 0;
}
@@ -1137,15 +1136,12 @@
for_each_cpu(i, policy->cpus)
cpufreq_remove_update_util_hook(i);
- synchronize_sched();
+ synchronize_rcu();
}
static void icpu_cancel_work(struct interactive_cpu *icpu)
{
irq_work_sync(&icpu->irq_work);
-#ifdef CONFIG_ARCH_ROCKCHIP
- irq_work_sync(&icpu->boost_irq_work);
-#endif
icpu->work_in_progress = false;
del_timer_sync(&icpu->slack_timer);
}
@@ -1368,83 +1364,6 @@
attr_set = tunables->attr_set;
*tunables = backup_tunables[index];
tunables->attr_set = attr_set;
- }
-}
-
-static unsigned int get_freq_for_util(struct cpufreq_policy *policy, unsigned long util)
-{
- struct cpufreq_frequency_table *pos;
- unsigned long max_cap, cur_cap;
- unsigned int freq = 0;
-
- max_cap = arch_scale_cpu_capacity(NULL, policy->cpu);
- cpufreq_for_each_valid_entry(pos, policy->freq_table) {
- freq = pos->frequency;
-
- cur_cap = max_cap * freq / policy->max;
- if (cur_cap > util)
- break;
- }
-
- return freq;
-}
-
-static void task_boost_irq_work(struct irq_work *irq_work)
-{
- struct interactive_cpu *pcpu;
- struct interactive_policy *ipolicy;
- unsigned long flags[2];
- u64 now, prev_boos_endtime;
- unsigned int boost_freq;
-
- pcpu = container_of(irq_work, struct interactive_cpu, boost_irq_work);
- if (!down_read_trylock(&pcpu->enable_sem))
- return;
-
- ipolicy = pcpu->ipolicy;
- if (!ipolicy)
- goto out;
-
- if (ipolicy->policy->cur == ipolicy->policy->max)
- goto out;
-
- now = ktime_to_us(ktime_get());
- prev_boos_endtime = pcpu->task_boos_endtime;;
- pcpu->task_boos_endtime = now + ipolicy->tunables->sampling_rate;
- boost_freq = get_freq_for_util(ipolicy->policy, pcpu->task_boost_util);
- if ((now < prev_boos_endtime) && (boost_freq <= pcpu->task_boost_freq))
- goto out;
- pcpu->task_boost_freq = boost_freq;
-
- spin_lock_irqsave(&speedchange_cpumask_lock, flags[0]);
- spin_lock_irqsave(&pcpu->target_freq_lock, flags[1]);
- if (pcpu->target_freq < pcpu->task_boost_freq) {
- pcpu->target_freq = pcpu->task_boost_freq;
- cpumask_set_cpu(pcpu->cpu, &speedchange_cpumask);
- wake_up_process(speedchange_task);
- }
- spin_unlock_irqrestore(&pcpu->target_freq_lock, flags[1]);
- spin_unlock_irqrestore(&speedchange_cpumask_lock, flags[0]);
-
-out:
- up_read(&pcpu->enable_sem);
-}
-
-extern unsigned long capacity_curr_of(int cpu);
-
-void cpufreq_task_boost(int cpu, unsigned long util)
-{
- struct interactive_cpu *pcpu = &per_cpu(interactive_cpu, cpu);
- unsigned long cap, min_util;
-
- if (!speedchange_task)
- return;
-
- min_util = util + (util >> 2);
- cap = capacity_curr_of(cpu);
- if (min_util > cap) {
- pcpu->task_boost_util = min_util;
- irq_work_queue(&pcpu->boost_irq_work);
}
}
#endif
@@ -1675,9 +1594,6 @@
icpu = &per_cpu(interactive_cpu, cpu);
init_irq_work(&icpu->irq_work, irq_work);
-#ifdef CONFIG_ARCH_ROCKCHIP
- init_irq_work(&icpu->boost_irq_work, task_boost_irq_work);
-#endif
spin_lock_init(&icpu->load_lock);
spin_lock_init(&icpu->target_freq_lock);
init_rwsem(&icpu->enable_sem);
--
Gitblit v1.6.2