Author: jhb
Date: Tue Aug 13 21:15:59 2019
New Revision: 351003
URL: https://svnweb.freebsd.org/changeset/base/351003

Log:
  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
  MFC after:    2 weeks
  Differential Revision:        https://reviews.freebsd.org/D20992

Modified:
  head/sys/compat/linuxkpi/common/include/linux/lockdep.h

Modified: head/sys/compat/linuxkpi/common/include/linux/lockdep.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/lockdep.h     Tue Aug 13 
20:56:44 2019        (r351002)
+++ head/sys/compat/linuxkpi/common/include/linux/lockdep.h     Tue Aug 13 
21:15:59 2019        (r351003)
@@ -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)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to