Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 Jun 2006 03:37:17 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 100182 for review
Message-ID:  <200606280337.k5S3bHh3038507@repoman.freebsd.org>

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

Change 100182 by kmacy@kmacy_storage:sun4v_work_sleepq on 2006/06/28 03:36:26

	add timeout functionality to sxu locks
	and sxu.h header as a base

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_sxu.c#2 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/sxu.h#1 add

Differences ...

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

@@ -110,13 +110,16 @@
 	lock_destroy(&sx->sx_object);
 }
 
-void
-_sx_slock(struct sx *sx, const char *file, int line)
+int
+_sx_slock(struct sx *sx, int timo, const char *file, int line)
 {
 
-	int contested;
-	uint64_t waittime = 0;
-
+	int contested, error;
+	uint64_t waittime;
+	
+	waittime = 0;
+	error = 0;
+	
 	mtx_lock(sx->sx_lock);
 	KASSERT(sx->sx_xholder != curthread,
 	    ("%s (%s): slock while xlock is held @ %s:%d\n", __func__,
@@ -131,8 +134,13 @@
 	while (sx->sx_cnt < 0) {
 		sx->sx_shrd_wcnt++;
 		lock_profile_obtain_lock_failed(&sx->sx_object, &contested);
-		cv_wait(&sx->sx_shrd_cv, sx->sx_lock);
+		if (timo)
+			error = cv_timedwait(&sx->sx_shrd_cv, sx->sx_lock, timo);
+		else
+			cv_wait(&sx->sx_shrd_cv, sx->sx_lock);
 		sx->sx_shrd_wcnt--;
+		if (error)
+			goto fail;
 	}
 
 
@@ -145,7 +153,9 @@
 	LOCK_LOG_LOCK("SLOCK", &sx->sx_object, 0, 0, file, line);
 	WITNESS_LOCK(&sx->sx_object, 0, file, line);
 
+ fail:
 	mtx_unlock(sx->sx_lock);
+	return (error);
 }
 
 int
@@ -166,12 +176,15 @@
 	}
 }
 
-void
-_sx_xlock(struct sx *sx, const char *file, int line)
+int
+_sx_xlock(struct sx *sx, int timo, const char *file, int line)
 {
 	
-	int contested;
-	uint64_t waittime = 0;
+	int contested, error;
+	uint64_t waittime;
+	
+	error = 0;
+	waittime= 0;
 	
 	mtx_lock(sx->sx_lock);
 
@@ -194,8 +207,14 @@
 	while (sx->sx_cnt != 0) {
 		sx->sx_excl_wcnt++;
 		lock_profile_obtain_lock_failed(&sx->sx_object, &contested);
-		cv_wait(&sx->sx_excl_cv, sx->sx_lock);
+		if (timo)
+			error = cv_timedwait(&sx->sx_excl_cv, sx->sx_lock, timo);
+		else
+			cv_wait(&sx->sx_excl_cv, sx->sx_lock);
 		sx->sx_excl_wcnt--;
+		
+		if (error)
+			goto fail;
 	}
 
 	MPASS(sx->sx_cnt == 0);
@@ -208,7 +227,9 @@
 	LOCK_LOG_LOCK("XLOCK", &sx->sx_object, 0, 0, file, line);
 	WITNESS_LOCK(&sx->sx_object, LOP_EXCLUSIVE, file, line);
 
+ fail:
 	mtx_unlock(sx->sx_lock);
+	return (error);
 }
 
 int
@@ -255,7 +276,7 @@
 	if (sx->sx_excl_wcnt > 0) {
 		if (sx->sx_cnt == 0)
 			cv_signal(&sx->sx_excl_cv);
-	} else if (sx->sx_shrd_wcnt > 0)
+	} else if (sx->sx_shrd_wcnt > 0) /* XXX why would shrd_wcnt be > 0 if the holder is shared? */
 		cv_broadcast(&sx->sx_shrd_cv);
 
 	LOCK_LOG_LOCK("SUNLOCK", &sx->sx_object, 0, 0, file, line);



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