Commit fef4422d authored by Hariprasad S's avatar Hariprasad S Committed by Doug Ledford

RDMA/iw_cxgb4: free resources when send_flowc() fails

Signed-off-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarHariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent f8e1e1d1
...@@ -519,7 +519,7 @@ static void abort_arp_failure(void *handle, struct sk_buff *skb) ...@@ -519,7 +519,7 @@ static void abort_arp_failure(void *handle, struct sk_buff *skb)
c4iw_ofld_send(rdev, skb); c4iw_ofld_send(rdev, skb);
} }
static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb) static int send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
{ {
unsigned int flowclen = 80; unsigned int flowclen = 80;
struct fw_flowc_wr *flowc; struct fw_flowc_wr *flowc;
...@@ -575,7 +575,7 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -575,7 +575,7 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
} }
set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx); set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);
c4iw_ofld_send(&ep->com.dev->rdev, skb); return c4iw_ofld_send(&ep->com.dev->rdev, skb);
} }
static int send_halfclose(struct c4iw_ep *ep, gfp_t gfp) static int send_halfclose(struct c4iw_ep *ep, gfp_t gfp)
...@@ -1119,6 +1119,7 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb) ...@@ -1119,6 +1119,7 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)
unsigned int tid = GET_TID(req); unsigned int tid = GET_TID(req);
unsigned int atid = TID_TID_G(ntohl(req->tos_atid)); unsigned int atid = TID_TID_G(ntohl(req->tos_atid));
struct tid_info *t = dev->rdev.lldi.tids; struct tid_info *t = dev->rdev.lldi.tids;
int ret;
ep = lookup_atid(t, atid); ep = lookup_atid(t, atid);
...@@ -1144,13 +1145,20 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb) ...@@ -1144,13 +1145,20 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)
set_bit(ACT_ESTAB, &ep->com.history); set_bit(ACT_ESTAB, &ep->com.history);
/* start MPA negotiation */ /* start MPA negotiation */
send_flowc(ep, NULL); ret = send_flowc(ep, NULL);
if (ret)
goto err;
if (ep->retry_with_mpa_v1) if (ep->retry_with_mpa_v1)
send_mpa_req(ep, skb, 1); send_mpa_req(ep, skb, 1);
else else
send_mpa_req(ep, skb, mpa_rev); send_mpa_req(ep, skb, mpa_rev);
mutex_unlock(&ep->com.mutex); mutex_unlock(&ep->com.mutex);
return 0; return 0;
err:
mutex_unlock(&ep->com.mutex);
connect_reply_upcall(ep, -ENOMEM);
c4iw_ep_disconnect(ep, 0, GFP_KERNEL);
return 0;
} }
static void close_complete_upcall(struct c4iw_ep *ep, int status) static void close_complete_upcall(struct c4iw_ep *ep, int status)
...@@ -2548,6 +2556,7 @@ static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb) ...@@ -2548,6 +2556,7 @@ static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb)
struct cpl_pass_establish *req = cplhdr(skb); struct cpl_pass_establish *req = cplhdr(skb);
struct tid_info *t = dev->rdev.lldi.tids; struct tid_info *t = dev->rdev.lldi.tids;
unsigned int tid = GET_TID(req); unsigned int tid = GET_TID(req);
int ret;
ep = lookup_tid(t, tid); ep = lookup_tid(t, tid);
PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid);
...@@ -2560,10 +2569,14 @@ static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb) ...@@ -2560,10 +2569,14 @@ static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb)
set_emss(ep, ntohs(req->tcp_opt)); set_emss(ep, ntohs(req->tcp_opt));
dst_confirm(ep->dst); dst_confirm(ep->dst);
state_set(&ep->com, MPA_REQ_WAIT); mutex_lock(&ep->com.mutex);
ep->com.state = MPA_REQ_WAIT;
start_ep_timer(ep); start_ep_timer(ep);
send_flowc(ep, skb);
set_bit(PASS_ESTAB, &ep->com.history); set_bit(PASS_ESTAB, &ep->com.history);
ret = send_flowc(ep, skb);
mutex_unlock(&ep->com.mutex);
if (ret)
c4iw_ep_disconnect(ep, 1, GFP_KERNEL);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment