Re: [PATCH v8] x86, apic, kexec, Documentation: Add disable_cpu_apic kernel parameter

2013-12-02 Thread Vivek Goyal
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

2013-12-02 Thread Vivek Goyal
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/