Implement an architecture call for contended spinlocks so the vkernel can
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 2 Jul 2007 16:52:01 +0000 (16:52 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 2 Jul 2007 16:52:01 +0000 (16:52 +0000)
insert a usleep().

sys/kern/kern_spinlock.c
sys/platform/pc32/i386/machdep.c
sys/platform/vkernel/i386/cpu_regs.c
sys/sys/systm.h

index f83accc..a96645e 100644 (file)
@@ -29,7 +29,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/kern_spinlock.c,v 1.10 2007/02/21 02:19:39 corecode Exp $
+ * $DragonFly: src/sys/kern/kern_spinlock.c,v 1.11 2007/07/02 16:51:58 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -262,6 +262,7 @@ exponential_backoff(struct exponential_backoff *bo)
         * Indefinite
         */
        ++spinlocks_contested2;
+       cpu_spinlock_contested();
        if (bo->nsec == 0) {
                bo->base = sys_cputimer->count();
                bo->nsec = 1;
index f650aa7..7964cfe 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.126 2007/07/02 01:37:09 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.127 2007/07/02 16:52:01 dillon Exp $
  */
 
 #include "use_apm.h"
@@ -959,6 +959,17 @@ cpu_mplock_contested(void)
        cpu_pause();
 }
 
+/*
+ * This routine is called if a spinlock has been held through the
+ * exponential backoff period and is seriously contested.  On a real cpu
+ * we let it spin.
+ */
+void
+cpu_spinlock_contested(void)
+{
+       cpu_pause();
+}
+
 /*
  * Clear registers on exec
  */
index 9fbcb83..e502a3c 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/platform/vkernel/i386/cpu_regs.c,v 1.20 2007/07/02 06:30:26 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/i386/cpu_regs.c,v 1.21 2007/07/02 16:52:00 dillon Exp $
  */
 
 #include "use_ether.h"
@@ -749,6 +749,16 @@ cpu_mplock_contested(void)
        usleep(1000);
 }
 
+/*
+ * Called by the spinlock code with or without a critical section held
+ * when a spinlock is found to be seriously constested.
+ */
+void
+cpu_spinlock_contested(void)
+{
+       usleep(1000);
+}
+
 #endif
 
 /*
index 6ac300b..688cc11 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)systm.h     8.7 (Berkeley) 3/29/95
  * $FreeBSD: src/sys/sys/systm.h,v 1.111.2.18 2002/12/17 18:04:02 sam Exp $
- * $DragonFly: src/sys/sys/systm.h,v 1.72 2007/07/02 01:37:11 dillon Exp $
+ * $DragonFly: src/sys/sys/systm.h,v 1.73 2007/07/02 16:52:01 dillon Exp $
  */
 
 #ifndef _SYS_SYSTM_H_
@@ -147,6 +147,7 @@ void        *phashinit (int count, struct malloc_type *type, u_long *nentries);
 int    cpu_sanitize_frame (struct trapframe *);
 int    cpu_sanitize_tls (struct savetls *);
 void   cpu_mplock_contested(void);
+void   cpu_spinlock_contested(void);
 void   cpu_halt (void);
 void   cpu_reset (void);
 void   cpu_boot (int);