Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 May 2020 09:21:46 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r361190 - stable/12/sys/compat/linuxkpi/common/include/linux
Message-ID:  <202005180921.04I9LkoQ061983@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Mon May 18 09:21:45 2020
New Revision: 361190
URL: https://svnweb.freebsd.org/changeset/base/361190

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/12/sys/compat/linuxkpi/common/include/linux/lockdep.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/compat/linuxkpi/common/include/linux/lockdep.h
==============================================================================
--- stable/12/sys/compat/linuxkpi/common/include/linux/lockdep.h	Mon May 18 09:17:38 2020	(r361189)
+++ stable/12/sys/compat/linuxkpi/common/include/linux/lockdep.h	Mon May 18 09:21:45 2020	(r361190)
@@ -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)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005180921.04I9LkoQ061983>