Update the flags passed for building the scheduler topology based on llc_override.
SD_SHARE_LLC is used to determine the highest domain where the LLC is. Also when set at a particular domain, all the child domains are expected to have it set as well. Signed-off-by: Shrikanth Hegde <[email protected]> --- arch/powerpc/kernel/smp.c | 41 +++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 6b1201ea3572..ca1821dedc98 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -1007,6 +1007,12 @@ static int powerpc_smt_flags(void) */ static __ro_after_init DEFINE_STATIC_KEY_FALSE(splpar_asym_pack); +static int llc_override; +enum llc_override_values { + LLC_OVERRIDE_MC = 1, + LLC_OVERRIDE_PKG = 2, +}; + /* * P9 has a slightly odd architecture where pairs of cores share an L2 cache. * This topology makes it *much* cheaper to migrate tasks between adjacent cores @@ -1021,12 +1027,30 @@ static int powerpc_shared_cache_flags(void) return SD_SHARE_LLC; } -static int powerpc_shared_proc_flags(void) +static int powerpc_mc_flags(void) { + int flags = 0; + if (static_branch_unlikely(&splpar_asym_pack)) - return SD_ASYM_PACKING; + flags |= SD_ASYM_PACKING; - return 0; + if (READ_ONCE(llc_override) >= LLC_OVERRIDE_MC) + flags |= SD_SHARE_LLC; + + return flags; +} + +static int powerpc_pkg_flags(void) +{ + int flags = 0; + + if (static_branch_unlikely(&splpar_asym_pack)) + flags |= SD_ASYM_PACKING; + + if (READ_ONCE(llc_override) >= LLC_OVERRIDE_PKG) + flags |= SD_SHARE_LLC; + + return flags; } /* @@ -1059,13 +1083,6 @@ static bool has_coregroup_support(void) return coregroup_enabled; } -enum llc_override_values { - LLC_OVERRIDE_MC = 1, - LLC_OVERRIDE_PKG = 2, -}; - -static int llc_override; - static int __init set_llc_override(char *str) { if (!strcasecmp(str, "mc") && has_coregroup_support()) @@ -1759,10 +1776,10 @@ static void __init build_sched_topology(void) if (has_coregroup_support()) { powerpc_topology[i++] = - SDTL_INIT(tl_mc_mask, powerpc_shared_proc_flags, MC); + SDTL_INIT(tl_mc_mask, powerpc_mc_flags, MC); } - powerpc_topology[i++] = SDTL_INIT(tl_pkg_mask, powerpc_shared_proc_flags, PKG); + powerpc_topology[i++] = SDTL_INIT(tl_pkg_mask, powerpc_pkg_flags, PKG); /* There must be one trailing NULL entry left. */ BUG_ON(i >= ARRAY_SIZE(powerpc_topology) - 1); -- 2.52.0
