All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Tejun Heo <tj@kernel.org>
Cc: linux-kernel@vger.kernel.org, mingo@redhat.com,
	tglx@linutronix.de, hpa@zytor.com, x86@kernel.org,
	eric.dumazet@gmail.com
Subject: Re: [PATCH UPDATED 4/9] x86: Initialize 32bit logical apicid mapping early during boot
Date: Fri, 12 Nov 2010 01:58:40 -0800	[thread overview]
Message-ID: <4CDD0FD0.1020807@kernel.org> (raw)
In-Reply-To: <4CDD0B1F.4060701@kernel.org>

On 11/12/2010 01:38 AM, Tejun Heo wrote:
> On x86_32, non-standard logical apicid mapping can be used by
> different NUMA setups and the mapping is queried while bringing up
> each CPU using apic->cpu_to_logical_apicid() to build
> cpu_2_logical_apicid[] array.  The logical apicid is then used to
> deliver IPIs and determine NUMA configuration.
> 
> Unfortunately, initializing at SMP bring up is too late for percpu
> setup making static percpu variables setup w/o considering NUMA.  This
> also is different from how x86_64 is configured making the code
> difficult to follow and maintain.
> 
> This patch updates logical apicid mapping handling such that,
> 
> * early_percpu variable x86_cpu_to_logical_apicid replaces
>   cpu_2_logical_apicid[].
> 
> * apic->cpu_to_logical_apicid() is called once during get_smp_config()
>   and the output is recorded in x86_cpu_to_logical_apicid.
> 
> * apic->cpu_to_logical_apicid() is allowed to return BAD_APICID if it
>   can't determine the value that early during boot.  In this case, the
>   mapping will be initialized during SMP bring up by reading APIC LDR
>   as before.
> 
> - Brian Gerst spotted that setup_per_cpu_areas() was not copying the
>   early x86_cpu_to_logical_apicid to the permanent percpu area and
>   es7000_32 is using per_cpu() instead of early_per_cpu(), which in
>   itself is not incorrect as they're never used before setup_per_cpu()
>   but still confusing.  Both updated.
> 
> Signed-off-by: Tejun Heo <tj@kernel.org>
> Cc: Brian Gerst <brgerst@gmail.com>
> ---
> Updated as per Brian's comment.  The rest of the patchset apply okay
> on top of this change.  The git tree is updated accordingly.
> 
> Thanks.
> 
>  arch/x86/include/asm/apic.h      |   18 +++++++++++++-----
>  arch/x86/include/asm/smp.h       |    3 +++
>  arch/x86/kernel/apic/apic.c      |   36 ++++++++++++++++++++++++++++--------
>  arch/x86/kernel/apic/bigsmp_32.c |   26 ++++++++++++++------------
>  arch/x86/kernel/apic/es7000_32.c |   27 ++++++++++-----------------
>  arch/x86/kernel/apic/ipi.c       |    8 ++++----
>  arch/x86/kernel/apic/numaq_32.c  |   15 +++++++--------
>  arch/x86/kernel/apic/summit_32.c |   36 ++++++++++++++++--------------------
>  arch/x86/kernel/setup_percpu.c   |    7 +++++++
>  arch/x86/kernel/smpboot.c        |   10 +++-------
>  10 files changed, 105 insertions(+), 81 deletions(-)
> 
> Index: work/arch/x86/kernel/apic/apic.c
> ===================================================================
> --- work.orig/arch/x86/kernel/apic/apic.c
> +++ work/arch/x86/kernel/apic/apic.c
> @@ -1202,6 +1207,7 @@ static void __cpuinit lapic_setup_esr(vo
>   */
>  void __cpuinit setup_local_APIC(void)
>  {
> +	int cpu = smp_processor_id();
>  	unsigned int value, queued;
>  	int i, j, acked = 0;
>  	unsigned long long tsc = 0, ntsc;
> @@ -1343,21 +1362,19 @@ void __cpuinit setup_local_APIC(void)
>  	 * TODO: set up through-local-APIC from through-I/O-APIC? --macro
>  	 */
>  	value = apic_read(APIC_LVT0) & APIC_LVT_MASKED;
> -	if (!smp_processor_id() && (pic_mode || !value)) {
> +	if (!cpu && (pic_mode || !value)) {
>  		value = APIC_DM_EXTINT;
> -		apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n",
> -				smp_processor_id());
> +		apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n", cpu);
>  	} else {
>  		value = APIC_DM_EXTINT | APIC_LVT_MASKED;
> -		apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n",
> -				smp_processor_id());
> +		apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n", cpu);
>  	}
>  	apic_write(APIC_LVT0, value);
> 
>  	/*
>  	 * only the BP should see the LINT1 NMI signal, obviously.
>  	 */
> -	if (!smp_processor_id())
> +	if (!cpu)
>  		value = APIC_DM_NMI;
>  	else
>  		value = APIC_DM_NMI | APIC_LVT_MASKED;
> @@ -1369,7 +1386,7 @@ void __cpuinit setup_local_APIC(void)
> 
>  #ifdef CONFIG_X86_MCE_INTEL
>  	/* Recheck CMCI information after local APIC is up on CPU #0 */
> -	if (smp_processor_id() == 0)
> +	if (cpu == 0)
>  		cmci_recheck();
>  #endif
>  }

