svn commit: r222853 - in head: . sys/amd64/amd64 sys/amd64/include sys/i386/i386 sys/i386/include sys/pc98/pc98

Andriy Gapon avg at FreeBSD.org
Wed Jun 8 08:12:15 UTC 2011


Author: avg
Date: Wed Jun  8 08:12:15 2011
New Revision: 222853
URL: http://svn.freebsd.org/changeset/base/222853

Log:
  remove code for dynamic offlining/onlining of CPUs on x86
  
  The code has definitely been broken for SCHED_ULE, which is a default
  scheduler.  It may have been broken for SCHED_4BSD in more subtle ways,
  e.g. with manually configured CPU affinities and for interrupt devilery
  purposes.
  We still provide a way to disable individual CPUs or all hyperthreading
  "twin" CPUs before SMP startup.  See the UPDATING entry for details.
  
  Interaction between building CPU topology and disabling CPUs still
  remains fuzzy: topology is first built using all availble CPUs and then
  the disabled CPUs should be "subtracted" from it.  That doesn't work
  well if the resulting topology becomes non-uniform.
  
  This work is done in cooperation with Attilio Rao who in addition to
  reviewing also provided parts of code.
  
  PR:		kern/145385
  Discussed with:	gcooper, ambrisko, mdf, sbruno
  Reviewed by:	attilio
  Tested by:	pho, pluknet
  X-MFC after:	never

Modified:
  head/UPDATING
  head/sys/amd64/amd64/machdep.c
  head/sys/amd64/amd64/mp_machdep.c
  head/sys/amd64/include/smp.h
  head/sys/i386/i386/machdep.c
  head/sys/i386/i386/mp_machdep.c
  head/sys/i386/include/smp.h
  head/sys/pc98/pc98/machdep.c

Modified: head/UPDATING
==============================================================================
--- head/UPDATING	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/UPDATING	Wed Jun  8 08:12:15 2011	(r222853)
@@ -22,6 +22,23 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.
 	machines to maximize performance.  (To disable malloc debugging, run
 	ln -s aj /etc/malloc.conf.)
 
+20110608:
+	The following sysctls and tunables are retired on x86 platforms:
+		machdep.hlt_cpus
+		machdep.hlt_logical_cpus
+	The following sysctl is retired:
+		machdep.hyperthreading_allowed
+	The sysctls were supposed to provide a way to dynamically offline and
+	online selected CPUs on x86 platforms, but the implementation has not
+	been reliable especially with SCHED_ULE scheduler.
+	machdep.hyperthreading_allowed tunable is still available to ignore
+	hyperthreading CPUs at OS level.
+	Individual CPUs can be disabled using hint.lapic.X.disabled tunable,
+	where X is an APIC ID of a CPU.  Be advised, though, that disabling
+	CPUs in non-uniform fashion will result in non-uniform topology and
+	may lead to sub-optimal system performance with SCHED_ULE, which is
+	a default scheduler.
+
 20110607:
 	cpumask_t type is retired and cpuset_t is used in order to describe
 	a mask of CPUs.

Modified: head/sys/amd64/amd64/machdep.c
==============================================================================
--- head/sys/amd64/amd64/machdep.c	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/amd64/amd64/machdep.c	Wed Jun  8 08:12:15 2011	(r222853)
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
 #include "opt_isa.h"
 #include "opt_kstack_pages.h"
 #include "opt_maxmem.h"
+#include "opt_mp_watchdog.h"
 #include "opt_perfmon.h"
 #include "opt_sched.h"
 #include "opt_kdtrace.h"
@@ -116,6 +117,7 @@ __FBSDID("$FreeBSD$");
 #include <x86/mca.h>
 #include <machine/md_var.h>
 #include <machine/metadata.h>
+#include <machine/mp_watchdog.h>
 #include <machine/pc/bios.h>
 #include <machine/pcb.h>
 #include <machine/proc.h>
@@ -734,9 +736,8 @@ cpu_idle(int busy)
 
 	CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
 	    busy, curcpu);
