svn commit: r361191 - stable/11/sys/compat/linuxkpi/common/include/linux
Hans Petter Selasky
hselasky at FreeBSD.org
Mon May 18 09:22:18 UTC 2020
Author: hselasky
Date: Mon May 18 09:22:17 2020
New Revision: 361191
URL: https://svnweb.freebsd.org/changeset/base/361191
Log:
MFC r351003:
Fix build with DRM and INVARIANTS enabled.
The DRM drivers use the lockdep assertion macros with spinlock_t locks
which are backed by mutexes, not sx locks. This causes compile
failures since you can't use sx_assert with a mutex. Instead, change
the lockdep macros to use lock_class methods. This works by assuming
that each LinuxKPI locking primitive embeds a FreeBSD lock as its
first structure and uses a cast to get to the underlying 'struct
lock_object'.
Reviewed by: hselasky
Differential Revision: https://reviews.freebsd.org/D20992
Modified:
stable/11/sys/compat/linuxkpi/common/include/linux/lockdep.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/compat/linuxkpi/common/include/linux/lockdep.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/linux/lockdep.h Mon May 18 09:21:45 2020 (r361190)
+++ stable/11/sys/compat/linuxkpi/common/include/linux/lockdep.h Mon May 18 09:22:17 2020 (r361191)
@@ -40,13 +40,34 @@ struct lock_class_key {
#define lockdep_set_current_reclaim_state(g) do { } while (0)
#define lockdep_clear_current_reclaim_state() do { } while (0)
-#define lockdep_assert_held(m) \
- sx_assert(&(m)->sx, SA_XLOCKED)
+#ifdef INVARIANTS
+#define lockdep_assert_held(m) do { \
+ struct lock_object *__lock = (struct lock_object *)(m); \
+ LOCK_CLASS(__lock)->lc_assert(__lock, LA_LOCKED); \
+} while (0)
-#define lockdep_assert_held_once(m) \
- sx_assert(&(m)->sx, SA_XLOCKED | SA_NOTRECURSED)
+#define lockdep_assert_held_once(m) do { \
+ struct lock_object *__lock = (struct lock_object *)(m); \
+ LOCK_CLASS(__lock)->lc_assert(__lock, LA_LOCKED | LA_NOTRECURSED); \
+} while (0)
-#define lockdep_is_held(m) (sx_xholder(&(m)->sx) == curthread)
+static __inline bool
+lockdep_is_held(void *__m)
+{
+ struct lock_object *__lock;
+ struct thread *__td;
+
+ __lock = __m;
+ return (LOCK_CLASS(__lock)->lc_owner(__lock, &__td) != 0);
+}
+
+#else
+#define lockdep_assert_held(m) do { } while (0)
+
+#define lockdep_assert_held_once(m) do { } while (0)
+
+#define lockdep_is_held(m) 1
+#endif
#define might_lock(m) do { } while (0)
#define might_lock_read(m) do { } while (0)
More information about the svn-src-all
mailing list