|
@@ -103,7 +103,6 @@ static unsigned int max_physical_pkg_id __read_mostly;
|
|
|
unsigned int __max_logical_packages __read_mostly;
|
|
|
EXPORT_SYMBOL(__max_logical_packages);
|
|
|
static unsigned int logical_packages __read_mostly;
|
|
|
-static bool logical_packages_frozen __read_mostly;
|
|
|
|
|
|
/* Maximum number of SMT threads on any online core */
|
|
|
int __max_smt_threads __read_mostly;
|
|
@@ -273,9 +272,14 @@ static void notrace start_secondary(void *unused)
|
|
|
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
|
|
|
}
|
|
|
|
|
|
-int topology_update_package_map(unsigned int apicid, unsigned int cpu)
|
|
|
+/**
|
|
|
+ * topology_update_package_map - Update the physical to logical package map
|
|
|
+ * @pkg: The physical package id as retrieved via CPUID
|
|
|
+ * @cpu: The cpu for which this is updated
|
|
|
+ */
|
|
|
+int topology_update_package_map(unsigned int pkg, unsigned int cpu)
|
|
|
{
|
|
|
- unsigned int new, pkg = apicid >> boot_cpu_data.x86_coreid_bits;
|
|
|
+ unsigned int new;
|
|
|
|
|
|
/* Called from early boot ? */
|
|
|
if (!physical_package_map)
|
|
@@ -288,16 +292,17 @@ int topology_update_package_map(unsigned int apicid, unsigned int cpu)
|
|
|
if (test_and_set_bit(pkg, physical_package_map))
|
|
|
goto found;
|
|
|
|
|
|
- if (logical_packages_frozen) {
|
|
|
- physical_to_logical_pkg[pkg] = -1;
|
|
|
- pr_warn("APIC(%x) Package %u exceeds logical package max\n",
|
|
|
- apicid, pkg);
|
|
|
+ if (logical_packages >= __max_logical_packages) {
|
|
|
+ pr_warn("Package %u of CPU %u exceeds BIOS package data %u.\n",
|
|
|
+ logical_packages, cpu, __max_logical_packages);
|
|
|
return -ENOSPC;
|
|
|
}
|
|
|
|
|
|
new = logical_packages++;
|
|
|
- pr_info("APIC(%x) Converting physical %u to logical package %u\n",
|
|
|
- apicid, pkg, new);
|
|
|
+ if (new != pkg) {
|
|
|
+ pr_info("CPU %u Converting physical %u to logical package %u\n",
|
|
|
+ cpu, pkg, new);
|
|
|
+ }
|
|
|
physical_to_logical_pkg[pkg] = new;
|
|
|
|
|
|
found:
|
|
@@ -318,9 +323,9 @@ int topology_phys_to_logical_pkg(unsigned int phys_pkg)
|
|
|
}
|
|
|
EXPORT_SYMBOL(topology_phys_to_logical_pkg);
|
|
|
|
|
|
-static void __init smp_init_package_map(void)
|
|
|
+static void __init smp_init_package_map(struct cpuinfo_x86 *c, unsigned int cpu)
|
|
|
{
|
|
|
- unsigned int ncpus, cpu;
|
|
|
+ unsigned int ncpus;
|
|
|
size_t size;
|
|
|
|
|
|
/*
|
|
@@ -365,27 +370,9 @@ static void __init smp_init_package_map(void)
|
|
|
size = BITS_TO_LONGS(max_physical_pkg_id) * sizeof(unsigned long);
|
|
|
physical_package_map = kzalloc(size, GFP_KERNEL);
|
|
|
|
|
|
- for_each_present_cpu(cpu) {
|
|
|
- unsigned int apicid = apic->cpu_present_to_apicid(cpu);
|
|
|
-
|
|
|
- if (apicid == BAD_APICID || !apic->apic_id_valid(apicid))
|
|
|
- continue;
|
|
|
- if (!topology_update_package_map(apicid, cpu))
|
|
|
- continue;
|
|
|
- pr_warn("CPU %u APICId %x disabled\n", cpu, apicid);
|
|
|
- per_cpu(x86_bios_cpu_apicid, cpu) = BAD_APICID;
|
|
|
- set_cpu_possible(cpu, false);
|
|
|
- set_cpu_present(cpu, false);
|
|
|
- }
|
|
|
-
|
|
|
- if (logical_packages > __max_logical_packages) {
|
|
|
- pr_warn("Detected more packages (%u), then computed by BIOS data (%u).\n",
|
|
|
- logical_packages, __max_logical_packages);
|
|
|
- logical_packages_frozen = true;
|
|
|
- __max_logical_packages = logical_packages;
|
|
|
- }
|
|
|
-
|
|
|
pr_info("Max logical packages: %u\n", __max_logical_packages);
|
|
|
+
|
|
|
+ topology_update_package_map(c->phys_proc_id, cpu);
|
|
|
}
|
|
|
|
|
|
void __init smp_store_boot_cpu_info(void)
|
|
@@ -395,7 +382,7 @@ void __init smp_store_boot_cpu_info(void)
|
|
|
|
|
|
*c = boot_cpu_data;
|
|
|
c->cpu_index = id;
|
|
|
- smp_init_package_map();
|
|
|
+ smp_init_package_map(c, id);
|
|
|
}
|
|
|
|
|
|
/*
|