On Thu, 19 Oct 2017, Prarit Bhargava wrote: > static void remove_siblinginfo(int cpu) > { > - int sibling; > + int phys_pkg_id, sibling; > struct cpuinfo_x86 *c = &cpu_data(cpu); > > for_each_cpu(sibling, topology_core_cpumask(cpu)) { > @@ -1529,6 +1526,12 @@ static void remove_siblinginfo(int cpu) > cpumask_clear(topology_core_cpumask(cpu)); > c->phys_proc_id = 0; > c->cpu_core_id = 0; > + > + phys_pkg_id = c->phys_pkg_id; > + c->phys_pkg_id = U16_MAX;
This leaves c->logical_proc_set = 1, which is inconsistent at best. I have no idea why we need this logical_proc_set flag at all. > + if (topology_phys_to_logical_pkg(phys_pkg_id) < 0) > + logical_packages--; Now this has another issue. Depending on hotplug ordering the logical package association can change across hotplug operations. I don't know it that's an issue, but this needs to be analyzed before we merge that. Thanks, tglx