those replacing smp_processor_id() with cpu should be in another patch.

Thanks

	Yinghai

  reply	other threads:[~2010-11-12 10:00 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-11 11:02 [PATCHSET RFC] x86: unify x86_32 and 64 NUMA init paths Tejun Heo
2010-11-11 11:02 ` [PATCH 1/9] x86: Kill unused static boot_cpu_logical_apicid in smpboot.c Tejun Heo
2010-11-11 11:13   ` Pekka Enberg
2010-11-11 11:02 ` [PATCH 2/9] x86: Rename x86_32 MAX_APICID to MAX_LOCAL_APIC Tejun Heo
2010-11-11 11:15   ` Pekka Enberg
2010-11-11 11:02 ` [PATCH 3/9] x86: Make default_send_IPI_mask_sequence/allbutself_logical() 32bit only Tejun Heo
2010-11-11 12:02   ` Pekka Enberg
2010-11-11 16:18   ` Cyrill Gorcunov
2010-11-11 17:34   ` [PATCH UPDATED " Tejun Heo
2010-11-11 17:52     ` Cyrill Gorcunov
2010-11-11 11:02 ` [PATCH 4/9] x86: Initialize 32bit logical apicid mapping early during boot Tejun Heo
2010-11-12  1:54   ` Brian Gerst
2010-11-12  9:38   ` [PATCH UPDATED " Tejun Heo
2010-11-12  9:58     ` Yinghai Lu [this message]
2010-11-12 10:22       ` Tejun Heo
2010-11-12 10:33   ` [PATCH 4/9 UPDATED-1] " Tejun Heo
2010-11-18  8:30     ` Ingo Molnar
2010-11-18  8:39       ` Tejun Heo
2010-11-18  8:42         ` Ingo Molnar
2010-11-18  8:48           ` Tejun Heo
2010-11-18  9:08             ` Ingo Molnar
2010-11-11 11:02 ` [PATCH 5/9] x86: Replace apic->apicid_to_node() with ->numa_cpu_node() Tejun Heo
2010-11-11 11:37   ` Pekka Enberg
2010-11-11 11:02 ` [PATCH 6/9] x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit Tejun Heo
2010-11-11 12:01   ` Pekka Enberg
2010-11-11 11:02 ` [PATCH 7/9] x86: Unify CPU -> " Tejun Heo
2010-11-11 11:02 ` [PATCH 8/9] x86: Unify node_to_cpumask_map handling " Tejun Heo
2010-11-11 12:11   ` Pekka Enberg
2010-11-11 11:02 ` [PATCH 9/9] x86: Unify NUMA initialization " Tejun Heo
2010-11-11 12:09   ` Pekka Enberg
2010-11-12 10:32 ` [PATCH 3.5/9] x86: Use local variable to cache smp_processor_id() in setup_local_APIC() Tejun Heo

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=4CDD0FD0.1020807@kernel.org \
    --to=yinghai@kernel.org \
    --cc=eric.dumazet@gmail.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.