-#ifdef SMP
-	if (mp_grab_cpu_hlt())
-		return;
+#ifdef MP_WATCHDOG
+	ap_watchdog(PCPU_GET(cpuid));
 #endif
 	/* If we are busy - try to use fast methods. */
 	if (busy) {

Modified: head/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- head/sys/amd64/amd64/mp_machdep.c	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/amd64/amd64/mp_machdep.c	Wed Jun  8 08:12:15 2011	(r222853)
@@ -29,7 +29,6 @@ __FBSDID("$FreeBSD$");
 
 #include "opt_cpu.h"
 #include "opt_kstack_pages.h"
-#include "opt_mp_watchdog.h"
 #include "opt_sched.h"
 #include "opt_smp.h"
 
@@ -64,7 +63,6 @@ __FBSDID("$FreeBSD$");
 #include <machine/cpufunc.h>
 #include <x86/mca.h>
 #include <machine/md_var.h>
-#include <machine/mp_watchdog.h>
 #include <machine/pcb.h>
 #include <machine/psl.h>
 #include <machine/smp.h>
@@ -160,11 +158,8 @@ static int	start_all_aps(void);
 static int	start_ap(int apic_id);
 static void	release_aps(void *dummy);
 
-static int	hlt_logical_cpus;
 static u_int	hyperthreading_cpus;	/* logical cpus sharing L1 cache */
-static cpuset_t	hyperthreading_cpus_mask;
 static int	hyperthreading_allowed = 1;
-static struct	sysctl_ctx_list logical_cpu_clist;
 static u_int	bootMP_size;
 
 static void
@@ -748,11 +743,6 @@ init_secondary(void)
 	if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
 		CPU_OR(&logical_cpus_mask, &tcpuset);
 
-	/* Determine if we are a hyperthread. */
-	if (hyperthreading_cpus > 1 &&
-	    PCPU_GET(apic_id) % hyperthreading_cpus != 0)
-		CPU_OR(&hyperthreading_cpus_mask, &tcpuset);
-
 	/* Build our map of 'other' CPUs. */
 	tallcpus = all_cpus;
 	CPU_NAND(&tallcpus, &tcpuset);
@@ -843,7 +833,7 @@ assign_cpu_ids(void)
 
 		if (hyperthreading_cpus > 1 && i % hyperthreading_cpus != 0) {
 			cpu_info[i].cpu_hyperthread = 1;
-#if defined(SCHED_ULE)
+
 			/*
 			 * Don't use HT CPU if it has been disabled by a
 			 * tunable.
@@ -852,7 +842,6 @@ assign_cpu_ids(void)
 				cpu_info[i].cpu_disabled = 1;
 				continue;
 			}
-#endif
 		}
 
 		/* Don't use this CPU if it has been disabled by a tunable. */
@@ -862,6 +851,11 @@ assign_cpu_ids(void)
 		}
 	}
 
