Commit e2fe06c9 authored by Bob Pearson's avatar Bob Pearson Committed by Jason Gunthorpe
Browse files

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: default avatarBob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 4da698ea
Loading
Loading
Loading
Loading
+19 −1
Original line number Original line Diff line number Diff line
@@ -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;
}
}
+5 −3
Original line number Original line Diff line number Diff line
@@ -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;