Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Jun 2006 07:42:12 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 100121 for review
Message-ID:  <200606270742.k5R7gCfT001310@repoman.freebsd.org>

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

Change 100121 by kmacy@kmacy_storage:sun4v_work_sleepq on 2006/06/27 07:41:14

	avoid pointless turnstile contention if mutex owner is running

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#20 edit

Differences ...

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

@@ -176,7 +176,7 @@
 static int mutex_prof_maxrecords = MPROF_HASH_SIZE;
 SYSCTL_INT(_debug_mutex_prof, OID_AUTO, maxrecords, CTLFLAG_RD,
     &mutex_prof_maxrecords, 0, "Maximum number of profiling records");
-int mutex_prof_rejected;
+int mutex_prof_rejected = 0;
 SYSCTL_INT(_debug_mutex_prof, OID_AUTO, rejected, CTLFLAG_RD,
     &mutex_prof_rejected, 0, "Number of rejected profiling records");
 static int mutex_prof_hashsize = MPROF_HASH_SIZE;
@@ -418,6 +418,16 @@
 
 	while (!_obtain_lock(m, tid)) {
 		lock_profile_obtain_lock_failed(&m->mtx_object, &contested);
+#if defined(SMP) && !defined(NO_ADAPTIVE_MUTEXES)
+		/*
+		 * If the current owner of the lock is executing on another
+		 * CPU, spin instead of blocking.
+		 */
+		for (owner = mtx_owner(m); owner && TD_IS_RUNNING(owner); owner = mtx_owner(m))
+			cpu_spinwait();
+		if (mtx_unowned(m))
+			continue;
+#endif	/* SMP && !NO_ADAPTIVE_MUTEXES */
 		turnstile_lock(&m->mtx_object);
 		v = m->mtx_lock;
 
@@ -425,7 +435,7 @@
 		 * Check if the lock has been released while spinning for
 		 * the turnstile chain lock.
 		 */
-		if (v == MTX_UNOWNED) {
+		if (mtx_unowned(m)) {
 			turnstile_release(&m->mtx_object);
 			cpu_spinwait();
 			continue;
@@ -837,6 +847,8 @@
 	mtx_validate(m);
 #endif
 
+
+
 	/* Determine lock class and lock flags. */
 	if (opts & MTX_SPIN)
 		class = &lock_class_mtx_spin;



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