Author: mjg
Date: Tue Aug  4 23:00:00 2020
New Revision: 363871
URL: https://svnweb.freebsd.org/changeset/base/363871

Log:
  mtx: add mtx_wait_unlocked

Modified:
  head/sys/kern/kern_mutex.c
  head/sys/sys/mutex.h

Modified: head/sys/kern/kern_mutex.c
==============================================================================
--- head/sys/kern/kern_mutex.c  Tue Aug  4 21:58:43 2020        (r363870)
+++ head/sys/kern/kern_mutex.c  Tue Aug  4 23:00:00 2020        (r363871)
@@ -1275,6 +1275,35 @@ mtx_spin_wait_unlocked(struct mtx *m)
        }
 }
 
+void
+mtx_wait_unlocked(struct mtx *m)
+{
+       struct thread *owner;
+       uintptr_t v;
+
+       KASSERT(m->mtx_lock != MTX_DESTROYED,
+           ("%s() of destroyed mutex %p", __func__, m));
+       KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_sleep,
+           ("%s() not a sleep mutex %p (%s)", __func__, m,
+           m->lock_object.lo_name));
+       KASSERT(!mtx_owned(m), ("%s() waiting on myself on lock %p (%s)", 
__func__, m,
+           m->lock_object.lo_name));
+
+       for (;;) {
+               v = atomic_load_acq_ptr(&m->mtx_lock);
+               if (v == MTX_UNOWNED) {
+                       break;
+               }
+               owner = lv_mtx_owner(v);
+               if (!TD_IS_RUNNING(owner)) {
+                       mtx_lock(m);
+                       mtx_unlock(m);
+                       break;
+               }
+               cpu_spinwait();
+       }
+}
+
 #ifdef DDB
 void
 db_show_mtx(const struct lock_object *lock)

Modified: head/sys/sys/mutex.h
==============================================================================
--- head/sys/sys/mutex.h        Tue Aug  4 21:58:43 2020        (r363870)
+++ head/sys/sys/mutex.h        Tue Aug  4 23:00:00 2020        (r363871)
@@ -106,6 +106,7 @@ void        __mtx_unlock_sleep(volatile uintptr_t *c, 
uintptr
 void   __mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v);
 void   __mtx_unlock_sleep(volatile uintptr_t *c, uintptr_t v);
 #endif
+void   mtx_wait_unlocked(struct mtx *m);
 
 #ifdef SMP
 #if LOCK_DEBUG > 0
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to