Kernel mtx - Add mtxsleep(), interlocked tsleep w/ mutexes
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 7 Aug 2009 06:09:19 +0000 (23:09 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 7 Aug 2009 06:09:19 +0000 (23:09 -0700)
sys/kern/kern_synch.c
sys/sys/systm.h

index 23095b3..76dfb63 100644 (file)
@@ -61,6 +61,7 @@
 
 #include <sys/thread2.h>
 #include <sys/spinlock2.h>
+#include <sys/mutex2.h>
 #include <sys/serialize.h>
 
 #include <machine/cpu.h>
@@ -693,6 +694,26 @@ msleep(void *ident, struct spinlock *spin, int flags,
        return (error);
 }
 
+/*
+ * Interlocked mutex sleep.  An exclusively held mutex must be passed
+ * to mtxsleep().  The function will atomically release the mutex
+ * and tsleep on the ident, then reacquire the mutex and return.
+ */
+int
+mtxsleep(void *ident, struct mtx *mtx, int flags,
+        const char *wmesg, int timo)
+{
+       globaldata_t gd = mycpu;
+       int error;
+
+       _tsleep_interlock(gd, ident, flags);
+       mtx_unlock(mtx);
+       error = tsleep(ident, flags | PINTERLOCKED, wmesg, timo);
+       mtx_lock_ex_quick(mtx, wmesg);
+
+       return (error);
+}
+
 /*
  * Interlocked serializer sleep.  An exclusively held serializer must
  * be passed to serialize_sleep().  The function will atomically release
index 7a2fb37..d1df769 100644 (file)
@@ -123,6 +123,7 @@ extern vm_paddr_t Maxmem;   /* Highest physical memory address in system */
 
 struct intrframe;
 struct spinlock;
+struct mtx;
 struct lwkt_serialize;
 struct malloc_type;
 struct proc;
@@ -332,6 +333,7 @@ extern watchdog_tickle_fn   wdog_tickler;
  */
 int    tsleep (void *, int, const char *, int);
 int    msleep (void *, struct spinlock *, int, const char *, int);
+int    mtxsleep (void *, struct mtx *, int, const char *, int);
 int    serialize_sleep(void *, struct lwkt_serialize *, int,
                        const char *, int);
 void   tsleep_interlock (void *, int);