Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Jun 2010 21:20:28 +0000 (UTC)
From:      Randall Stewart <rrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r208853 - head/sys/netinet
Message-ID:  <201006052120.o55LKSLA041089@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rrs
Date: Sat Jun  5 21:20:28 2010
New Revision: 208853
URL: http://svn.freebsd.org/changeset/base/208853

Log:
  This does two changes:
  1) Makes it so that the INVARIANT function validate nolocks is
     available anywhere.
  2) Fixes a BUG where a close has been done on a collision socket
     and the cookie processing would return leaving a lock held.
  MFC after:	1 week

Modified:
  head/sys/netinet/sctp_input.c
  head/sys/netinet/sctp_pcb.h

Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c	Sat Jun  5 21:17:23 2010	(r208852)
+++ head/sys/netinet/sctp_input.c	Sat Jun  5 21:20:28 2010	(r208853)
@@ -3067,7 +3067,7 @@ process_chunk_drop(struct sctp_tcb *stcb
     struct sctp_nets *net, uint8_t flg)
 {
 	switch (desc->chunk_type) {
-		case SCTP_DATA:
+	case SCTP_DATA:
 		/* find the tsn to resend (possibly */
 		{
 			uint32_t tsn;
@@ -4861,6 +4861,9 @@ process_control_chunks:
 			} else {
 				if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
 					/* We are not interested anymore */
+					if (stcb) {
+						SCTP_TCB_UNLOCK(stcb);
+					}
 					*offset = length;
 					return (NULL);
 				}
@@ -5408,13 +5411,16 @@ sctp_process_ecn_marked_b(struct sctp_tc
 }
 
 #ifdef INVARIANTS
-static void
-sctp_validate_no_locks(struct sctp_inpcb *inp)
+#ifdef __GNUC__
+__attribute__((noinline))
+#endif
+	void
+	     sctp_validate_no_locks(struct sctp_inpcb *inp)
 {
-	struct sctp_tcb *stcb;
+	struct sctp_tcb *lstcb;
 
-	LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
-		if (mtx_owned(&stcb->tcb_mtx)) {
+	LIST_FOREACH(lstcb, &inp->sctp_asoc_list, sctp_tcblist) {
+		if (mtx_owned(&lstcb->tcb_mtx)) {
 			panic("Own lock on stcb at return from input");
 		}
 	}

Modified: head/sys/netinet/sctp_pcb.h
==============================================================================
--- head/sys/netinet/sctp_pcb.h	Sat Jun  5 21:17:23 2010	(r208852)
+++ head/sys/netinet/sctp_pcb.h	Sat Jun  5 21:20:28 2010	(r208853)
@@ -621,5 +621,11 @@ sctp_initiate_iterator(inp_func inpf,
     struct sctp_inpcb *,
     uint8_t co_off);
 
+#ifdef INVARIANTS
+void
+     sctp_validate_no_locks(struct sctp_inpcb *inp);
+
+#endif
+
 #endif				/* _KERNEL */
 #endif				/* !__sctp_pcb_h__ */



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