Commit 613c25ef authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/smpboot: Sanitize uniprocessor init



The UP related setups for local apic are mangled into smp_sanity_check().

That results in duplicate calls to disable_smp() and makes the code
hard to follow. Let smp_sanity_check() return dedicated values for the
various exit reasons and handle them at the call site.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarBorislav Petkov <bp@alien8.de>
Cc: Jiang Liu <jiang.liu@linux.intel.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Tony Luck <tony.luck@intel.com>
Link: http://lkml.kernel.org/r/20150115211703.987833932@linutronix.de


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 05f7e46d
Loading
Loading
Loading
Loading
+26 −11
Original line number Diff line number Diff line
@@ -990,6 +990,8 @@ void arch_disable_smp_support(void)
 */
static __init void disable_smp(void)
{
	pr_info("SMP disabled\n");

	disable_ioapic_support();

	init_cpu_present(cpumask_of(0));
@@ -1003,6 +1005,13 @@ static __init void disable_smp(void)
	cpumask_set_cpu(0, cpu_core_mask(0));
}

enum {
	SMP_OK,
	SMP_NO_CONFIG,
	SMP_NO_APIC,
	SMP_FORCE_UP,
};

/*
 * Various sanity checks.
 */
@@ -1050,10 +1059,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
	if (!smp_found_config && !acpi_lapic) {
		preempt_enable();
		pr_notice("SMP motherboard not detected\n");
		disable_smp();
		if (APIC_init_uniprocessor())
			pr_notice("Local APIC not detected. Using dummy APIC emulation.\n");
		return -1;
		return SMP_NO_CONFIG;
	}

	/*
@@ -1077,7 +1083,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
				boot_cpu_physical_apicid);
			pr_err("... forcing use of dummy APIC emulation (tell your hw vendor)\n");
		}
		return -1;
		return SMP_NO_APIC;
	}

	verify_local_APIC();
@@ -1087,12 +1093,10 @@ static int __init smp_sanity_check(unsigned max_cpus)
	 */
	if (!max_cpus) {
		pr_info("SMP mode deactivated\n");
		disable_ioapic_support();
		apic_bsp_setup();
		return -1;
		return SMP_FORCE_UP;
	}

	return 0;
	return SMP_OK;
}

static void __init smp_cpu_index_default(void)
@@ -1132,10 +1136,21 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
	}
	set_cpu_sibling_map(0);

	if (smp_sanity_check(max_cpus) < 0) {
		pr_info("SMP disabled\n");
	switch (smp_sanity_check(max_cpus)) {
	case SMP_NO_CONFIG:
		disable_smp();
		if (APIC_init_uniprocessor())
			pr_notice("Local APIC not detected. Using dummy APIC emulation.\n");
		return;
	case SMP_NO_APIC:
		disable_smp();
		return;
	case SMP_FORCE_UP:
		disable_smp();
		apic_bsp_setup();
		return;
	case SMP_OK:
		break;
	}

	default_setup_apic_routing();