svn commit: r352350 - in head/sys: kern sys

Kyle Evans kevans at FreeBSD.org
Sun Sep 15 02:59:54 UTC 2019


Author: kevans
Date: Sun Sep 15 02:59:53 2019
New Revision: 352350
URL: https://svnweb.freebsd.org/changeset/base/352350

Log:
  rangelock: add rangelock_cookie_assert
  
  A future change to posixshm to add file sealing (in DIFF_21391[0] and child)
  will move locking out of shm_dotruncate as kern_shm_open() will require the
  lock to be held across the dotruncate until the seal is actually applied.
  For this, the cookie is passed into shm_dotruncate_locked which asserts
  RCA_WLOCKED.
  
  [0] Name changed to protect the innocent, hopefully, from getting autoclosed
  due to this reference...
  
  Reviewed by:	kib
  Differential Revision:	https://reviews.freebsd.org/D21628

Modified:
  head/sys/kern/kern_rangelock.c
  head/sys/sys/rangelock.h

Modified: head/sys/kern/kern_rangelock.c
==============================================================================
--- head/sys/kern/kern_rangelock.c	Sun Sep 15 02:48:15 2019	(r352349)
+++ head/sys/kern/kern_rangelock.c	Sun Sep 15 02:59:53 2019	(r352350)
@@ -299,3 +299,35 @@ rangelock_trywlock(struct rangelock *lock, off_t start
 
 	return (rangelock_enqueue(lock, start, end, RL_LOCK_WRITE, ilk, true));
 }
+
+#ifdef INVARIANT_SUPPORT
+void
+_rangelock_cookie_assert(void *cookie, int what, const char *file, int line)
+{
+	struct rl_q_entry *entry;
+	int flags;
+
+	MPASS(cookie != NULL);
+	entry = cookie;
+	flags = entry->rl_q_flags;
+	switch (what) {
+	case RCA_LOCKED:
+		if ((flags & RL_LOCK_GRANTED) == 0)
+			panic("rangelock not held @ %s:%d\n", file, line);
+		break;
+	case RCA_RLOCKED:
+		if ((flags & (RL_LOCK_GRANTED | RL_LOCK_READ)) !=
+		    (RL_LOCK_GRANTED | RL_LOCK_READ))
+			panic("rangelock not rlocked @ %s:%d\n", file, line);
+		break;
+	case RCA_WLOCKED:
+		if ((flags & (RL_LOCK_GRANTED | RL_LOCK_WRITE)) !=
+		    (RL_LOCK_GRANTED | RL_LOCK_WRITE))
+			panic("rangelock not wlocked @ %s:%d\n", file, line);
+		break;
+	default:
+		panic("Unknown rangelock assertion: %d @ %s:%d", what, file,
+		    line);
+	}
+}
+#endif	/* INVARIANT_SUPPORT */

Modified: head/sys/sys/rangelock.h
==============================================================================
--- head/sys/sys/rangelock.h	Sun Sep 15 02:48:15 2019	(r352349)
+++ head/sys/sys/rangelock.h	Sun Sep 15 02:59:53 2019	(r352350)
@@ -82,6 +82,29 @@ void	*rangelock_wlock(struct rangelock *lock, off_t st
 void	*rangelock_trywlock(struct rangelock *lock, off_t start, off_t end,
 	    struct mtx *ilk);
 void	 rlqentry_free(struct rl_q_entry *rlqe);
+#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
+void	_rangelock_cookie_assert(void *cookie, int what, const char *file,
+    int line);
+#endif
+
+#ifdef INVARIANTS
+#define	rangelock_cookie_assert_(cookie, what, file, line)	\
+	_rangelock_cookie_assert((cookie), (what), (file), (line))
+#else
+#define	rangelock_cookie_assert_(cookie, what, file, line)		(void)0
+#endif
+
+#define	rangelock_cookie_assert(cookie, what)	\
+	rangelock_cookie_assert_((cookie), (what), __FILE__, __LINE__)
+
+/*
+ * Assertion flags.
+ */
+#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
+#define	RCA_LOCKED	0x0001
+#define	RCA_RLOCKED	0x0002
+#define	RCA_WLOCKED	0x0004
+#endif
 
 #endif	/* _KERNEL */
 


More information about the svn-src-head mailing list