This sounds better but why do we need a 'pause' at all?  I don't
    think spinning in this case will have any effect on power
    consumption.

                                        -Matt
                                        Matthew Dillon 
                                        <[EMAIL PROTECTED]>

:I would rather make the locks adaptive like so:  (untested)
:
:--- //depot/projects/smpng/sys/conf/options     2002/02/08 13:19:07
:+++ //depot/user/jhb/lock/conf/options  2002/02/08 13:50:54
:@@ -56,6 +56,7 @@
:                                        # mapped I/O
: 
: # Miscellaneous options.
:+ADAPTIVE_MUTEXES
: BLEED
: COMPAT_43      opt_compat.h
: COMPAT_SUNOS   opt_compat.h
:--- //depot/projects/smpng/sys/i386/include/cpufunc.h   2001/12/18 13:07:32
:+++ //depot/user/jhb/lock/i386/include/cpufunc.h        2001/12/20 15:54:32
:@@ -550,6 +550,12 @@
:        __asm __volatile("movl %0,%%dr7" : : "r" (sel));
: }
: 
:+static __inline void
:+cpu_pause(void)
:+{
:+       __asm __volatile("pause");
:+}
:+
: static __inline critical_t
: cpu_critical_enter(void)
: {
:--- //depot/projects/smpng/sys/kern/kern_mutex.c        2002/02/08 14:19:21
:+++ //depot/user/jhb/lock/kern/kern_mutex.c     2002/02/08 13:50:54
:@@ -34,6 +34,7 @@
:  * Machine independent bits of mutex implementation.
:  */
: 
:+#include "opt_adaptive_mutexes.h"
: #include "opt_ddb.h"
: 
: #include <sys/param.h>
:@@ -345,7 +354,22 @@
:                        continue;
:                }
: 
:+#if defined(SMP) && defined(ADAPTIVE_MUTEXES)
:                /*
:+                * If the current owner of the lock is executing on another
:+                * CPU, spin instead of blocking.
:+                */
:+               if (((struct thread *)(v & MTX_FLAGMASK)->td_kse->kse_oncpu !=
:+                   NOCPU) {
:+                       mtx_unlock_spin(&sched_lock);
:+#ifdef __i386__
:+                       cpu_pause();
:+#endif
:+                       continue;
:+               }
:+#endif /* SMP && ADAPTIVE_MUTEXES */
:+
:+               /*
:                 * We deffinately must sleep for this lock.
:                 */
:                mtx_assert(m, MA_NOTOWNED);
:@@ -433,6 +457,9 @@
:                /* Give interrupts a chance while we spin. */
:                critical_exit();
:                while (m->mtx_lock != MTX_UNOWNED) {
:+#ifdef __i386__
:+                       cpu_pause();
:+#endif
:                        if (i++ < 10000000)
:                                continue;
:                        if (i++ < 60000000)
:
:This is more a specific problem with Giant and I don't think it will be a
:problem with other mutexes, so I'd prefer a solution not quite so tailored to
:this particular behavior of Giant.
:
:-- 
:
:John Baldwin <[EMAIL PROTECTED]>  <><  http://www.FreeBSD.org/~jhb/
:"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to