mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
RDMA/iw_cxgb4: Handle return value of c4iw_ofld_send() in abort_arp_failure()
In abort_arp_failure(), the return value from c4iw_ofld_send() is ignored and thus if the CPL isn't sent, the endpoint is stuck and never gets aborted. Failure of c4iw_ofld_send() is treated as fatal error, and the ep resources are released in a safer context through process_work(). Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
8a70f812b1
commit
761e19a504
1 changed files with 9 additions and 3 deletions
|
@ -540,12 +540,18 @@ static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
|
||||||
*/
|
*/
|
||||||
static void abort_arp_failure(void *handle, struct sk_buff *skb)
|
static void abort_arp_failure(void *handle, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct c4iw_rdev *rdev = handle;
|
int ret;
|
||||||
|
struct c4iw_ep *ep = handle;
|
||||||
|
struct c4iw_rdev *rdev = &ep->com.dev->rdev;
|
||||||
struct cpl_abort_req *req = cplhdr(skb);
|
struct cpl_abort_req *req = cplhdr(skb);
|
||||||
|
|
||||||
PDBG("%s rdev %p\n", __func__, rdev);
|
PDBG("%s rdev %p\n", __func__, rdev);
|
||||||
req->cmd = CPL_ABORT_NO_RST;
|
req->cmd = CPL_ABORT_NO_RST;
|
||||||
c4iw_ofld_send(rdev, skb);
|
ret = c4iw_ofld_send(rdev, skb);
|
||||||
|
if (ret) {
|
||||||
|
__state_set(&ep->com, DEAD);
|
||||||
|
queue_arp_failure_cpl(ep, skb, FAKE_CPL_PUT_EP_SAFE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
|
static int send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
|
||||||
|
@ -642,7 +648,7 @@ static int send_abort(struct c4iw_ep *ep, struct sk_buff *skb, gfp_t gfp)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);
|
set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);
|
||||||
t4_set_arp_err_handler(skb, &ep->com.dev->rdev, abort_arp_failure);
|
t4_set_arp_err_handler(skb, ep, abort_arp_failure);
|
||||||
req = (struct cpl_abort_req *) skb_put(skb, wrlen);
|
req = (struct cpl_abort_req *) skb_put(skb, wrlen);
|
||||||
memset(req, 0, wrlen);
|
memset(req, 0, wrlen);
|
||||||
INIT_TP_WR(req, ep->hwtid);
|
INIT_TP_WR(req, ep->hwtid);
|
||||||
|
|
Loading…
Reference in a new issue