From: Thomas Gleixner <tglx@linutronix.de>
To: Yinghai Lu <yinghai@kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>, "H. Peter Anvin" <hpa@zytor.com>,
Andrew Morton <akpm@linux-foundation.org>,
Len Brown <lenb@kernel.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 15/15] x86: Disabling x2apic if nox2apic is specified
Date: Sun, 24 Oct 2010 12:15:27 +0200 (CEST) [thread overview]
Message-ID: <alpine.LFD.2.00.1010241204470.2466@localhost6.localdomain6> (raw)
In-Reply-To: <1287882149-29275-16-git-send-email-yinghai@kernel.org>
On Sat, 23 Oct 2010, Yinghai Lu wrote:
> For
> 1. x2apic preenabled system
> 2. first kernel have x2apic enabled, and try to boot second kernel with "nox2apic"
>
> Will put back cpu with apic id < 255 into xapic mode, instead of panic.
>
> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> ---
> arch/x86/include/asm/apic.h | 6 ++++
> arch/x86/include/asm/apicdef.h | 1 +
> arch/x86/kernel/acpi/boot.c | 10 ++++++-
> arch/x86/kernel/apic/apic.c | 54 +++++++++++++++++++++++++++++++--------
> arch/x86/mm/srat_64.c | 12 ++++++++-
> 5 files changed, 69 insertions(+), 14 deletions(-)
>
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index 69879dd..522f39b 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -176,6 +176,7 @@ static inline u64 native_x2apic_icr_read(void)
> }
>
> extern int x2apic_phys;
> +extern int nox2apic;
Can you please use a sensible variable name like x2apic_disabled ?
> extern void check_x2apic(void);
> extern void enable_x2apic(void);
> extern void x2apic_icr_write(u32 low, u32 id);
> @@ -186,6 +187,10 @@ static inline int x2apic_enabled(void)
> if (!cpu_has_x2apic)
> return 0;
>
> + /* avoid to read msr */
That comment is useless. I wish you would add comments to complex code
not to obvious one.
Also it can be folded into the above check
if (!cpu_has_x2apic || x2apic_disabled)
> + if (nox2apic)
> + return 0;
> +
> rdmsr(MSR_IA32_APICBASE, msr, msr2);
> if (msr & X2APIC_ENABLE)
> return 1;
> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
> index d286db1..ebb13e8 100644
> --- a/arch/x86/kernel/apic/apic.c
> +++ b/arch/x86/kernel/apic/apic.c
> @@ -138,15 +138,14 @@ int x2apic_mode;
> #ifdef CONFIG_X86_X2APIC
> /* x2apic enabled before OS handover */
> static int x2apic_preenabled;
> +int nox2apic;
> static __init int setup_nox2apic(char *str)
> {
> - if (x2apic_enabled()) {
> - pr_warning("Bios already enabled x2apic, "
> - "can't enforce nox2apic");
> - return 0;
> - }
> + if (x2apic_enabled())
> + pr_warning("Bios already enabled x2apic, will disable it");
> +
> + nox2apic = 1;
>
> - setup_clear_cpu_cap(X86_FEATURE_X2APIC);
Why is this removed ?
> return 0;
> }
> early_param("nox2apic", setup_nox2apic);
> @@ -1393,8 +1392,33 @@ void __cpuinit end_local_APIC_setup(void)
> }
>
> #ifdef CONFIG_X86_X2APIC
> +
> +static void disable_x2apic(void)
> +{
> + int msr, msr2;
> +
> + if (!cpu_has_x2apic)
> + return;
> +
> + rdmsr(MSR_IA32_APICBASE, msr, msr2);
> + if (msr & X2APIC_ENABLE) {
> + pr_info("Disabling x2apic\n");
> + /*
> + * Need to disable xapic and x2apic at the same time at first
> + * then enable xapic
> + */
> + wrmsr(MSR_IA32_APICBASE, msr & ~(X2APIC_ENABLE | XAPIC_ENABLE),
> + 0);
> + wrmsr(MSR_IA32_APICBASE, msr & ~X2APIC_ENABLE, 0);
> + }
> +}
> void check_x2apic(void)
> {
> + if (nox2apic) {
> + disable_x2apic();
> + return;
> + }
> +
> if (x2apic_enabled()) {
> pr_info("x2apic enabled by BIOS, switching to x2apic ops\n");
> x2apic_preenabled = x2apic_mode = 1;
> @@ -1405,6 +1429,11 @@ void enable_x2apic(void)
> {
> int msr, msr2;
>
> + if (nox2apic) {
> + disable_x2apic();
> + return;
> + }
> +
> if (!x2apic_mode)
> return;
>
> @@ -1430,7 +1459,7 @@ int __init enable_IR(void)
> return 0;
> }
>
> - if (enable_intr_remapping(x2apic_supported()))
> + if (enable_intr_remapping(x2apic_supported() && !nox2apic))
Do we really need all these extra checks ? Can't we simply make all
this one variable wich is set to 1 when x2apic is available and not
disabled on the kernel command line ?
> diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c
> index a35cb9d..baa9eab 100644
> --- a/arch/x86/mm/srat_64.c
> +++ b/arch/x86/mm/srat_64.c
> @@ -126,6 +126,13 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
> if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0)
> return;
> pxm = pa->proximity_domain;
> + apic_id = pa->apic_id;
> +#ifdef CONFIG_X86_X2APIC
Why conditional? No need to duplicate the printk. It just needs some
thought.
> + if (nox2apic && (apic_id >= 0xff)) {
> + printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n",
> + pxm, apic_id);
> + return;
> + }
> node = setup_node(pxm);
> if (node < 0) {
> printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
> @@ -133,12 +140,15 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
> return;
> }
>
> - apic_id = pa->apic_id;
> apicid_to_node[apic_id] = node;
> node_set(node, cpu_nodes_parsed);
> acpi_numa = 1;
> printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u\n",
> pxm, apic_id, node);
> +#else
> + printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n",
> + pxm, apic_id);
> +#endif
> }
>
> /* Callback for Proximity Domain -> LAPIC mapping */
> --
> 1.7.1
>
next prev parent reply other threads:[~2010-10-24 10:16 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-24 1:02 [PATCH 00/15] x86: APIC related clean up Yinghai Lu
2010-10-24 1:02 ` [PATCH 01/15] x86, apic: Don't write io_apic ID if it is not changed Yinghai Lu
2010-10-24 1:02 ` [PATCH 02/15] x86, apic: Fix lapic mapping with construct ISA and visws mptable path Yinghai Lu
2010-10-24 9:47 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 03/15] x86, apic: Merge two register_lapic_address() Yinghai Lu
2010-10-24 9:49 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 04/15] x86, apic: Remove early_init_lapic_mapping Yinghai Lu
2010-10-24 9:53 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 05/15] x86: Call smp_register_lapic_address for contruct_default mptable path Yinghai Lu
2010-10-24 1:02 ` [PATCH 06/15] x86, apic: Use smp_register_lapic_address in init_apic_mapping Yinghai Lu
2010-10-24 1:02 ` [PATCH 07/15] x86, sfi: Use smp_register_lapic_address() Yinghai Lu
2010-10-24 9:56 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 08/15] x86, visws: Set_fixmap in find_smp_config Yinghai Lu
2010-10-24 9:58 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 09/15] x86: on !find_smp_config path use smp_register_lapic_address Yinghai Lu
2010-10-24 10:01 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 10/15] x86, apic: Set fixmap only one time Yinghai Lu
2010-10-24 10:03 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 11/15] x86, ioapic: Only print mapping for ioapic in right place Yinghai Lu
2010-10-25 16:55 ` [PATCH] x86, ioapic: Add debug printing when mapping for ioapic Yinghai Lu
2010-10-25 16:59 ` [PATCH] x86, ioapic: Don't map ioapic regs two times Yinghai Lu
2010-10-24 1:02 ` [PATCH 12/15] x86, x2apic: Don't map lapic addr for preenabled x2apic Yinghai Lu
2010-10-24 1:02 ` [PATCH 13/15] x86, apic, acpi: Handle xapic/x2apic entries in MADT at same time Yinghai Lu
2010-10-24 9:44 ` Thomas Gleixner
2010-10-24 1:02 ` [PATCH 14/15] acpi: Reverse uid and apic_id print out for x2apic Yinghai Lu
2010-10-24 1:02 ` [PATCH 15/15] x86: Disabling x2apic if nox2apic is specified Yinghai Lu
2010-10-24 10:15 ` Thomas Gleixner [this message]
2010-10-24 22:09 ` Yinghai Lu
2010-10-25 17:50 ` Suresh Siddha
2010-10-27 6:27 ` [PATCH -v3] x86: Disable " Yinghai Lu
2010-10-29 5:53 ` Suresh Siddha
2010-10-29 7:26 ` Yinghai Lu
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.00.1010241204470.2466@localhost6.localdomain6 \
--to=tglx@linutronix.de \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=lenb@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=yinghai@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
all inboxes | Powered by JetHome®