+	if (hyperthreading_allowed == 0 && hyperthreading_cpus > 1) {
+		hyperthreading_cpus = 0;
+		cpu_logical = 1;
+	}
+
 	/*
 	 * Assign CPU IDs to local APIC IDs and disable any CPUs
 	 * beyond MAXCPU.  CPU 0 is always assigned to the BSP.
@@ -1487,159 +1481,6 @@ release_aps(void *dummy __unused)
 }
 SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);
 
-static int
-sysctl_hlt_cpus(SYSCTL_HANDLER_ARGS)
-{
-	cpuset_t mask;
-	int error;
-
-	mask = hlt_cpus_mask;
-	error = sysctl_handle_opaque(oidp, &mask, sizeof(mask), req);
-	if (error || !req->newptr)
-		return (error);
-
-	if (!CPU_EMPTY(&logical_cpus_mask) &&
-	    CPU_SUBSET(&mask, &logical_cpus_mask))
-		hlt_logical_cpus = 1;
-	else
-		hlt_logical_cpus = 0;
-
-	if (! hyperthreading_allowed)
-		CPU_OR(&mask, &hyperthreading_cpus_mask);
-
-	if (CPU_SUBSET(&mask, &all_cpus))
-		CPU_CLR(0, &mask);
-	hlt_cpus_mask = mask;
-	return (error);
-}
-SYSCTL_PROC(_machdep, OID_AUTO, hlt_cpus,
-    CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_MPSAFE, 0, 0, sysctl_hlt_cpus, "S",
-    "Bitmap of CPUs to halt.  101 (binary) will halt CPUs 0 and 2.");
-
-static int
-sysctl_hlt_logical_cpus(SYSCTL_HANDLER_ARGS)
-{
-	int disable, error;
-
-	disable = hlt_logical_cpus;
-	error = sysctl_handle_int(oidp, &disable, 0, req);
-	if (error || !req->newptr)
-		return (error);
-
-	if (disable)
-		CPU_OR(&hlt_cpus_mask, &logical_cpus_mask);
-	else
-		CPU_NAND(&hlt_cpus_mask, &logical_cpus_mask);
-
-	if (! hyperthreading_allowed)
-		CPU_OR(&hlt_cpus_mask, &hyperthreading_cpus_mask);
-
-	if (CPU_SUBSET(&hlt_cpus_mask, &all_cpus))
-		CPU_CLR(0, &hlt_cpus_mask);
-
-	hlt_logical_cpus = disable;
-	return (error);
-}
-
-static int
-sysctl_hyperthreading_allowed(SYSCTL_HANDLER_ARGS)
-{
-	int allowed, error;
-
-	allowed = hyperthreading_allowed;
-	error = sysctl_handle_int(oidp, &allowed, 0, req);
-	if (error || !req->newptr)
-		return (error);
-
-#ifdef SCHED_ULE
-	/*
-	 * SCHED_ULE doesn't allow enabling/disabling HT cores at
-	 * run-time.
-	 */
-	if (allowed != hyperthreading_allowed)
-		return (ENOTSUP);
-	return (error);
-#endif
-
-	if (allowed)
-		CPU_NAND(&hlt_cpus_mask, &hyperthreading_cpus_mask);
-	else
-		CPU_OR(&hlt_cpus_mask, &hyperthreading_cpus_mask);
-
-	if (!CPU_EMPTY(&logical_cpus_mask) &&
-	    CPU_SUBSET(&hlt_cpus_mask, &logical_cpus_mask))
-		hlt_logical_cpus = 1;
-	else
-		hlt_logical_cpus = 0;
-
-	if (CPU_SUBSET(&hlt_cpus_mask, &all_cpus))
-		CPU_CLR(0, &hlt_cpus_mask);
-
-	hyperthreading_allowed = allowed;
-	return (error);
-}
-
-static void
-cpu_hlt_setup(void *dummy __unused)
-{
-
-	if (!CPU_EMPTY(&logical_cpus_mask)) {
-		TUNABLE_INT_FETCH("machdep.hlt_logical_cpus",
-		    &hlt_logical_cpus);
-		sysctl_ctx_init(&logical_cpu_clist);
-		SYSCTL_ADD_PROC(&logical_cpu_clist,
-		    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
-		    "hlt_logical_cpus", CTLTYPE_INT|CTLFLAG_RW, 0, 0,
-		    sysctl_hlt_logical_cpus, "IU", "");
-		SYSCTL_ADD_UINT(&logical_cpu_clist,
-		    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
-		    "logical_cpus_mask", CTLTYPE_INT|CTLFLAG_RD,
-		    &logical_cpus_mask, 0, "");
-
-		if (hlt_logical_cpus)
-			CPU_OR(&hlt_cpus_mask, &logical_cpus_mask);
-
-		/*
-		 * If necessary for security purposes, force
-		 * hyperthreading off, regardless of the value
-		 * of hlt_logical_cpus.
-		 */
-		if (!CPU_EMPTY(&hyperthreading_cpus_mask)) {
-			SYSCTL_ADD_PROC(&logical_cpu_clist,
-			    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
-			    "hyperthreading_allowed", CTLTYPE_INT|CTLFLAG_RW,
-			    0, 0, sysctl_hyperthreading_allowed, "IU", "");
-			if (! hyperthreading_allowed)
-				CPU_OR(&hlt_cpus_mask,
-				    &hyperthreading_cpus_mask);
-		}
-	}
-}
-SYSINIT(cpu_hlt, SI_SUB_SMP, SI_ORDER_ANY, cpu_hlt_setup, NULL);
-
-int
-mp_grab_cpu_hlt(void)
-{
-	cpuset_t mask;
-#ifdef MP_WATCHDOG
-	u_int cpuid;
-#endif
-	int retval;
-
-	mask = PCPU_GET(cpumask);
-#ifdef MP_WATCHDOG
-	cpuid = PCPU_GET(cpuid);
-	ap_watchdog(cpuid);
-#endif
-
-	retval = 0;
-	while (CPU_OVERLAP(&mask, &hlt_cpus_mask)) {
-		retval = 1;
-		__asm __volatile("sti; hlt" : : : "memory");
-	}
-	return (retval);
-}
-
 #ifdef COUNT_IPIS
 /*
  * Setup interrupt counters for IPI handlers.

Modified: head/sys/amd64/include/smp.h
==============================================================================
--- head/sys/amd64/include/smp.h	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/amd64/include/smp.h	Wed Jun  8 08:12:15 2011	(r222853)
@@ -65,7 +65,6 @@ void	ipi_cpu(int cpu, u_int ipi);
 int	ipi_nmi_handler(void);
 void	ipi_selected(cpuset_t cpus, u_int ipi);
 u_int	mp_bootaddress(u_int);
-int	mp_grab_cpu_hlt(void);
 void	smp_cache_flush(void);
 void	smp_invlpg(vm_offset_t addr);
 void	smp_masked_invlpg(cpuset_t mask, vm_offset_t addr);

Modified: head/sys/i386/i386/machdep.c
==============================================================================
--- head/sys/i386/i386/machdep.c	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/i386/i386/machdep.c	Wed Jun  8 08:12:15 2011	(r222853)
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
 #include "opt_isa.h"
 #include "opt_kstack_pages.h"
 #include "opt_maxmem.h"
+#include "opt_mp_watchdog.h"
 #include "opt_npx.h"
 #include "opt_perfmon.h"
 #include "opt_xbox.h"
@@ -118,6 +119,7 @@ __FBSDID("$FreeBSD$");
 #include <x86/mca.h>
 #include <machine/md_var.h>
 #include <machine/metadata.h>
+#include <machine/mp_watchdog.h>
 #include <machine/pc/bios.h>
 #include <machine/pcb.h>
 #include <machine/pcb_ext.h>
@@ -1357,9 +1359,8 @@ cpu_idle(int busy)
 
 	CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
 	    busy, curcpu);
-#if defined(SMP) && !defined(XEN)
-	if (mp_grab_cpu_hlt())
-		return;
+#if defined(MP_WATCHDOG) && !defined(XEN)
+	ap_watchdog(PCPU_GET(cpuid));
 #endif
 #ifndef XEN
 	/* If we are busy - try to use fast methods. */

