Author: ae
Date: Mon Oct  1 10:46:00 2018
New Revision: 339039
URL: https://svnweb.freebsd.org/changeset/base/339039

Log:
  Add INP_INFO_WUNLOCK_ASSERT() macro and use it instead of
  INP_INFO_UNLOCK_ASSERT() in TCP-related code. For encapsulated traffic
  it is possible, that the code is running in net_epoch_preempt section,
  and INP_INFO_UNLOCK_ASSERT() is very strict assertion for such case.
  
  PR:           231428
  Reviewed by:  mmacy, tuexen
  Approved by:  re (kib)
  Differential Revision:        https://reviews.freebsd.org/D17335

Modified:
  head/sys/netinet/in_pcb.h
  head/sys/netinet/siftr.c
  head/sys/netinet/tcp_hpts.c
  head/sys/netinet/tcp_input.c

Modified: head/sys/netinet/in_pcb.h
==============================================================================
--- head/sys/netinet/in_pcb.h   Mon Oct  1 10:44:33 2018        (r339038)
+++ head/sys/netinet/in_pcb.h   Mon Oct  1 10:46:00 2018        (r339039)
@@ -642,6 +642,8 @@ int inp_so_options(const struct inpcb *inp);
 #define        INP_INFO_LOCK_ASSERT(ipi)       
MPASS(in_epoch(net_epoch_preempt) || mtx_owned(&(ipi)->ipi_lock))
 #define INP_INFO_RLOCK_ASSERT(ipi)     MPASS(in_epoch(net_epoch_preempt))
 #define INP_INFO_WLOCK_ASSERT(ipi)     mtx_assert(&(ipi)->ipi_lock, MA_OWNED)
+#define INP_INFO_WUNLOCK_ASSERT(ipi)   \
+       mtx_assert(&(ipi)->ipi_lock, MA_NOTOWNED)
 #define INP_INFO_UNLOCK_ASSERT(ipi)    MPASS(!in_epoch(net_epoch_preempt) && 
!mtx_owned(&(ipi)->ipi_lock))
 
 #define INP_LIST_LOCK_INIT(ipi, d) \

Modified: head/sys/netinet/siftr.c
==============================================================================
--- head/sys/netinet/siftr.c    Mon Oct  1 10:44:33 2018        (r339038)
+++ head/sys/netinet/siftr.c    Mon Oct  1 10:46:00 2018        (r339039)
@@ -710,7 +710,7 @@ siftr_findinpcb(int ipver, struct ip *ip, struct mbuf 
        struct inpcb *inp;
 
        /* We need the tcbinfo lock. */
-       INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+       INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
 
        if (dir == PFIL_IN)
                inp = (ipver == INP_IPV4 ?

Modified: head/sys/netinet/tcp_hpts.c
==============================================================================
--- head/sys/netinet/tcp_hpts.c Mon Oct  1 10:44:33 2018        (r339038)
+++ head/sys/netinet/tcp_hpts.c Mon Oct  1 10:46:00 2018        (r339039)
@@ -1282,7 +1282,7 @@ out:
                                 * lock again but we also need some kasserts
                                 * here.
                                 */
-                               INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+                               INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
                                INP_UNLOCK_ASSERT(inp);
                                m = n;
                                if (m)
@@ -1324,7 +1324,7 @@ out:
                        INP_WUNLOCK(inp);
                if (ti_locked == TI_RLOCKED)
                        INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
-               INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+               INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
                INP_UNLOCK_ASSERT(inp);
                ti_locked = TI_UNLOCKED;
                mtx_lock(&hpts->p_mtx);

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c        Mon Oct  1 10:44:33 2018        
(r339038)
+++ head/sys/netinet/tcp_input.c        Mon Oct  1 10:46:00 2018        
(r339039)
@@ -800,7 +800,7 @@ findpcb:
        if (ti_locked == TI_RLOCKED) {
                INP_INFO_RLOCK_ASSERT(&V_tcbinfo);
        } else {
-               INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+               INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
        }
 #endif
 #ifdef INET6
@@ -1358,7 +1358,7 @@ tfo_socket_result:
                        INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
                        ti_locked = TI_UNLOCKED;
                }
-               INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+               INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
                return (IPPROTO_DONE);
        } else if (tp->t_state == TCPS_LISTEN) {
                /*
@@ -1405,7 +1405,7 @@ dropwithreset:
        else {
                KASSERT(ti_locked == TI_UNLOCKED, ("%s: dropwithreset "
                    "ti_locked: %d", __func__, ti_locked));
-               INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+               INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
        }
 #endif
 
@@ -1429,7 +1429,7 @@ dropunlock:
        else {
                KASSERT(ti_locked == TI_UNLOCKED, ("%s: dropunlock "
                    "ti_locked: %d", __func__, ti_locked));
-               INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+               INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
        }
 #endif
 
@@ -1437,7 +1437,7 @@ dropunlock:
                INP_WUNLOCK(inp);
 
 drop:
-       INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
+       INP_INFO_WUNLOCK_ASSERT(&V_tcbinfo);
        if (s != NULL)
                free(s, M_TCPLOG);
        if (m != NULL)
_______________________________________________
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