Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Jun 2006 20:55:15 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 100090 for review
Message-ID:  <200606262055.k5QKtF9l022380@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100090

Change 100090 by kmacy@kmacy_storage:sun4v_work_sleepq on 2006/06/26 20:55:08

	fix missing lock acquisitions of threads

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/kern/subr_turnstile.c#8 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/kern/subr_turnstile.c#8 (text+ko) ====

@@ -88,8 +88,7 @@
  */
 #define	TC_TABLESIZE	128			/* Must be power of 2. */
 #define	TC_MASK		(TC_TABLESIZE - 1)
-#define	TC_SHIFT	8
-#define	TC_HASH(lock)	(((uintptr_t)(lock) >> TC_SHIFT) & TC_MASK)
+#define	TC_HASH(lock)	((lock)->lo_id & TC_MASK)
 #define	TC_LOOKUP(lock)	&turnstile_chains[TC_HASH(lock)]
 
 /*
@@ -837,7 +836,6 @@
 	 */
 	td = curthread;
 	pri = PRI_MAX;
-	TD_SLOCK(td);
 	mtx_lock_spin(&td_contested_lock);
 	LIST_FOREACH(ts, &td->td_contested, ts_link) {
 		cp = turnstile_first_waiter(ts)->td_priority;
@@ -845,8 +843,10 @@
 			pri = cp;
 	}
 	mtx_unlock_spin(&td_contested_lock);
+	TD_SLOCK(td);
 	sched_unlend_prio(td, pri);
-
+	TD_SUNLOCK(td);
+	
 	/*
 	 * Wake up all the pending threads.  If a thread is not blocked
 	 * on a lock, then it is currently executing on another CPU in
@@ -866,14 +866,15 @@
 #endif
 			TD_CLR_LOCK(td);
 			MPASS(TD_CAN_RUN(td));
+			TD_SLOCK(td);
 			setrunqueue(td, SRQ_BORING);
+			TD_SUNLOCK(td);
 		} else {
 			atomic_set_int(&td->td_flags, TDF_TSNOBLOCK);
 			MPASS(TD_IS_RUNNING(td) || TD_ON_RUNQ(td));
 		}
 	}
 	critical_exit();
-	TD_SUNLOCK(td);
 }
 
 /*



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