Author: kevans
Date: Fri Dec 13 04:03:03 2019
New Revision: 355690
URL: https://svnweb.freebsd.org/changeset/base/355690

Log:
  MFC r352350: rangelock: add rangelock_cookie_assert
  
  A future change to posixshm to add file sealing 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.

Modified:
  stable/12/sys/kern/kern_rangelock.c
  stable/12/sys/sys/rangelock.h
Directory Properties:
  stable/12/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/11/sys/kern/kern_rangelock.c
  stable/11/sys/sys/rangelock.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/12/sys/kern/kern_rangelock.c
==============================================================================
--- stable/12/sys/kern/kern_rangelock.c Fri Dec 13 03:29:54 2019        
(r355689)
+++ stable/12/sys/kern/kern_rangelock.c Fri Dec 13 04:03:03 2019        
(r355690)
@@ -248,3 +248,35 @@ rangelock_wlock(struct rangelock *lock, off_t start, o
 
        return (rangelock_enqueue(lock, start, end, RL_LOCK_WRITE, ilk));
 }
+
+#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: stable/12/sys/sys/rangelock.h
==============================================================================
--- stable/12/sys/sys/rangelock.h       Fri Dec 13 03:29:54 2019        
(r355689)
+++ stable/12/sys/sys/rangelock.h       Fri Dec 13 04:03:03 2019        
(r355690)
@@ -78,6 +78,29 @@ void *rangelock_rlock(struct rangelock *lock, off_t st
 void   *rangelock_wlock(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 */
 
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to