Commit a8ab26fe authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds
Browse files

[PATCH] x86_64: Switch SMP bootup over to new CPU hotplug state machine



This will allow hotplug CPU in the future and in general cleans up a lot of
crufty code.  It also should plug some races that the old hackish way
introduces.  Remove one old race workaround in NMI watchdog setup that is not
needed anymore.

I removed the old total sum of bogomips reporting code.  The brag value of
BogoMips has been greatly devalued in the last years on the open market.

Real CPU hotplug will need some more work, but the infrastructure for it is
there now.

One drawback: the new TSC sync algorithm is less accurate than before.  The
old way of zeroing TSCs is too intrusive to do later.  Instead the TSC of the
BP is duplicated now, which is less accurate.

akpm:

- sync_tsc_bp_init seems to have the sense of `init' inverted.

- SPIN_LOCK_UNLOCKED is deprecated - use DEFINE_SPINLOCK.

Cc: <rusty@rustcorp.com.au>
Cc: <mingo@elte.hu>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ebfcaa96
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -130,12 +130,6 @@ int __init check_nmi_watchdog (void)
	mdelay((10*1000)/nmi_hz); // wait 10 ticks

	for (cpu = 0; cpu < NR_CPUS; cpu++) {
#ifdef CONFIG_SMP
		/* Check cpu_callin_map here because that is set
		   after the timer is started. */
		if (!cpu_isset(cpu, cpu_callin_map))
			continue;
#endif
		if (cpu_pda[cpu].__nmi_count - counts[cpu] <= 5) {
			printk("CPU#%d: NMI appears to be stuck (%d)!\n", 
			       cpu,
+25 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <asm/mach_apic.h>
#include <asm/mmu_context.h>
#include <asm/proto.h>
#include <asm/apicdef.h>

/*
 *	Smarter SMP flushing macros. 
@@ -413,3 +414,27 @@ asmlinkage void smp_call_function_interrupt(void)
		atomic_inc(&call_data->finished);
	}
}

int safe_smp_processor_id(void)
{
	int apicid, i;

	if (disable_apic)
		return 0;

	apicid = hard_smp_processor_id();
	if (x86_cpu_to_apicid[apicid] == apicid)
		return apicid;

	for (i = 0; i < NR_CPUS; ++i) {
		if (x86_cpu_to_apicid[i] == apicid)
			return i;
	}

	/* No entries in x86_cpu_to_apicid?  Either no MPS|ACPI,
	 * or called too early.  Either way, we must be CPU 0. */
      	if (x86_cpu_to_apicid[0] == BAD_APICID)
		return 0;

	return 0; /* Should not happen */
}
+330 −358

File changed.

Preview size limit exceeded, changes collapsed.

+8 −1
Original line number Diff line number Diff line
@@ -916,9 +916,16 @@ void __init time_init(void)
	setup_irq(0, &irq0);

	set_cyc2ns_scale(cpu_khz / 1000);

#ifndef CONFIG_SMP
	time_init_gtod();
#endif
}

void __init time_init_smp(void)
/*
 * Decide after all CPUs are booted what mode gettimeofday should use.
 */
void __init time_init_gtod(void)
{
	char *timetype;

+1 −0
Original line number Diff line number Diff line
@@ -163,6 +163,7 @@ extern inline unsigned int cpuid_edx(unsigned int op)
#define EFER_NX (1<<_EFER_NX)

/* Intel MSRs. Some also available on other CPUs */
#define MSR_IA32_TSC		0x10
#define MSR_IA32_PLATFORM_ID	0x17

#define MSR_IA32_PERFCTR0      0xc1
Loading