RDMA/rxe: Lookup kernel AH from ah index in UD WQEs
Add code to rxe_get_av in rxe_av.c to use the AH index in UD send WQEs to lookup the kernel AH. For old user providers continue to use the AV passed in WQEs. Move setting pkt->rxe to before the call to rxe_get_av() to get access to the AH pool. Link: https://lore.kernel.org/r/20211007204051.10086-6-rpearsonhpe@gmail.com Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
4da698eabf
commit
e2fe06c908
2 changed files with 24 additions and 4 deletions
|
@ -101,11 +101,29 @@ void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_ah_attr *attr)
|
||||||
|
|
||||||
struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt)
|
struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt)
|
||||||
{
|
{
|
||||||
|
struct rxe_ah *ah;
|
||||||
|
u32 ah_num;
|
||||||
|
|
||||||
if (!pkt || !pkt->qp)
|
if (!pkt || !pkt->qp)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (qp_type(pkt->qp) == IB_QPT_RC || qp_type(pkt->qp) == IB_QPT_UC)
|
if (qp_type(pkt->qp) == IB_QPT_RC || qp_type(pkt->qp) == IB_QPT_UC)
|
||||||
return &pkt->qp->pri_av;
|
return &pkt->qp->pri_av;
|
||||||
|
|
||||||
return (pkt->wqe) ? &pkt->wqe->wr.wr.ud.av : NULL;
|
if (!pkt->wqe)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ah_num = pkt->wqe->wr.wr.ud.ah_num;
|
||||||
|
if (ah_num) {
|
||||||
|
/* only new user provider or kernel client */
|
||||||
|
ah = rxe_pool_get_index(&pkt->rxe->ah_pool, ah_num);
|
||||||
|
if (!ah || ah->ah_num != ah_num || rxe_ah_pd(ah) != pkt->qp->pd) {
|
||||||
|
pr_warn("Unable to find AH matching ah_num\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return &ah->av;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* only old user provider for UD sends*/
|
||||||
|
return &pkt->wqe->wr.wr.ud.av;
|
||||||
}
|
}
|
||||||
|
|
|
@ -379,9 +379,8 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
|
||||||
/* length from start of bth to end of icrc */
|
/* length from start of bth to end of icrc */
|
||||||
paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE;
|
paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE;
|
||||||
|
|
||||||
/* pkt->hdr, rxe, port_num and mask are initialized in ifc
|
/* pkt->hdr, port_num and mask are initialized in ifc layer */
|
||||||
* layer
|
pkt->rxe = rxe;
|
||||||
*/
|
|
||||||
pkt->opcode = opcode;
|
pkt->opcode = opcode;
|
||||||
pkt->qp = qp;
|
pkt->qp = qp;
|
||||||
pkt->psn = qp->req.psn;
|
pkt->psn = qp->req.psn;
|
||||||
|
@ -391,6 +390,9 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
|
||||||
|
|
||||||
/* init skb */
|
/* init skb */
|
||||||
av = rxe_get_av(pkt);
|
av = rxe_get_av(pkt);
|
||||||
|
if (!av)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
skb = rxe_init_packet(rxe, av, paylen, pkt);
|
skb = rxe_init_packet(rxe, av, paylen, pkt);
|
||||||
if (unlikely(!skb))
|
if (unlikely(!skb))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Add table
Reference in a new issue