Modified: head/sys/i386/i386/mp_machdep.c
==============================================================================
--- head/sys/i386/i386/mp_machdep.c	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/i386/i386/mp_machdep.c	Wed Jun  8 08:12:15 2011	(r222853)
@@ -29,7 +29,6 @@ __FBSDID("$FreeBSD$");
 #include "opt_apic.h"
 #include "opt_cpu.h"
 #include "opt_kstack_pages.h"
-#include "opt_mp_watchdog.h"
 #include "opt_pmap.h"
 #include "opt_sched.h"
 #include "opt_smp.h"
@@ -78,7 +77,6 @@ __FBSDID("$FreeBSD$");
 #include <machine/cputypes.h>
 #include <x86/mca.h>
 #include <machine/md_var.h>
-#include <machine/mp_watchdog.h>
 #include <machine/pcb.h>
 #include <machine/psl.h>
 #include <machine/smp.h>
@@ -209,11 +207,8 @@ static int	start_all_aps(void);
 static int	start_ap(int apic_id);
 static void	release_aps(void *dummy);
 
-static int	hlt_logical_cpus;
 static u_int	hyperthreading_cpus;	/* logical cpus sharing L1 cache */
-static cpuset_t	hyperthreading_cpus_mask;
 static int	hyperthreading_allowed = 1;
-static struct	sysctl_ctx_list logical_cpu_clist;
 
 static void
 mem_range_AP_init(void)
@@ -794,11 +789,6 @@ init_secondary(void)
 	/* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
 	if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
 		CPU_OR(&logical_cpus_mask, &tcpuset);
-	
-	/* Determine if we are a hyperthread. */
-	if (hyperthreading_cpus > 1 &&
-	    PCPU_GET(apic_id) % hyperthreading_cpus != 0)
-		CPU_OR(&hyperthreading_cpus_mask, &tcpuset);
 
 	/* Build our map of 'other' CPUs. */
 	tallcpus = all_cpus;
