| From foo@baz Thu Nov 9 09:48:01 CET 2017 |
| From: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Date: Thu, 29 Dec 2016 13:52:52 +0100 |
| Subject: s390/topology: make "topology=off" parameter work |
| |
| From: Heiko Carstens <heiko.carstens@de.ibm.com> |
| |
| |
| [ Upstream commit 68cc795d1933285705ced6d841ef66c00ce98cbe ] |
| |
| The "topology=off" kernel parameter is supposed to prevent the kernel |
| to use hardware topology information to generate scheduling domains |
| etc. |
| For an unknown reason I implemented this in a very odd way back then: |
| instead of simply clearing the MACHINE_HAS_TOPOLOGY flag within the |
| lowcore I added a second variable which indicated that topology |
| information should not be used. This is more than suboptimal since it |
| partially doesn't work. For the fake NUMA case topology information |
| is still considered and scheduling domains will be created based on |
| this. |
| To fix this and to simplify the code get rid of the extra variable and |
| implement the "topology=off" case like it is done for other features. |
| |
| Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/s390/kernel/early.c | 12 ++++++++++++ |
| arch/s390/kernel/topology.c | 11 ++--------- |
| 2 files changed, 14 insertions(+), 9 deletions(-) |
| |
| --- a/arch/s390/kernel/early.c |
| +++ b/arch/s390/kernel/early.c |
| @@ -363,6 +363,18 @@ static inline void save_vector_registers |
| #endif |
| } |
| |
| +static int __init topology_setup(char *str) |
| +{ |
| + bool enabled; |
| + int rc; |
| + |
| + rc = kstrtobool(str, &enabled); |
| + if (!rc && !enabled) |
| + S390_lowcore.machine_flags &= ~MACHINE_HAS_TOPOLOGY; |
| + return rc; |
| +} |
| +early_param("topology", topology_setup); |
| + |
| static int __init disable_vector_extension(char *str) |
| { |
| S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX; |
| --- a/arch/s390/kernel/topology.c |
| +++ b/arch/s390/kernel/topology.c |
| @@ -37,7 +37,6 @@ static void set_topology_timer(void); |
| static void topology_work_fn(struct work_struct *work); |
| static struct sysinfo_15_1_x *tl_info; |
| |
| -static bool topology_enabled = true; |
| static DECLARE_WORK(topology_work, topology_work_fn); |
| |
| /* |
| @@ -56,7 +55,7 @@ static cpumask_t cpu_group_map(struct ma |
| cpumask_t mask; |
| |
| cpumask_copy(&mask, cpumask_of(cpu)); |
| - if (!topology_enabled || !MACHINE_HAS_TOPOLOGY) |
| + if (!MACHINE_HAS_TOPOLOGY) |
| return mask; |
| for (; info; info = info->next) { |
| if (cpumask_test_cpu(cpu, &info->mask)) |
| @@ -71,7 +70,7 @@ static cpumask_t cpu_thread_map(unsigned |
| int i; |
| |
| cpumask_copy(&mask, cpumask_of(cpu)); |
| - if (!topology_enabled || !MACHINE_HAS_TOPOLOGY) |
| + if (!MACHINE_HAS_TOPOLOGY) |
| return mask; |
| cpu -= cpu % (smp_cpu_mtid + 1); |
| for (i = 0; i <= smp_cpu_mtid; i++) |
| @@ -413,12 +412,6 @@ static const struct cpumask *cpu_drawer_ |
| return &per_cpu(cpu_topology, cpu).drawer_mask; |
| } |
| |
| -static int __init early_parse_topology(char *p) |
| -{ |
| - return kstrtobool(p, &topology_enabled); |
| -} |
| -early_param("topology", early_parse_topology); |
| - |
| static struct sched_domain_topology_level s390_topology[] = { |
| { cpu_thread_mask, cpu_smt_flags, SD_INIT_NAME(SMT) }, |
| { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) }, |