aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2019-08-23 06:39:40 +0000
committerXin LI <delphij@FreeBSD.org>2019-08-23 06:39:40 +0000
commita11bf9a49bb2eb742095fc9bf268c6edb214a1fe (patch)
treeedd37f79aeec3179d05635034aa249cdc9c4d565
parent877b6cbba1cb2ed66df9671b392796cc01e62f12 (diff)
downloadsrc-a11bf9a49bb2eb742095fc9bf268c6edb214a1fe.tar.gz
src-a11bf9a49bb2eb742095fc9bf268c6edb214a1fe.zip
INVARIANTS: treat LA_LOCKED as the same of LA_XLOCKED in mtx_assert.
The Linux lockdep API assumes LA_LOCKED semantic in lockdep_assert_held(), meaning that either a shared lock or write lock is Ok. On the other hand, the timeout code uses lc_assert() with LA_XLOCKED, and we need both to work. For mutexes, because they can not be shared (this is unique among all lock classes, and it is unlikely that we would add new lock class anytime soon), it is easier to simply extend mtx_assert to handle LA_LOCKED there, despite the change itself can be viewed as a slight abstraction violation. Reviewed by: mjg, cem, jhb MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D21362
Notes
Notes: svn path=/head/; revision=351417
-rw-r--r--sys/kern/kern_mutex.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c
index a35cd3b834fb..ca6fbb157324 100644
--- a/sys/kern/kern_mutex.c
+++ b/sys/kern/kern_mutex.c
@@ -176,6 +176,21 @@ void
assert_mtx(const struct lock_object *lock, int what)
{
+ /*
+ * Treat LA_LOCKED as if LA_XLOCKED was asserted.
+ *
+ * Some callers of lc_assert uses LA_LOCKED to indicate that either
+ * a shared lock or write lock was held, while other callers uses
+ * the more strict LA_XLOCKED (used as MA_OWNED).
+ *
+ * Mutex is the only lock class that can not be shared, as a result,
+ * we can reasonably consider the caller really intends to assert
+ * LA_XLOCKED when they are asserting LA_LOCKED on a mutex object.
+ */
+ if (what & LA_LOCKED) {
+ what &= ~LA_LOCKED;
+ what |= LA_XLOCKED;
+ }
mtx_assert((const struct mtx *)lock, what);
}