|
@@ -105,6 +105,9 @@ static unsigned int max_physical_pkg_id __read_mostly;
|
|
unsigned int __max_logical_packages __read_mostly;
|
|
unsigned int __max_logical_packages __read_mostly;
|
|
EXPORT_SYMBOL(__max_logical_packages);
|
|
EXPORT_SYMBOL(__max_logical_packages);
|
|
|
|
|
|
|
|
+/* Maximum number of SMT threads on any online core */
|
|
|
|
+int __max_smt_threads __read_mostly;
|
|
|
|
+
|
|
static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
|
|
static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -493,7 +496,7 @@ void set_cpu_sibling_map(int cpu)
|
|
bool has_mp = has_smt || boot_cpu_data.x86_max_cores > 1;
|
|
bool has_mp = has_smt || boot_cpu_data.x86_max_cores > 1;
|
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
struct cpuinfo_x86 *o;
|
|
struct cpuinfo_x86 *o;
|
|
- int i;
|
|
|
|
|
|
+ int i, threads;
|
|
|
|
|
|
cpumask_set_cpu(cpu, cpu_sibling_setup_mask);
|
|
cpumask_set_cpu(cpu, cpu_sibling_setup_mask);
|
|
|
|
|
|
@@ -550,6 +553,10 @@ void set_cpu_sibling_map(int cpu)
|
|
if (match_die(c, o) && !topology_same_node(c, o))
|
|
if (match_die(c, o) && !topology_same_node(c, o))
|
|
primarily_use_numa_for_topology();
|
|
primarily_use_numa_for_topology();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ threads = cpumask_weight(topology_sibling_cpumask(cpu));
|
|
|
|
+ if (threads > __max_smt_threads)
|
|
|
|
+ __max_smt_threads = threads;
|
|
}
|
|
}
|
|
|
|
|
|
/* maps the cpu to the sched domain representing multi-core */
|
|
/* maps the cpu to the sched domain representing multi-core */
|
|
@@ -1441,6 +1448,21 @@ __init void prefill_possible_map(void)
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
|
|
|
|
|
+/* Recompute SMT state for all CPUs on offline */
|
|
|
|
+static void recompute_smt_state(void)
|
|
|
|
+{
|
|
|
|
+ int max_threads, cpu;
|
|
|
|
+
|
|
|
|
+ max_threads = 0;
|
|
|
|
+ for_each_online_cpu (cpu) {
|
|
|
|
+ int threads = cpumask_weight(topology_sibling_cpumask(cpu));
|
|
|
|
+
|
|
|
|
+ if (threads > max_threads)
|
|
|
|
+ max_threads = threads;
|
|
|
|
+ }
|
|
|
|
+ __max_smt_threads = max_threads;
|
|
|
|
+}
|
|
|
|
+
|
|
static void remove_siblinginfo(int cpu)
|
|
static void remove_siblinginfo(int cpu)
|
|
{
|
|
{
|
|
int sibling;
|
|
int sibling;
|
|
@@ -1465,6 +1487,7 @@ static void remove_siblinginfo(int cpu)
|
|
c->phys_proc_id = 0;
|
|
c->phys_proc_id = 0;
|
|
c->cpu_core_id = 0;
|
|
c->cpu_core_id = 0;
|
|
cpumask_clear_cpu(cpu, cpu_sibling_setup_mask);
|
|
cpumask_clear_cpu(cpu, cpu_sibling_setup_mask);
|
|
|
|
+ recompute_smt_state();
|
|
}
|
|
}
|
|
|
|
|
|
static void remove_cpu_from_maps(int cpu)
|
|
static void remove_cpu_from_maps(int cpu)
|