Author: jeff
Date: Thu Feb 13 20:50:21 2020
New Revision: 357882
URL: https://svnweb.freebsd.org/changeset/base/357882

Log:
  Add more precise SMR entry asserts.

Modified:
  head/sys/kern/subr_smr.c
  head/sys/sys/smr.h

Modified: head/sys/kern/subr_smr.c
==============================================================================
--- head/sys/kern/subr_smr.c    Thu Feb 13 20:49:45 2020        (r357881)
+++ head/sys/kern/subr_smr.c    Thu Feb 13 20:50:21 2020        (r357882)
@@ -193,8 +193,7 @@ smr_advance(smr_t smr)
        /*
         * It is illegal to enter while in an smr section.
         */
-       KASSERT(curthread->td_critnest == 0,
-           ("smr_advance: Not allowed in a critical section."));
+       SMR_ASSERT_NOT_ENTERED(smr);
 
        /*
         * Modifications not done in a smr section need to be visible
@@ -237,6 +236,8 @@ smr_advance_deferred(smr_t smr, int limit)
        smr_seq_t goal;
        smr_t csmr;
 
+       SMR_ASSERT_NOT_ENTERED(smr);
+
        critical_enter();
        csmr = zpcpu_get(smr);
        if (++csmr->c_deferred >= limit) {
@@ -275,8 +276,8 @@ smr_poll(smr_t smr, smr_seq_t goal, bool wait)
        /*
         * It is illegal to enter while in an smr section.
         */
-       KASSERT(!wait || curthread->td_critnest == 0,
-           ("smr_poll: Blocking not allowed in a critical section."));
+       KASSERT(!wait || !SMR_ENTERED(smr),
+           ("smr_poll: Blocking not allowed in a SMR section."));
 
        /*
         * Use a critical section so that we can avoid ABA races

Modified: head/sys/sys/smr.h
==============================================================================
--- head/sys/sys/smr.h  Thu Feb 13 20:49:45 2020        (r357881)
+++ head/sys/sys/smr.h  Thu Feb 13 20:50:21 2020        (r357882)
@@ -68,6 +68,15 @@ struct smr {
        int             c_deferred;     /* Deferred advance counter. */
 };
 
+#define        SMR_ENTERED(smr)                                                
\
+    (curthread->td_critnest != 0 && zpcpu_get((smr))->c_seq != SMR_SEQ_INVALID)
+
+#define        SMR_ASSERT_ENTERED(smr)                                         
\
+    KASSERT(SMR_ENTERED(smr), ("Not in smr section"))
+
+#define        SMR_ASSERT_NOT_ENTERED(smr)                                     
\
+    KASSERT(!SMR_ENTERED(smr), ("In smr section."));
+
 /*
  * Return the current write sequence number.
  */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to