svn commit: r211733 - head/sys/kern

David Xu davidxu at FreeBSD.org
Tue Aug 24 07:29:55 UTC 2010


Author: davidxu
Date: Tue Aug 24 07:29:55 2010
New Revision: 211733
URL: http://svn.freebsd.org/changeset/base/211733

Log:
  Optimize thr_suspend, if timeout is zero, don't call msleep, just
  return immediately.

Modified:
  head/sys/kern/kern_thr.c

Modified: head/sys/kern/kern_thr.c
==============================================================================
--- head/sys/kern/kern_thr.c	Tue Aug 24 07:22:24 2010	(r211732)
+++ head/sys/kern/kern_thr.c	Tue Aug 24 07:29:55 2010	(r211733)
@@ -430,15 +430,12 @@ int
 kern_thr_suspend(struct thread *td, struct timespec *tsp)
 {
 	struct timeval tv;
-	int error = 0, hz = 0;
+	int error = 0;
+	int timo = 0;
 
 	if (tsp != NULL) {
 		if (tsp->tv_nsec < 0 || tsp->tv_nsec > 1000000000)
 			return (EINVAL);
-		if (tsp->tv_sec == 0 && tsp->tv_nsec == 0)
-			return (ETIMEDOUT);
-		TIMESPEC_TO_TIMEVAL(&tv, tsp);
-		hz = tvtohz(&tv);
 	}
 
 	if (td->td_pflags & TDP_WAKEUP) {
@@ -447,9 +444,17 @@ kern_thr_suspend(struct thread *td, stru
 	}
 
 	PROC_LOCK(td->td_proc);
-	if ((td->td_flags & TDF_THRWAKEUP) == 0)
-		error = msleep((void *)td, &td->td_proc->p_mtx, PCATCH, "lthr",
-		    hz);
+	if ((td->td_flags & TDF_THRWAKEUP) == 0) {
+		if (tsp->tv_sec == 0 && tsp->tv_nsec == 0)
+			error = EWOULDBLOCK;
+		else {
+			TIMESPEC_TO_TIMEVAL(&tv, tsp);
+			timo = tvtohz(&tv);
+			error = msleep((void *)td, &td->td_proc->p_mtx,
+				 PCATCH, "lthr", timo);
+		}
+	}
+
 	if (td->td_flags & TDF_THRWAKEUP) {
 		thread_lock(td);
 		td->td_flags &= ~TDF_THRWAKEUP;
@@ -461,7 +466,7 @@ kern_thr_suspend(struct thread *td, stru
 	if (error == EWOULDBLOCK)
 		error = ETIMEDOUT;
 	else if (error == ERESTART) {
-		if (hz != 0)
+		if (timo != 0)
 			error = EINTR;
 	}
 	return (error);


More information about the svn-src-all mailing list