diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/cm.c')
| -rw-r--r-- | drivers/infiniband/hw/cxgb4/cm.c | 36 | 
1 files changed, 30 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 92b4c2b0308..55ab284e22f 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c @@ -1362,7 +1362,10 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb)  	ep = lookup_tid(t, tid);  	PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); -	BUG_ON(!ep); +	if (!ep) { +		printk(KERN_WARNING MOD "Abort rpl to freed endpoint\n"); +		return 0; +	}  	mutex_lock(&ep->com.mutex);  	switch (ep->com.state) {  	case ABORTING: @@ -1410,6 +1413,24 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)  		return 0;  	} +	/* +	 * Log interesting failures. +	 */ +	switch (status) { +	case CPL_ERR_CONN_RESET: +	case CPL_ERR_CONN_TIMEDOUT: +		break; +	default: +		printk(KERN_INFO MOD "Active open failure - " +		       "atid %u status %u errno %d %pI4:%u->%pI4:%u\n", +		       atid, status, status2errno(status), +		       &ep->com.local_addr.sin_addr.s_addr, +		       ntohs(ep->com.local_addr.sin_port), +		       &ep->com.remote_addr.sin_addr.s_addr, +		       ntohs(ep->com.remote_addr.sin_port)); +		break; +	} +  	connect_reply_upcall(ep, status2errno(status));  	state_set(&ep->com, DEAD); @@ -1593,7 +1614,7 @@ static int import_ep(struct c4iw_ep *ep, __be32 peer_ip, struct dst_entry *dst,  					n, n->dev, 0);  		if (!ep->l2t)  			goto out; -		ep->mtu = dst_mtu(ep->dst); +		ep->mtu = dst_mtu(dst);  		ep->tx_chan = cxgb4_port_chan(n->dev);  		ep->smac_idx = (cxgb4_port_viid(n->dev) & 0x7F) << 1;  		step = cdev->rdev.lldi.ntxq / @@ -2656,6 +2677,12 @@ static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)  	unsigned int tid = GET_TID(req);  	ep = lookup_tid(t, tid); +	if (!ep) { +		printk(KERN_WARNING MOD +		       "Abort on non-existent endpoint, tid %d\n", tid); +		kfree_skb(skb); +		return 0; +	}  	if (is_neg_adv_abort(req->status)) {  		PDBG("%s neg_adv_abort ep %p tid %u\n", __func__, ep,  		     ep->hwtid); @@ -2667,11 +2694,8 @@ static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)  	/*  	 * Wake up any threads in rdma_init() or rdma_fini(). -	 * However, this is not needed if com state is just -	 * MPA_REQ_SENT  	 */ -	if (ep->com.state != MPA_REQ_SENT) -		c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET); +	c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);  	sched(dev, skb);  	return 0;  }  |