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:
Родитель
4da698eabf
Коммит
e2fe06c908
|
@ -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_ah *ah;
|
||||
u32 ah_num;
|
||||
|
||||
if (!pkt || !pkt->qp)
|
||||
return NULL;
|
||||
|
||||
if (qp_type(pkt->qp) == IB_QPT_RC || qp_type(pkt->qp) == IB_QPT_UC)
|
||||
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 */
|
||||
paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE;
|
||||
|
||||
/* pkt->hdr, rxe, port_num and mask are initialized in ifc
|
||||
* layer
|
||||
*/
|
||||
/* pkt->hdr, port_num and mask are initialized in ifc layer */
|
||||
pkt->rxe = rxe;
|
||||
pkt->opcode = opcode;
|
||||
pkt->qp = qp;
|
||||
pkt->psn = qp->req.psn;
|
||||
|
@ -391,6 +390,9 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
|
|||
|
||||
/* init skb */
|
||||
av = rxe_get_av(pkt);
|
||||
if (!av)
|
||||
return NULL;
|
||||
|
||||
skb = rxe_init_packet(rxe, av, paylen, pkt);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
|
Загрузка…
Ссылка в новой задаче