@@ -882,7 +872,7 @@ assign_cpu_ids(void)
 
 		if (hyperthreading_cpus > 1 && i % hyperthreading_cpus != 0) {
 			cpu_info[i].cpu_hyperthread = 1;
-#if defined(SCHED_ULE)
+
 			/*
 			 * Don't use HT CPU if it has been disabled by a
 			 * tunable.
@@ -891,7 +881,6 @@ assign_cpu_ids(void)
 				cpu_info[i].cpu_disabled = 1;
 				continue;
 			}
-#endif
 		}
 
 		/* Don't use this CPU if it has been disabled by a tunable. */
@@ -901,6 +890,11 @@ assign_cpu_ids(void)
 		}
 	}
 
+	if (hyperthreading_allowed == 0 && hyperthreading_cpus > 1) {
+		hyperthreading_cpus = 0;
+		cpu_logical = 1;
+	}
+
 	/*
 	 * Assign CPU IDs to local APIC IDs and disable any CPUs
 	 * beyond MAXCPU.  CPU 0 is always assigned to the BSP.
@@ -1550,159 +1544,6 @@ release_aps(void *dummy __unused)
 }
 SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);
 
-static int
-sysctl_hlt_cpus(SYSCTL_HANDLER_ARGS)
-{
-	cpuset_t mask;
-	int error;
-
-	mask = hlt_cpus_mask;
-	error = sysctl_handle_opaque(oidp, &mask, sizeof(mask), req);
-	if (error || !req->newptr)
-		return (error);
-
-	if (!CPU_EMPTY(&logical_cpus_mask) &&
-	    CPU_SUBSET(&mask, &logical_cpus_mask))
-		hlt_logical_cpus = 1;
-	else
-		hlt_logical_cpus = 0;
-
-	if (! hyperthreading_allowed)
-		CPU_OR(&mask, &hyperthreading_cpus_mask);
-
-	if (CPU_SUBSET(&mask, &all_cpus))
-		CPU_CLR(0, &mask);
-	hlt_cpus_mask = mask;
-	return (error);
-}
-SYSCTL_PROC(_machdep, OID_AUTO, hlt_cpus,
-    CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_MPSAFE, 0, 0, sysctl_hlt_cpus, "S",
-    "Bitmap of CPUs to halt.  101 (binary) will halt CPUs 0 and 2.");
-
-static int
-sysctl_hlt_logical_cpus(SYSCTL_HANDLER_ARGS)
-{
-	int disable, error;
-
-	disable = hlt_logical_cpus;
-	error = sysctl_handle_int(oidp, &disable, 0, req);
-	if (error || !req->newptr)
-		return (error);
-
-	if (disable)
-		CPU_OR(&hlt_cpus_mask, &logical_cpus_mask);
-	else
-		CPU_NAND(&hlt_cpus_mask, &logical_cpus_mask);
-
-	if (! hyperthreading_allowed)
-		CPU_OR(&hlt_cpus_mask, &hyperthreading_cpus_mask);
-
-	if (CPU_SUBSET(&hlt_cpus_mask, &all_cpus))
-		CPU_CLR(0, &hlt_cpus_mask);
-
-	hlt_logical_cpus = disable;
-	return (error);
-}
-
-static int
-sysctl_hyperthreading_allowed(SYSCTL_HANDLER_ARGS)
-{
-	int allowed, error;
-
-	allowed = hyperthreading_allowed;
-	error = sysctl_handle_int(oidp, &allowed, 0, req);
-	if (error || !req->newptr)
-		return (error);
-
-#ifdef SCHED_ULE
-	/*
-	 * SCHED_ULE doesn't allow enabling/disabling HT cores at
-	 * run-time.
-	 */
-	if (allowed != hyperthreading_allowed)
-		return (ENOTSUP);
-	return (error);
-#endif
-
-	if (allowed)
-		CPU_NAND(&hlt_cpus_mask, &hyperthreading_cpus_mask);
-	else
-		CPU_OR(&hlt_cpus_mask, &hyperthreading_cpus_mask);
-
-	if (!CPU_EMPTY(&logical_cpus_mask) &&
-	    CPU_SUBSET(&hlt_cpus_mask, &logical_cpus_mask))
-		hlt_logical_cpus = 1;
-	else
-		hlt_logical_cpus = 0;
-
-	if (CPU_SUBSET(&hlt_cpus_mask, &all_cpus))
-		CPU_CLR(0, &hlt_cpus_mask);
-
-	hyperthreading_allowed = allowed;
-	return (error);
-}
-
-static void
-cpu_hlt_setup(void *dummy __unused)
-{
-
-	if (!CPU_EMPTY(&logical_cpus_mask)) {
-		TUNABLE_INT_FETCH("machdep.hlt_logical_cpus",
-		    &hlt_logical_cpus);
-		sysctl_ctx_init(&logical_cpu_clist);
-		SYSCTL_ADD_PROC(&logical_cpu_clist,
-		    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
-		    "hlt_logical_cpus", CTLTYPE_INT|CTLFLAG_RW, 0, 0,
-		    sysctl_hlt_logical_cpus, "IU", "");
-		SYSCTL_ADD_UINT(&logical_cpu_clist,
-		    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
-		    "logical_cpus_mask", CTLTYPE_INT|CTLFLAG_RD,
-		    &logical_cpus_mask, 0, "");
-
-		if (hlt_logical_cpus)
-			CPU_OR(&hlt_cpus_mask, &logical_cpus_mask);
-
-		/*
-		 * If necessary for security purposes, force
-		 * hyperthreading off, regardless of the value
-		 * of hlt_logical_cpus.
-		 */
-		if (!CPU_EMPTY(&hyperthreading_cpus_mask)) {
-			SYSCTL_ADD_PROC(&logical_cpu_clist,
-			    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
-			    "hyperthreading_allowed", CTLTYPE_INT|CTLFLAG_RW,
-			    0, 0, sysctl_hyperthreading_allowed, "IU", "");
-			if (! hyperthreading_allowed)
-				CPU_OR(&hlt_cpus_mask,
-				    &hyperthreading_cpus_mask);
-		}
-	}
-}
-SYSINIT(cpu_hlt, SI_SUB_SMP, SI_ORDER_ANY, cpu_hlt_setup, NULL);
-
-int
-mp_grab_cpu_hlt(void)
-{
-	cpuset_t mask;
-#ifdef MP_WATCHDOG
-	u_int cpuid;
-#endif
-	int retval;
-
-	mask = PCPU_GET(cpumask);
-#ifdef MP_WATCHDOG
-	cpuid = PCPU_GET(cpuid);
-	ap_watchdog(cpuid);
-#endif
-
-	retval = 0;
-	while (CPU_OVERLAP(&mask, &hlt_cpus_mask)) {
-		retval = 1;
-		__asm __volatile("sti; hlt" : : : "memory");
-	}
-	return (retval);
-}
-
 #ifdef COUNT_IPIS
 /*
  * Setup interrupt counters for IPI handlers.

Modified: head/sys/i386/include/smp.h
==============================================================================
--- head/sys/i386/include/smp.h	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/i386/include/smp.h	Wed Jun  8 08:12:15 2011	(r222853)
@@ -68,7 +68,6 @@ void	ipi_cpu(int cpu, u_int ipi);
 int	ipi_nmi_handler(void);
 void	ipi_selected(cpuset_t cpus, u_int ipi);
 u_int	mp_bootaddress(u_int);
-int	mp_grab_cpu_hlt(void);
 void	smp_cache_flush(void);
 void	smp_invlpg(vm_offset_t addr);
 void	smp_masked_invlpg(cpuset_t mask, vm_offset_t addr);

Modified: head/sys/pc98/pc98/machdep.c
==============================================================================
--- head/sys/pc98/pc98/machdep.c	Wed Jun  8 08:08:42 2011	(r222852)
+++ head/sys/pc98/pc98/machdep.c	Wed Jun  8 08:12:15 2011	(r222853)
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
 #include "opt_isa.h"
 #include "opt_kstack_pages.h"
 #include "opt_maxmem.h"
+#include "opt_mp_watchdog.h"
 #include "opt_npx.h"
 #include "opt_perfmon.h"
 
@@ -115,6 +116,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/intr_machdep.h>
 #include <x86/mca.h>
 #include <machine/md_var.h>
+#include <machine/mp_watchdog.h>
 #include <machine/pc/bios.h>
 #include <machine/pcb.h>
 #include <machine/pcb_ext.h>
@@ -1193,9 +1195,8 @@ cpu_idle(int busy)
 
 	CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
 	    busy, curcpu);
-#ifdef SMP
-	if (mp_grab_cpu_hlt())
-		return;
+#ifdef MP_WATCHDOG
+	ap_watchdog(PCPU_GET(cpuid));
 #endif
 	/* If we are busy - try to use fast methods. */
 	if (busy) {


More information about the svn-src-head mailing list