Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions arch/arm/include/asm/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#ifndef CONFIG_BL_SWITCHER
/* Replace task scheduler's default frequency-invariant accounting */
#define arch_set_freq_scale topology_set_freq_scale
#define arch_update_freq_ref topology_update_freq_ref
#define arch_scale_freq_capacity topology_get_freq_scale
#define arch_scale_freq_invariant topology_scale_freq_invariant
#define arch_scale_freq_ref topology_get_freq_ref
Expand Down
1 change: 1 addition & 0 deletions arch/arm64/include/asm/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ void update_freq_counters_refs(void);
/* Replace task scheduler's default frequency-invariant accounting */
#define arch_scale_freq_tick topology_scale_freq_tick
#define arch_set_freq_scale topology_set_freq_scale
#define arch_update_freq_ref topology_update_freq_ref
#define arch_scale_freq_capacity topology_get_freq_scale
#define arch_scale_freq_invariant topology_scale_freq_invariant
#define arch_scale_freq_ref topology_get_freq_ref
Expand Down
3 changes: 1 addition & 2 deletions arch/arm64/kernel/topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,7 @@ int arch_freq_get_on_cpu(int cpu)
* (see amu_scale_freq_tick for details)
*/
scale = arch_scale_freq_capacity(cpu);
freq = scale * arch_scale_freq_ref(cpu);
freq >>= SCHED_CAPACITY_SHIFT;
freq = (scale * arch_scale_freq_ref(cpu)) >> SCHED_CAPACITY_SHIFT;
return freq;
}

Expand Down
1 change: 1 addition & 0 deletions arch/riscv/include/asm/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
/* Replace task scheduler's default frequency-invariant accounting */
#define arch_scale_freq_tick topology_scale_freq_tick
#define arch_set_freq_scale topology_set_freq_scale
#define arch_update_freq_ref topology_update_freq_ref
#define arch_scale_freq_capacity topology_get_freq_scale
#define arch_scale_freq_invariant topology_scale_freq_invariant
#define arch_scale_freq_ref topology_get_freq_ref
Expand Down
19 changes: 13 additions & 6 deletions drivers/base/arch_topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,18 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
return !ret;
}

void topology_update_freq_ref(const struct cpumask *cpus, unsigned int max_freq)
{
int cpu;

for_each_cpu(cpu, cpus) {
per_cpu(capacity_freq_ref, cpu) = max_freq;
freq_inv_set_max_ratio(cpu,
per_cpu(capacity_freq_ref, cpu) * HZ_PER_KHZ);
}
}
EXPORT_SYMBOL_GPL(topology_update_freq_ref);

void __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
{
}
Expand Down Expand Up @@ -392,7 +404,6 @@ init_cpu_capacity_callback(struct notifier_block *nb,
void *data)
{
struct cpufreq_policy *policy = data;
int cpu;

if (val != CPUFREQ_CREATE_POLICY)
return 0;
Expand All @@ -403,11 +414,7 @@ init_cpu_capacity_callback(struct notifier_block *nb,

cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);

for_each_cpu(cpu, policy->related_cpus) {
per_cpu(capacity_freq_ref, cpu) = policy->cpuinfo.max_freq;
freq_inv_set_max_ratio(cpu,
per_cpu(capacity_freq_ref, cpu) * HZ_PER_KHZ);
}
topology_update_freq_ref(policy->related_cpus, policy->cpuinfo.max_freq);

if (cpumask_empty(cpus_to_visit)) {
if (raw_capacity) {
Expand Down
2 changes: 2 additions & 0 deletions drivers/cpufreq/cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,8 @@ static int policy_set_boost(struct cpufreq_policy *policy, bool enable)
return ret;
}

arch_update_freq_ref(policy->related_cpus, policy->cpuinfo.max_freq);

return 0;
}

Expand Down
1 change: 1 addition & 0 deletions include/linux/arch_topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ static inline unsigned long topology_get_freq_scale(int cpu)

void topology_set_freq_scale(const struct cpumask *cpus, unsigned long cur_freq,
unsigned long max_freq);
void topology_update_freq_ref(const struct cpumask *cpus, unsigned int max_freq);
bool topology_scale_freq_invariant(void);

enum scale_freq_source {
Expand Down
7 changes: 7 additions & 0 deletions include/linux/cpufreq.h
Original file line number Diff line number Diff line change
Expand Up @@ -1235,6 +1235,13 @@ void arch_set_freq_scale(const struct cpumask *cpus,
}
#endif

#ifndef arch_update_freq_ref
static __always_inline
void arch_update_freq_ref(const struct cpumask *cpus, unsigned int max_freq)
{
}
#endif

/* the following are really really optional */
extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
Expand Down
Loading