mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-19 16:49:50 +07:00
iw_cxgb4: allocate wait object for each ep object
Remove the embedded c4iw_wr_wait object in preparation for correctly handling timeouts. Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
7088a9ba62
commit
ef885dc66c
@ -318,11 +318,18 @@ static void *alloc_ep(int size, gfp_t gfp)
|
|||||||
|
|
||||||
epc = kzalloc(size, gfp);
|
epc = kzalloc(size, gfp);
|
||||||
if (epc) {
|
if (epc) {
|
||||||
|
epc->wr_waitp = kzalloc(sizeof(*epc->wr_waitp), gfp);
|
||||||
|
if (!epc->wr_waitp) {
|
||||||
|
kfree(epc);
|
||||||
|
epc = NULL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
kref_init(&epc->kref);
|
kref_init(&epc->kref);
|
||||||
mutex_init(&epc->mutex);
|
mutex_init(&epc->mutex);
|
||||||
c4iw_init_wr_wait(&epc->wr_wait);
|
c4iw_init_wr_wait(epc->wr_waitp);
|
||||||
}
|
}
|
||||||
pr_debug("alloc ep %p\n", epc);
|
pr_debug("alloc ep %p\n", epc);
|
||||||
|
out:
|
||||||
return epc;
|
return epc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,6 +414,7 @@ void _c4iw_free_ep(struct kref *kref)
|
|||||||
}
|
}
|
||||||
if (!skb_queue_empty(&ep->com.ep_skb_list))
|
if (!skb_queue_empty(&ep->com.ep_skb_list))
|
||||||
skb_queue_purge(&ep->com.ep_skb_list);
|
skb_queue_purge(&ep->com.ep_skb_list);
|
||||||
|
kfree(ep->com.wr_waitp);
|
||||||
kfree(ep);
|
kfree(ep);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1872,7 +1880,7 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||||||
mutex_lock(&ep->com.mutex);
|
mutex_lock(&ep->com.mutex);
|
||||||
switch (ep->com.state) {
|
switch (ep->com.state) {
|
||||||
case ABORTING:
|
case ABORTING:
|
||||||
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
|
c4iw_wake_up(ep->com.wr_waitp, -ECONNRESET);
|
||||||
__state_set(&ep->com, DEAD);
|
__state_set(&ep->com, DEAD);
|
||||||
release = 1;
|
release = 1;
|
||||||
break;
|
break;
|
||||||
@ -2100,7 +2108,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
|
|||||||
|
|
||||||
pr_debug("qp %p cm_id %p\n", ep->com.qp, ep->com.cm_id);
|
pr_debug("qp %p cm_id %p\n", ep->com.qp, ep->com.cm_id);
|
||||||
init_timer(&ep->timer);
|
init_timer(&ep->timer);
|
||||||
c4iw_init_wr_wait(&ep->com.wr_wait);
|
c4iw_init_wr_wait(ep->com.wr_waitp);
|
||||||
|
|
||||||
/* When MPA revision is different on nodes, the node with MPA_rev=2
|
/* When MPA revision is different on nodes, the node with MPA_rev=2
|
||||||
* tries to reconnect with MPA_rev 1 for the same EP through
|
* tries to reconnect with MPA_rev 1 for the same EP through
|
||||||
@ -2319,7 +2327,7 @@ static int pass_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||||||
}
|
}
|
||||||
pr_debug("ep %p status %d error %d\n", ep,
|
pr_debug("ep %p status %d error %d\n", ep,
|
||||||
rpl->status, status2errno(rpl->status));
|
rpl->status, status2errno(rpl->status));
|
||||||
c4iw_wake_up(&ep->com.wr_wait, status2errno(rpl->status));
|
c4iw_wake_up(ep->com.wr_waitp, status2errno(rpl->status));
|
||||||
c4iw_put_ep(&ep->com);
|
c4iw_put_ep(&ep->com);
|
||||||
out:
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
@ -2336,7 +2344,7 @@ static int close_listsrv_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
pr_debug("ep %p\n", ep);
|
pr_debug("ep %p\n", ep);
|
||||||
c4iw_wake_up(&ep->com.wr_wait, status2errno(rpl->status));
|
c4iw_wake_up(ep->com.wr_waitp, status2errno(rpl->status));
|
||||||
c4iw_put_ep(&ep->com);
|
c4iw_put_ep(&ep->com);
|
||||||
out:
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
@ -2671,12 +2679,12 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||||||
*/
|
*/
|
||||||
__state_set(&ep->com, CLOSING);
|
__state_set(&ep->com, CLOSING);
|
||||||
pr_debug("waking up ep %p tid %u\n", ep, ep->hwtid);
|
pr_debug("waking up ep %p tid %u\n", ep, ep->hwtid);
|
||||||
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
|
c4iw_wake_up(ep->com.wr_waitp, -ECONNRESET);
|
||||||
break;
|
break;
|
||||||
case MPA_REP_SENT:
|
case MPA_REP_SENT:
|
||||||
__state_set(&ep->com, CLOSING);
|
__state_set(&ep->com, CLOSING);
|
||||||
pr_debug("waking up ep %p tid %u\n", ep, ep->hwtid);
|
pr_debug("waking up ep %p tid %u\n", ep, ep->hwtid);
|
||||||
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
|
c4iw_wake_up(ep->com.wr_waitp, -ECONNRESET);
|
||||||
break;
|
break;
|
||||||
case FPDU_MODE:
|
case FPDU_MODE:
|
||||||
start_ep_timer(ep);
|
start_ep_timer(ep);
|
||||||
@ -2758,7 +2766,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||||||
* MPA_REQ_SENT
|
* MPA_REQ_SENT
|
||||||
*/
|
*/
|
||||||
if (ep->com.state != MPA_REQ_SENT)
|
if (ep->com.state != MPA_REQ_SENT)
|
||||||
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
|
c4iw_wake_up(ep->com.wr_waitp, -ECONNRESET);
|
||||||
|
|
||||||
mutex_lock(&ep->com.mutex);
|
mutex_lock(&ep->com.mutex);
|
||||||
switch (ep->com.state) {
|
switch (ep->com.state) {
|
||||||
@ -3346,14 +3354,14 @@ static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
c4iw_init_wr_wait(&ep->com.wr_wait);
|
c4iw_init_wr_wait(ep->com.wr_waitp);
|
||||||
err = cxgb4_create_server6(ep->com.dev->rdev.lldi.ports[0],
|
err = cxgb4_create_server6(ep->com.dev->rdev.lldi.ports[0],
|
||||||
ep->stid, &sin6->sin6_addr,
|
ep->stid, &sin6->sin6_addr,
|
||||||
sin6->sin6_port,
|
sin6->sin6_port,
|
||||||
ep->com.dev->rdev.lldi.rxq_ids[0]);
|
ep->com.dev->rdev.lldi.rxq_ids[0]);
|
||||||
if (!err)
|
if (!err)
|
||||||
err = c4iw_wait_for_reply(&ep->com.dev->rdev,
|
err = c4iw_wait_for_reply(&ep->com.dev->rdev,
|
||||||
&ep->com.wr_wait,
|
ep->com.wr_waitp,
|
||||||
0, 0, __func__);
|
0, 0, __func__);
|
||||||
else if (err > 0)
|
else if (err > 0)
|
||||||
err = net_xmit_errno(err);
|
err = net_xmit_errno(err);
|
||||||
@ -3389,13 +3397,13 @@ static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
|
|||||||
}
|
}
|
||||||
} while (err == -EBUSY);
|
} while (err == -EBUSY);
|
||||||
} else {
|
} else {
|
||||||
c4iw_init_wr_wait(&ep->com.wr_wait);
|
c4iw_init_wr_wait(ep->com.wr_waitp);
|
||||||
err = cxgb4_create_server(ep->com.dev->rdev.lldi.ports[0],
|
err = cxgb4_create_server(ep->com.dev->rdev.lldi.ports[0],
|
||||||
ep->stid, sin->sin_addr.s_addr, sin->sin_port,
|
ep->stid, sin->sin_addr.s_addr, sin->sin_port,
|
||||||
0, ep->com.dev->rdev.lldi.rxq_ids[0]);
|
0, ep->com.dev->rdev.lldi.rxq_ids[0]);
|
||||||
if (!err)
|
if (!err)
|
||||||
err = c4iw_wait_for_reply(&ep->com.dev->rdev,
|
err = c4iw_wait_for_reply(&ep->com.dev->rdev,
|
||||||
&ep->com.wr_wait,
|
ep->com.wr_waitp,
|
||||||
0, 0, __func__);
|
0, 0, __func__);
|
||||||
else if (err > 0)
|
else if (err > 0)
|
||||||
err = net_xmit_errno(err);
|
err = net_xmit_errno(err);
|
||||||
@ -3487,13 +3495,13 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
|
|||||||
ep->com.dev->rdev.lldi.rxq_ids[0], 0);
|
ep->com.dev->rdev.lldi.rxq_ids[0], 0);
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
c4iw_init_wr_wait(&ep->com.wr_wait);
|
c4iw_init_wr_wait(ep->com.wr_waitp);
|
||||||
err = cxgb4_remove_server(
|
err = cxgb4_remove_server(
|
||||||
ep->com.dev->rdev.lldi.ports[0], ep->stid,
|
ep->com.dev->rdev.lldi.ports[0], ep->stid,
|
||||||
ep->com.dev->rdev.lldi.rxq_ids[0], 0);
|
ep->com.dev->rdev.lldi.rxq_ids[0], 0);
|
||||||
if (err)
|
if (err)
|
||||||
goto done;
|
goto done;
|
||||||
err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait,
|
err = c4iw_wait_for_reply(&ep->com.dev->rdev, ep->com.wr_waitp,
|
||||||
0, 0, __func__);
|
0, 0, __func__);
|
||||||
sin6 = (struct sockaddr_in6 *)&ep->com.local_addr;
|
sin6 = (struct sockaddr_in6 *)&ep->com.local_addr;
|
||||||
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
||||||
@ -4216,7 +4224,7 @@ static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||||||
}
|
}
|
||||||
pr_debug("ep %p tid %u state %u\n", ep, ep->hwtid, ep->com.state);
|
pr_debug("ep %p tid %u state %u\n", ep, ep->hwtid, ep->com.state);
|
||||||
|
|
||||||
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
|
c4iw_wake_up(ep->com.wr_waitp, -ECONNRESET);
|
||||||
out:
|
out:
|
||||||
sched(dev, skb);
|
sched(dev, skb);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -842,7 +842,7 @@ struct c4iw_ep_common {
|
|||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
struct sockaddr_storage local_addr;
|
struct sockaddr_storage local_addr;
|
||||||
struct sockaddr_storage remote_addr;
|
struct sockaddr_storage remote_addr;
|
||||||
struct c4iw_wr_wait wr_wait;
|
struct c4iw_wr_wait *wr_waitp;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned long history;
|
unsigned long history;
|
||||||
};
|
};
|
||||||
|
@ -1355,14 +1355,14 @@ static int rdma_fini(struct c4iw_dev *rhp, struct c4iw_qp *qhp,
|
|||||||
wqe->flowid_len16 = cpu_to_be32(
|
wqe->flowid_len16 = cpu_to_be32(
|
||||||
FW_WR_FLOWID_V(ep->hwtid) |
|
FW_WR_FLOWID_V(ep->hwtid) |
|
||||||
FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*wqe), 16)));
|
FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*wqe), 16)));
|
||||||
wqe->cookie = (uintptr_t)&ep->com.wr_wait;
|
wqe->cookie = (uintptr_t)ep->com.wr_waitp;
|
||||||
|
|
||||||
wqe->u.fini.type = FW_RI_TYPE_FINI;
|
wqe->u.fini.type = FW_RI_TYPE_FINI;
|
||||||
ret = c4iw_ofld_send(&rhp->rdev, skb);
|
ret = c4iw_ofld_send(&rhp->rdev, skb);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = c4iw_wait_for_reply(&rhp->rdev, &ep->com.wr_wait, qhp->ep->hwtid,
|
ret = c4iw_wait_for_reply(&rhp->rdev, ep->com.wr_waitp, qhp->ep->hwtid,
|
||||||
qhp->wq.sq.qid, __func__);
|
qhp->wq.sq.qid, __func__);
|
||||||
out:
|
out:
|
||||||
pr_debug("ret %d\n", ret);
|
pr_debug("ret %d\n", ret);
|
||||||
@ -1425,7 +1425,7 @@ static int rdma_init(struct c4iw_dev *rhp, struct c4iw_qp *qhp)
|
|||||||
FW_WR_FLOWID_V(qhp->ep->hwtid) |
|
FW_WR_FLOWID_V(qhp->ep->hwtid) |
|
||||||
FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*wqe), 16)));
|
FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*wqe), 16)));
|
||||||
|
|
||||||
wqe->cookie = (uintptr_t)&qhp->ep->com.wr_wait;
|
wqe->cookie = (uintptr_t)qhp->ep->com.wr_waitp;
|
||||||
|
|
||||||
wqe->u.init.type = FW_RI_TYPE_INIT;
|
wqe->u.init.type = FW_RI_TYPE_INIT;
|
||||||
wqe->u.init.mpareqbit_p2ptype =
|
wqe->u.init.mpareqbit_p2ptype =
|
||||||
@ -1466,7 +1466,7 @@ static int rdma_init(struct c4iw_dev *rhp, struct c4iw_qp *qhp)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err1;
|
goto err1;
|
||||||
|
|
||||||
ret = c4iw_wait_for_reply(&rhp->rdev, &qhp->ep->com.wr_wait,
|
ret = c4iw_wait_for_reply(&rhp->rdev, qhp->ep->com.wr_waitp,
|
||||||
qhp->ep->hwtid, qhp->wq.sq.qid, __func__);
|
qhp->ep->hwtid, qhp->wq.sq.qid, __func__);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
Loading…
Reference in New Issue
Block a user