Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Mar 2010 16:53:09 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r205172 - head/sys/ia64/ia64
Message-ID:  <201003151653.o2FGr9wO019718@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Mon Mar 15 16:53:09 2010
New Revision: 205172
URL: http://svn.freebsd.org/changeset/base/205172

Log:
  Have cpu_throw() loop on blocked_lock as well. This bug has existed
  a long time and has gone unnoticed just as long, because I kept
  using sched_4bsd (due to sched_ule not working with preemption),
  but GENERIC had sched_ule by default -- including SMP.
  
  While here, remove unused inclusion of <machine/clock.h>, remove
  totally bogus inclusion of <i386/include/specialreg.h>.

Modified:
  head/sys/ia64/ia64/machdep.c

Modified: head/sys/ia64/ia64/machdep.c
==============================================================================
--- head/sys/ia64/ia64/machdep.c	Mon Mar 15 16:39:52 2010	(r205171)
+++ head/sys/ia64/ia64/machdep.c	Mon Mar 15 16:53:09 2010	(r205172)
@@ -80,7 +80,6 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_pager.h>
 
 #include <machine/bootinfo.h>
-#include <machine/clock.h>
 #include <machine/cpu.h>
 #include <machine/efi.h>
 #include <machine/elf.h>
@@ -100,8 +99,6 @@ __FBSDID("$FreeBSD$");
 #include <machine/unwind.h>
 #include <machine/vmparam.h>
 
-#include <i386/include/specialreg.h>
-
 SYSCTL_NODE(_hw, OID_AUTO, freq, CTLFLAG_RD, 0, "");
 SYSCTL_NODE(_machdep, OID_AUTO, cpu, CTLFLAG_RD, 0, "");
 
@@ -450,18 +447,22 @@ cpu_switch(struct thread *old, struct th
 		old->td_frame->tf_special.psr |= IA64_PSR_DFH;
 	if (!savectx(oldpcb)) {
 		atomic_store_rel_ptr(&old->td_lock, mtx);
-#if defined(SCHED_ULE) && defined(SMP)
-		/* td_lock is volatile */
-		while (new->td_lock == &blocked_lock)
-			;
-#endif
+
 		newpcb = new->td_pcb;
 		oldpcb->pcb_current_pmap =
 		    pmap_switch(newpcb->pcb_current_pmap);
+
+#if defined(SCHED_ULE) && defined(SMP)
+		while (atomic_load_acq_ptr(&new->td_lock) == &blocked_lock)
+			cpu_spinwait();
+#endif
+
 		PCPU_SET(curthread, new);
+
 #ifdef COMPAT_FREEBSD32
 		ia32_restorectx(newpcb);
 #endif
+
 		if (PCPU_GET(fpcurthread) == new)
 			new->td_frame->tf_special.psr &= ~IA64_PSR_DFH;
 		restorectx(newpcb);
@@ -478,10 +479,18 @@ cpu_throw(struct thread *old __unused, s
 
 	newpcb = new->td_pcb;
 	(void)pmap_switch(newpcb->pcb_current_pmap);
+
+#if defined(SCHED_ULE) && defined(SMP)
+	while (atomic_load_acq_ptr(&new->td_lock) == &blocked_lock)
+		cpu_spinwait();
+#endif
+
 	PCPU_SET(curthread, new);
+
 #ifdef COMPAT_FREEBSD32
 	ia32_restorectx(newpcb);
 #endif
+
 	restorectx(newpcb);
 	/* We should not get here. */
 	panic("cpu_throw: restorectx() returned");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003151653.o2FGr9wO019718>