Re: [PATCH v8] x86, apic, kexec, Documentation: Add disable_cpu_apic kernel parameter
On Thu, Nov 28, 2013 at 10:34:27AM +0900, HATAYAMA Daisuke wrote: [..] > int generic_processor_info(int apicid, int version) > { > int cpu, max = nr_cpu_ids; > - bool boot_cpu_detected = physid_isset(boot_cpu_physical_apicid, > + /* > + * 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(). > + */ > + bool boot_cpu_detected = physid_isset(read_apic_id(), > phys_cpu_present_map); > > + 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 >*/ > if (!boot_cpu_detected && num_processors >= nr_cpu_ids - 1 && > - apicid != boot_cpu_physical_apicid) { > + apicid != read_apic_id()) { I thought of using read_apic_id() only for disabled_cpu_apicid case. Existing code seems to be working fine with boot_cpu_physical_apicid. Instead of converting rest of the code to read_apic_id() we should fix notion of boot_cpu_physical_id in a separate cleanup patch series. IOW, can we please use read_apic_id() only for the case of disabled_cpu_apicid and leave rest of the code untouched. And handle all the cleanup in separate patch series. Thanks Vivek -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH v8] x86, apic, kexec, Documentation: Add disable_cpu_apic kernel parameter
On Thu, Nov 28, 2013 at 10:34:27AM +0900, HATAYAMA Daisuke wrote: [..] int generic_processor_info(int apicid, int version) { int cpu, max = nr_cpu_ids; - bool boot_cpu_detected = physid_isset(boot_cpu_physical_apicid, + /* + * 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(). + */ + bool boot_cpu_detected = physid_isset(read_apic_id(), phys_cpu_present_map); + 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 */ if (!boot_cpu_detected num_processors = nr_cpu_ids - 1 - apicid != boot_cpu_physical_apicid) { + apicid != read_apic_id()) { I thought of using read_apic_id() only for disabled_cpu_apicid case. Existing code seems to be working fine with boot_cpu_physical_apicid. Instead of converting rest of the code to read_apic_id() we should fix notion of boot_cpu_physical_id in a separate cleanup patch series. IOW, can we please use read_apic_id() only for the case of disabled_cpu_apicid and leave rest of the code untouched. And handle all the cleanup in separate patch series. Thanks Vivek -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/