|
|
@@ -74,6 +74,13 @@ unsigned int max_physical_apicid;
|
|
|
*/
|
|
|
physid_mask_t phys_cpu_present_map;
|
|
|
|
|
|
+/*
|
|
|
+ * Processor to be disabled specified by kernel parameter
|
|
|
+ * disable_cpu_apicid=<int>, mostly used for the kdump 2nd kernel to
|
|
|
+ * avoid undefined behaviour caused by sending INIT from AP to BSP.
|
|
|
+ */
|
|
|
+unsigned int disabled_cpu_apicid = BAD_APICID;
|
|
|
+
|
|
|
/*
|
|
|
* Map cpu index to physical APIC ID
|
|
|
*/
|
|
|
@@ -2113,6 +2120,39 @@ int generic_processor_info(int apicid, int version)
|
|
|
bool boot_cpu_detected = physid_isset(boot_cpu_physical_apicid,
|
|
|
phys_cpu_present_map);
|
|
|
|
|
|
+ /*
|
|
|
+ * boot_cpu_physical_apicid is designed to have the apicid
|
|
|
+ * returned by read_apic_id(), i.e, the apicid of the
|
|
|
+ * currently booting-up processor. However, on some platforms,
|
|
|
+ * it is temporarilly modified by the apicid reported as BSP
|
|
|
+ * through MP table. Concretely:
|
|
|
+ *
|
|
|
+ * - arch/x86/kernel/mpparse.c: MP_processor_info()
|
|
|
+ * - arch/x86/mm/amdtopology.c: amd_numa_init()
|
|
|
+ * - arch/x86/platform/visws/visws_quirks.c: MP_processor_info()
|
|
|
+ *
|
|
|
+ * This function is executed with the modified
|
|
|
+ * boot_cpu_physical_apicid. So, disabled_cpu_apicid kernel
|
|
|
+ * parameter doesn't work to disable APs on kdump 2nd kernel.
|
|
|
+ *
|
|
|
+ * Since fixing handling of boot_cpu_physical_apicid requires
|
|
|
+ * another discussion and tests on each platform, we leave it
|
|
|
+ * for now and here we use read_apic_id() directly in this
|
|
|
+ * function, generic_processor_info().
|
|
|
+ */
|
|
|
+ if (disabled_cpu_apicid != BAD_APICID &&
|
|
|
+ disabled_cpu_apicid != read_apic_id() &&
|
|
|
+ disabled_cpu_apicid == apicid) {
|
|
|
+ int thiscpu = num_processors + disabled_cpus;
|
|
|
+
|
|
|
+ pr_warning("ACPI: Disabling requested cpu."
|
|
|
+ " Processor %d/0x%x ignored.\n",
|
|
|
+ thiscpu, apicid);
|
|
|
+
|
|
|
+ disabled_cpus++;
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* If boot cpu has not been detected yet, then only allow upto
|
|
|
* nr_cpu_ids - 1 processors and keep one slot free for boot cpu
|
|
|
@@ -2591,3 +2631,12 @@ static int __init lapic_insert_resource(void)
|
|
|
* that is using request_resource
|
|
|
*/
|
|
|
late_initcall(lapic_insert_resource);
|
|
|
+
|
|
|
+static int __init apic_set_disabled_cpu_apicid(char *arg)
|
|
|
+{
|
|
|
+ if (!arg || !get_option(&arg, &disabled_cpu_apicid))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+early_param("disable_cpu_apicid", apic_set_disabled_cpu_apicid);
|