Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Jan 2008 21:30:28 GMT
From:      Steve Wise <swise@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 134486 for review
Message-ID:  <200801302130.m0ULUSHi012425@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=134486

Change 134486 by swise@swise:vic10:iwarp on 2008/01/30 21:29:58

	Fixed locking issues on new connection handling.

Affected files ...

.. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#13 edit

Differences ...

==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#13 (text+ko) ====

@@ -996,7 +996,7 @@
 		break;
 	case DEAD:
 		PDBG("%s so_error %d IN DEAD STATE!!!!\n", __FUNCTION__, 
-			so->so_error);
+			ep->com.so->so_error);
 		return;
 	default:
 		BUG_ON(1);
@@ -1341,20 +1341,26 @@
 	ep->backlog = backlog;
 	ep->com.local_addr = cm_id->local_addr;
 	ep->com.thread = curthread;
+	state_set(&ep->com, LISTEN);
 
 	err = create_sock(&ep->com);
 	if (err)
 		goto fail1;
 
-	err = sobind(ep->com.so, (struct sockaddr *)&ep->com.local_addr, ep->com.thread);
-	if (err)
-		goto fail1;
+	err = sobind(ep->com.so, (struct sockaddr *)&ep->com.local_addr, 
+		ep->com.thread);
+	if (err) {
+		printf("sobind failed with errno %d\n", err);
+		goto fail2;
+	}
 
-	state_set(&ep->com, LISTEN);
 	err = solisten(ep->com.so, ep->backlog, ep->com.thread);
 	if (!err)
 		goto out;
+fail2:
+	close_socket(&ep->com);
 fail1:
+	cm_id->rem_ref(cm_id);
 	put_ep(&ep->com);
 out:
 	return err;
@@ -1431,7 +1437,7 @@
 static void
 process_data(struct iwch_ep *ep)
 {
-	PDBG("%s ep %p dlen %u\n", __FUNCTION__, ep, dlen);
+	PDBG("%s ep %p\n", __FUNCTION__, ep);
 
 	switch (state_read(&ep->com)) {
 	case MPA_REQ_SENT:
@@ -1476,16 +1482,12 @@
 	}
 	TAILQ_REMOVE(&head->so_comp, so, so_list);
 	head->so_qlen--;
+	SOCK_LOCK(so);
 	so->so_qstate &= ~SQ_COMP;
 	so->so_head = NULL;
-	SOCK_LOCK(so);
 	soref(so);
-	SOCKBUF_LOCK(&so->so_rcv);
 	so->so_rcv.sb_flags |= SB_UPCALL;
-	SOCKBUF_UNLOCK(&so->so_rcv);
-	SOCKBUF_LOCK(&so->so_snd);
 	so->so_snd.sb_flags |= SB_UPCALL;
-	SOCKBUF_UNLOCK(&so->so_snd);
 	so->so_state |= SS_NBIO;
 	BUG_ON(!(so->so_state & SS_ISCONNECTED));
 	BUG_ON(so->so_error);



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