mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-27 21:15:04 +07:00
powerpc/smp: Create coregroup domain
Add percpu coregroup maps and masks to create coregroup domain. If a coregroup doesn't exist, the coregroup domain will be degenerated in favour of SMT/CACHE domain. Do note this patch is only creating stubs for cpu_to_coregroup_id. The actual cpu_to_coregroup_id implementation would be in a subsequent patch. Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200810071834.92514-10-srikar@linux.vnet.ibm.com
This commit is contained in:
parent
6e08630281
commit
72730bfc2a
@ -88,12 +88,22 @@ static inline int cpu_distance(__be32 *cpu1_assoc, __be32 *cpu2_assoc)
|
|||||||
|
|
||||||
#if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR)
|
#if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR)
|
||||||
extern int find_and_online_cpu_nid(int cpu);
|
extern int find_and_online_cpu_nid(int cpu);
|
||||||
|
extern int cpu_to_coregroup_id(int cpu);
|
||||||
#else
|
#else
|
||||||
static inline int find_and_online_cpu_nid(int cpu)
|
static inline int find_and_online_cpu_nid(int cpu)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int cpu_to_coregroup_id(int cpu)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
return cpu_to_core_id(cpu);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
|
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
|
||||||
|
|
||||||
#include <asm-generic/topology.h>
|
#include <asm-generic/topology.h>
|
||||||
|
@ -81,12 +81,22 @@ DEFINE_PER_CPU(cpumask_var_t, cpu_sibling_map);
|
|||||||
DEFINE_PER_CPU(cpumask_var_t, cpu_smallcore_map);
|
DEFINE_PER_CPU(cpumask_var_t, cpu_smallcore_map);
|
||||||
DEFINE_PER_CPU(cpumask_var_t, cpu_l2_cache_map);
|
DEFINE_PER_CPU(cpumask_var_t, cpu_l2_cache_map);
|
||||||
DEFINE_PER_CPU(cpumask_var_t, cpu_core_map);
|
DEFINE_PER_CPU(cpumask_var_t, cpu_core_map);
|
||||||
|
DEFINE_PER_CPU(cpumask_var_t, cpu_coregroup_map);
|
||||||
|
|
||||||
EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
|
EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
|
||||||
EXPORT_PER_CPU_SYMBOL(cpu_l2_cache_map);
|
EXPORT_PER_CPU_SYMBOL(cpu_l2_cache_map);
|
||||||
EXPORT_PER_CPU_SYMBOL(cpu_core_map);
|
EXPORT_PER_CPU_SYMBOL(cpu_core_map);
|
||||||
EXPORT_SYMBOL_GPL(has_big_cores);
|
EXPORT_SYMBOL_GPL(has_big_cores);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
#ifdef CONFIG_SCHED_SMT
|
||||||
|
smt_idx,
|
||||||
|
#endif
|
||||||
|
cache_idx,
|
||||||
|
mc_idx,
|
||||||
|
die_idx,
|
||||||
|
};
|
||||||
|
|
||||||
#define MAX_THREAD_LIST_SIZE 8
|
#define MAX_THREAD_LIST_SIZE 8
|
||||||
#define THREAD_GROUP_SHARE_L1 1
|
#define THREAD_GROUP_SHARE_L1 1
|
||||||
struct thread_groups {
|
struct thread_groups {
|
||||||
@ -862,11 +872,27 @@ static const struct cpumask *smallcore_smt_mask(int cpu)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static struct cpumask *cpu_coregroup_mask(int cpu)
|
||||||
|
{
|
||||||
|
return per_cpu(cpu_coregroup_map, cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool has_coregroup_support(void)
|
||||||
|
{
|
||||||
|
return coregroup_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct cpumask *cpu_mc_mask(int cpu)
|
||||||
|
{
|
||||||
|
return cpu_coregroup_mask(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
static struct sched_domain_topology_level powerpc_topology[] = {
|
static struct sched_domain_topology_level powerpc_topology[] = {
|
||||||
#ifdef CONFIG_SCHED_SMT
|
#ifdef CONFIG_SCHED_SMT
|
||||||
{ cpu_smt_mask, powerpc_smt_flags, SD_INIT_NAME(SMT) },
|
{ cpu_smt_mask, powerpc_smt_flags, SD_INIT_NAME(SMT) },
|
||||||
#endif
|
#endif
|
||||||
{ shared_cache_mask, powerpc_shared_cache_flags, SD_INIT_NAME(CACHE) },
|
{ shared_cache_mask, powerpc_shared_cache_flags, SD_INIT_NAME(CACHE) },
|
||||||
|
{ cpu_mc_mask, SD_INIT_NAME(MC) },
|
||||||
{ cpu_cpu_mask, SD_INIT_NAME(DIE) },
|
{ cpu_cpu_mask, SD_INIT_NAME(DIE) },
|
||||||
{ NULL, },
|
{ NULL, },
|
||||||
};
|
};
|
||||||
@ -913,6 +939,10 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
GFP_KERNEL, cpu_to_node(cpu));
|
GFP_KERNEL, cpu_to_node(cpu));
|
||||||
zalloc_cpumask_var_node(&per_cpu(cpu_core_map, cpu),
|
zalloc_cpumask_var_node(&per_cpu(cpu_core_map, cpu),
|
||||||
GFP_KERNEL, cpu_to_node(cpu));
|
GFP_KERNEL, cpu_to_node(cpu));
|
||||||
|
if (has_coregroup_support())
|
||||||
|
zalloc_cpumask_var_node(&per_cpu(cpu_coregroup_map, cpu),
|
||||||
|
GFP_KERNEL, cpu_to_node(cpu));
|
||||||
|
|
||||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||||
/*
|
/*
|
||||||
* numa_node_id() works after this.
|
* numa_node_id() works after this.
|
||||||
@ -930,6 +960,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
cpumask_set_cpu(boot_cpuid, cpu_l2_cache_mask(boot_cpuid));
|
cpumask_set_cpu(boot_cpuid, cpu_l2_cache_mask(boot_cpuid));
|
||||||
cpumask_set_cpu(boot_cpuid, cpu_core_mask(boot_cpuid));
|
cpumask_set_cpu(boot_cpuid, cpu_core_mask(boot_cpuid));
|
||||||
|
|
||||||
|
if (has_coregroup_support())
|
||||||
|
cpumask_set_cpu(boot_cpuid, cpu_coregroup_mask(boot_cpuid));
|
||||||
|
|
||||||
init_big_cores();
|
init_big_cores();
|
||||||
if (has_big_cores) {
|
if (has_big_cores) {
|
||||||
cpumask_set_cpu(boot_cpuid,
|
cpumask_set_cpu(boot_cpuid,
|
||||||
@ -1234,6 +1267,8 @@ static void remove_cpu_from_masks(int cpu)
|
|||||||
set_cpus_unrelated(cpu, i, cpu_sibling_mask);
|
set_cpus_unrelated(cpu, i, cpu_sibling_mask);
|
||||||
if (has_big_cores)
|
if (has_big_cores)
|
||||||
set_cpus_unrelated(cpu, i, cpu_smallcore_mask);
|
set_cpus_unrelated(cpu, i, cpu_smallcore_mask);
|
||||||
|
if (has_coregroup_support())
|
||||||
|
set_cpus_unrelated(cpu, i, cpu_coregroup_mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1294,6 +1329,20 @@ static void add_cpu_to_masks(int cpu)
|
|||||||
add_cpu_to_smallcore_masks(cpu);
|
add_cpu_to_smallcore_masks(cpu);
|
||||||
update_mask_by_l2(cpu, cpu_l2_cache_mask);
|
update_mask_by_l2(cpu, cpu_l2_cache_mask);
|
||||||
|
|
||||||
|
if (has_coregroup_support()) {
|
||||||
|
int coregroup_id = cpu_to_coregroup_id(cpu);
|
||||||
|
|
||||||
|
cpumask_set_cpu(cpu, cpu_coregroup_mask(cpu));
|
||||||
|
for_each_cpu_and(i, cpu_online_mask, cpu_cpu_mask(cpu)) {
|
||||||
|
int fcpu = cpu_first_thread_sibling(i);
|
||||||
|
|
||||||
|
if (fcpu == first_thread)
|
||||||
|
set_cpus_related(cpu, i, cpu_coregroup_mask);
|
||||||
|
else if (coregroup_id == cpu_to_coregroup_id(i))
|
||||||
|
set_cpus_related(cpu, i, cpu_coregroup_mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pkg_id == -1) {
|
if (pkg_id == -1) {
|
||||||
struct cpumask *(*mask)(int) = cpu_sibling_mask;
|
struct cpumask *(*mask)(int) = cpu_sibling_mask;
|
||||||
|
|
||||||
@ -1388,9 +1437,12 @@ static void fixup_topology(void)
|
|||||||
#ifdef CONFIG_SCHED_SMT
|
#ifdef CONFIG_SCHED_SMT
|
||||||
if (has_big_cores) {
|
if (has_big_cores) {
|
||||||
pr_info("Big cores detected but using small core scheduling\n");
|
pr_info("Big cores detected but using small core scheduling\n");
|
||||||
powerpc_topology[0].mask = smallcore_smt_mask;
|
powerpc_topology[smt_idx].mask = smallcore_smt_mask;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!has_coregroup_support())
|
||||||
|
powerpc_topology[mc_idx].mask = powerpc_topology[cache_idx].mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init smp_cpus_done(unsigned int max_cpus)
|
void __init smp_cpus_done(unsigned int max_cpus)
|
||||||
|
@ -1245,6 +1245,11 @@ int find_and_online_cpu_nid(int cpu)
|
|||||||
return new_nid;
|
return new_nid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cpu_to_coregroup_id(int cpu)
|
||||||
|
{
|
||||||
|
return cpu_to_core_id(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
static int topology_update_init(void)
|
static int topology_update_init(void)
|
||||||
{
|
{
|
||||||
topology_inited = 1;
|
topology_inited = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user