linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: Fenghua Yu <fenghua.yu@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>, H Peter Anvin <hpa@zytor.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Asit K Mallick <asit.k.mallick@intel.com>,
	Tony Luck <tony.luck@intel.com>,
	Arjan Dan De Ven <arjan@linux.intel.com>,
	Suresh B Siddha <suresh.b.siddha@intel.com>,
	Len Brown <len.brown@intel.com>,
	"Srivatssa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Chen Gong <gong.chen@linux.intel.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	linux-pm <linux-pm@vger.kernel.org>, x86 <x86@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH v6 04/12] x86/smpboot.c: Don't offline CPU0 if any irq can not be migrated out of it and remove CPU0 check in smp_callin()
Date: Fri, 11 May 2012 14:05:42 +0200 (CEST)	[thread overview]
Message-ID: <alpine.LFD.2.02.1205111352330.3231@ionos> (raw)
In-Reply-To: <1336666614-21090-5-git-send-email-fenghua.yu@intel.com>

On Thu, 10 May 2012, Fenghua Yu wrote:
> From: Fenghua Yu <fenghua.yu@intel.com>
> 
> Don't offline CPU0 if any irq can not be migrated out of it.
> 
> Call identify_boot_cpu_online() for CPU0 in smp_callin() and continue to online
> CPU0 in native_cpu_up().
> 
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>  arch/x86/kernel/smpboot.c |   42 +++++++++++++++++++++++++++++++++++-------
>  1 files changed, 35 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
> index e543e02..fa3822e 100644
> --- a/arch/x86/kernel/smpboot.c
> +++ b/arch/x86/kernel/smpboot.c
> @@ -121,8 +121,8 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);
>  atomic_t init_deasserted;
>  
>  /*
> - * Report back to the Boot Processor.
> - * Running on AP.
> + * Report back to the Boot Processor during boot time or to the caller processor
> + * during CPU online.
>   */
>  static void __cpuinit smp_callin(void)
>  {
> @@ -210,6 +210,13 @@ static void __cpuinit smp_callin(void)
>  	pr_debug("Stack at about %p\n", &cpuid);
>  
>  	/*
> +	 * This function won't run on the BSP during boot time. It run
> +	 * on BSP only when BSP is offlined and onlined again.
> +	 */
> +	if (cpuid == 0)
> +		identify_boot_cpu_online();

No, this is not how we do things. 

If this is required, then hell we do it at boot time and not at a
random place in the cpu hotplug code.

> +
> +	/*
>  	 * This must be done before setting cpu_online_mask
>  	 * or calling notify_cpu_starting.
>  	 */
> @@ -778,7 +785,7 @@ int __cpuinit native_cpu_up(unsigned int cpu, struct task_struct *tidle)
>  
>  	pr_debug("++++++++++++++++++++=_---CPU UP  %u\n", cpu);
>  
> -	if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid ||
> +	if (apicid == BAD_APICID ||
>  	    !physid_isset(apicid, phys_cpu_present_map) ||
>  	    !apic->apic_id_valid(apicid)) {
>  		printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu);
> @@ -1224,12 +1231,33 @@ int native_cpu_disable(void)
>  	 * Perhaps use cpufreq to drop frequency, but that could go
>  	 * into generic code.
>  	 *
> -	 * We won't take down the boot processor on i386 due to some
> +	 * We won't take down the boot processor on x86 if some
>  	 * interrupts only being able to be serviced by the BSP.
> -	 * Especially so if we're not using an IOAPIC	-zwane
> +	 * Especially so if we're not using an IOAPIC
>  	 */
> -	if (cpu == 0)
> -		return -EBUSY;
> +	if (cpu == 0) {
> +		int irq;
> +		struct irq_desc *desc;
> +		struct irq_data *data;
> +		struct irq_chip *chip;
> +
> +		for_each_irq_desc(irq, desc) {
> +			raw_spin_lock(&desc->lock);
> +			if (!irq_has_action(irq)) {
> +				raw_spin_unlock(&desc->lock);
> +				continue;
> +			}
> +
> +			data = irq_desc_get_irq_data(desc);
> +			chip = irq_data_get_irq_chip(data);
> +			if (!chip->irq_set_affinity) {
> +				pr_debug("irq%d can't move out of BSP\n", irq);
> +				raw_spin_unlock(&desc->lock);
> +				return -EBUSY;
> +			}
> +			raw_spin_unlock(&desc->lock);
> +		}

This is as fricking wrong as it gets. We already know that at boot
time when we initialize the irq chips. There is no need to iterate
over the whole irq descriptors just to figure that out.

And of course you'd detect cascaded irq chips behind a PCIe master
interrupt as non migratable even if that's not affecting hotplug.


I haven't looked at the other patches, but given the gems in this one
I can't be bothered to see the other magic fixups which are just
hacked into the code at random places to make it somehow work.

NAK.

	tglx

  reply	other threads:[~2012-05-11 12:06 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-10 16:16 [PATCH v6 0/12] x86: Arbitrary CPU hot(un)plug support Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 01/12] Documentations/cpu-hotplug.tx, kernel-parameters.txt: Add x86 CPU0 online/offline feature Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 02/12] x86/Kconfig: Add config switch for CPU0 hotplug Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 03/12] x86/topology.c: Support functions for CPU0 online/offline Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 04/12] x86/smpboot.c: Don't offline CPU0 if any irq can not be migrated out of it and remove CPU0 check in smp_callin() Fenghua Yu
2012-05-11 12:05   ` Thomas Gleixner [this message]
2012-05-11 18:42     ` Tony Luck
2012-05-14 12:17       ` Ingo Molnar
2012-05-14 16:40         ` Luck, Tony
2012-05-14 20:03           ` Yu, Fenghua
2012-05-17 22:47         ` Suresh Siddha
2012-05-18  1:47           ` Yu, Fenghua
2012-05-18  3:34             ` H. Peter Anvin
2012-05-17 22:52         ` H. Peter Anvin
2012-05-18  6:46           ` Ingo Molnar
2012-05-10 16:16 ` [PATCH v6 05/12] x86/power/cpu.c: Don't hibernate/suspend if CPU0 is offline Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 06/12] x86/head_64.S: Define start_cpu0 Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 07/12] x86/head_32.S: " Fenghua Yu
2012-05-10 17:31   ` H. Peter Anvin
2012-05-10 20:48     ` Yu, Fenghua
2012-05-10 23:53       ` H. Peter Anvin
2012-05-10 16:16 ` [PATCH v6 08/12] x86/smpboot.c: Wake up CPU0 via NMI instead of INITs Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 09/12] x86/common.c: Init CPU0 data during CPU0 online Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 10/12] x86/mtrr/main.c: Ask the first online CPU to save mtrr Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 11/12] x86/i387.c: Thread xstate is initialized only on CPU0 once Fenghua Yu
2012-05-10 16:16 ` [PATCH v6 12/12] x86/topology.c: debug CPU0 hotplug Fenghua Yu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LFD.2.02.1205111352330.3231@ionos \
    --to=tglx@linutronix.de \
    --cc=akpm@linux-foundation.org \
    --cc=arjan@linux.intel.com \
    --cc=asit.k.mallick@intel.com \
    --cc=fenghua.yu@intel.com \
    --cc=gong.chen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    --cc=rdunlap@xenotime.net \
    --cc=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=suresh.b.siddha@intel.com \
    --cc=tony.luck@intel.com \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).