diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index c0cf9ef5c2f5..bbe3b0237773 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -471,6 +471,26 @@ const struct cpumask *cpu_coregroup_mask(int cpu) return core_mask; } +#ifdef CONFIG_SCHED_WALT +void update_possible_siblings_masks(unsigned int cpuid) +{ + struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; + int cpu; + + if (cpuid_topo->package_id == -1) + return; + + for_each_possible_cpu(cpu) { + cpu_topo = &cpu_topology[cpu]; + + if (cpuid_topo->package_id != cpu_topo->package_id) + continue; + cpumask_set_cpu(cpuid, &cpu_topo->core_possible_sibling); + cpumask_set_cpu(cpu, &cpuid_topo->core_possible_sibling); + } +} +#endif + void update_siblings_masks(unsigned int cpuid) { struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; @@ -550,6 +570,9 @@ __weak int __init parse_acpi_topology(void) #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) void __init init_cpu_topology(void) { +#ifdef CONFIG_SCHED_WALT + int cpu; +#endif reset_cpu_topology(); /* @@ -560,5 +583,11 @@ void __init init_cpu_topology(void) reset_cpu_topology(); else if (of_have_populated_dt() && parse_dt_topology()) reset_cpu_topology(); +#ifdef CONFIG_SCHED_WALT + else { + for_each_possible_cpu(cpu) + update_possible_siblings_masks(cpu); + } +#endif } #endif diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h index 5402bc0e2b1e..883fba81796c 100644 --- a/include/linux/arch_topology.h +++ b/include/linux/arch_topology.h @@ -48,6 +48,9 @@ struct cpu_topology { int llc_id; cpumask_t thread_sibling; cpumask_t core_sibling; +#ifdef CONFIG_SCHED_WALT + cpumask_t core_possible_sibling; +#endif cpumask_t llc_sibling; }; @@ -59,6 +62,10 @@ extern struct cpu_topology cpu_topology[NR_CPUS]; #define topology_core_cpumask(cpu) (&cpu_topology[cpu].core_sibling) #define topology_sibling_cpumask(cpu) (&cpu_topology[cpu].thread_sibling) #define topology_llc_cpumask(cpu) (&cpu_topology[cpu].llc_sibling) +#ifdef CONFIG_SCHED_WALT +#define topology_possible_sibling_cpumask(cpu) \ + (&cpu_topology[cpu].core_possible_sibling) +#endif void init_cpu_topology(void); void store_cpu_topology(unsigned int cpuid); const struct cpumask *cpu_coregroup_mask(int cpu); diff --git a/include/linux/topology.h b/include/linux/topology.h index eb2fe6edd73c..831ad69caee8 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -214,6 +214,9 @@ static inline int cpu_to_mem(int cpu) #ifndef topology_die_cpumask #define topology_die_cpumask(cpu) cpumask_of(cpu) #endif +#ifndef topology_possible_sibling_cpumask +#define topology_possible_sibling_cpumask(cpu) cpumask_of(cpu) +#endif #ifdef CONFIG_SCHED_SMT static inline const struct cpumask *cpu_smt_mask(int cpu)