kernel/lockmgr: Add lockmgr_try().
authorSascha Wildner <saw@online.de>
Sat, 21 Jul 2018 08:28:17 +0000 (10:28 +0200)
committerSascha Wildner <saw@online.de>
Sat, 21 Jul 2018 08:31:00 +0000 (10:31 +0200)
It just adds LK_NOWAIT to the flags and returns whether the
lock was obtained.

It is similar to other functions such as spin_trylock() or
FreeBSD's mtx_trylock() and can be used to port the latter.

Note that like these functions, it returns TRUE if successful,
while lockmgr() returns 0 if successful. This difference was
the source of minor confusion and porting mistakes in the past.
In fact, our driver porting document also didn't point out this
difference. I will fix some of these little issues in a separate
commit.

doc/porting_drivers.txt
share/man/man9/Makefile
share/man/man9/lock.9
sys/sys/lock.h

index e9757b9..f1ca49c 100644 (file)
@@ -82,7 +82,7 @@
   An
        mtx_trylock(&my_mtx);
   call is replaced with
-       lockmgr(&my_lock, LK_EXCLUSIVE|LK_NOWAIT);
+       lockmgr_try(&my_lock, LK_EXCLUSIVE);
 
   As for mtx_assert() calls, translate them like this:
 
index 5932b1a..0514cf4 100644 (file)
@@ -629,6 +629,7 @@ MLINKS+=kether_ntoa.9 kether_aton.9
 MLINKS+=lock.9 lockinit.9 \
        lock.9 lockmgr.9 \
        lock.9 lockmgr_printinfo.9 \
+       lock.9 lockmgr_try.9 \
        lock.9 lockowned.9 \
        lock.9 lockstatus.9 \
        lock.9 lockuninit.9
index fe244df..e907049 100644 (file)
 .\"
 .\" $FreeBSD: src/share/man/man9/lock.9,v 1.11 2003/09/08 19:57:21 ru Exp $
 .\"
-.Dd November 25, 2017
+.Dd July 21, 2018
 .Dt LOCK 9
 .Os
 .Sh NAME
 .Nm lockinit ,
 .Nm lockmgr ,
+.Nm lockmgr_try ,
 .Nm lockstatus ,
 .Nm lockmgr_printinfo ,
 .Nm lockowned
@@ -45,6 +46,8 @@
 .Fn lockuninit "struct lock *lkp"
 .Ft int
 .Fn lockmgr "struct lock *lkp" "u_int flags"
+.Ft boolean_t
+.Fn lockmgr_try "struct lock *lkp" "u_int flags"
 .Ft int
 .Fn lockstatus "struct lock *lkp" "struct thread *td"
 .Ft void
@@ -154,6 +157,16 @@ For every lock there must be a release.
 .El
 .Pp
 The
+.Fn lockmgr_try
+function is similar to
+.Fn lockmgr
+but it will not sleep and returns
+.Dv TRUE
+if the lock was successfully obtained and
+.Dv FALSE
+if it was not.
+.Pp
+The
 .Fn lockstatus
 function returns the status of the lock in relation to the
 .Vt thread
index 299e5c5..8f6dabd 100644 (file)
@@ -299,6 +299,17 @@ lockinuse(struct lock *lkp)
        return ((lkp->lk_count & (LKC_SMASK | LKC_XMASK)) != 0);
 }
 
+/*
+ * Returns true if the lock was acquired. Can be used to port
+ * FreeBSD's mtx_trylock() and similar functions.
+ */
+static __inline
+boolean_t
+lockmgr_try(struct lock *lkp, u_int flags)
+{
+       return (lockmgr(lkp, flags | LK_NOWAIT) == 0);
+}
+
 #endif /* _KERNEL */
 #endif /* _KERNEL || _KERNEL_STRUCTURES */
 #endif /* _SYS_LOCK_H_ */