Messages in this thread Patch in this message | | | From | "Rafael J. Wysocki" <> | Subject | [RFC][PATCH v1 2/3] x86/sched: Add basic support for CPU capacity scaling | Date | Thu, 25 Apr 2024 21:15:01 +0200 |
| |
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
In order be able to compute the sizes of tasks consistently across all CPUs in a hybrid system, it is necessary to provide CPU capacity scaling information to the scheduler via arch_scale_cpu_capacity().
Add support for it via arch_cpu_scale per-CPU variables that can be set by whoever has sufficient information on the CPU capacities.
By default, arch_cpu_scale is equal to SCHED_CAPACITY_SCALE for all CPUs, so this change by itself is not expected to alter the current behavior of the kernel.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> --- arch/x86/include/asm/topology.h | 15 +++++++++++++++ arch/x86/kernel/smpboot.c | 3 +++ 2 files changed, 18 insertions(+)
Index: linux-pm/arch/x86/include/asm/topology.h =================================================================== --- linux-pm.orig/arch/x86/include/asm/topology.h +++ linux-pm/arch/x86/include/asm/topology.h @@ -280,11 +280,26 @@ static inline long arch_scale_freq_capac } #define arch_scale_freq_capacity arch_scale_freq_capacity +DECLARE_PER_CPU(unsigned long, arch_cpu_scale); + +static inline unsigned long arch_scale_cpu_capacity(int cpu) +{ + return READ_ONCE(per_cpu(arch_cpu_scale, cpu)); +} +#define arch_scale_cpu_capacity arch_scale_cpu_capacity + +static inline void arch_set_cpu_capacity(int cpu, unsigned long cap) +{ + WRITE_ONCE(per_cpu(arch_cpu_scale, cpu), cap); +} + extern void arch_set_max_freq_ratio(bool turbo_disabled); extern void freq_invariance_set_perf_ratio(u64 ratio, bool turbo_disabled); void arch_rebuild_sched_domains(void); #else +static inline void arch_set_cpu_capacity(int cpu, unsigned long cap) { } + static inline void arch_set_max_freq_ratio(bool turbo_disabled) { } static inline void freq_invariance_set_perf_ratio(u64 ratio, bool turbo_disabled) { } Index: linux-pm/arch/x86/kernel/smpboot.c =================================================================== --- linux-pm.orig/arch/x86/kernel/smpboot.c +++ linux-pm/arch/x86/kernel/smpboot.c @@ -141,6 +141,9 @@ void arch_rebuild_sched_domains(void) { x86_topology_update = true; rebuild_sched_domains(); } + +/* CPU capacity scaling support */ +DEFINE_PER_CPU(unsigned long, arch_cpu_scale) = SCHED_CAPACITY_SCALE; #endif static unsigned int smpboot_warm_reset_vector_count;
| |