PERFORCE change 134486 for review
Steve Wise
swise at FreeBSD.org
Wed Jan 30 13:30:29 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=134486
Change 134486 by swise at 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);
More information about the p4-projects
mailing list