@@ -358,14 +358,14 @@ static inline int get_mtu(struct rxe_qp *qp)
358358}
359359
360360static struct sk_buff * init_req_packet (struct rxe_qp * qp ,
361+ struct rxe_av * av ,
361362 struct rxe_send_wqe * wqe ,
362363 int opcode , u32 payload ,
363364 struct rxe_pkt_info * pkt )
364365{
365366 struct rxe_dev * rxe = to_rdev (qp -> ibqp .device );
366367 struct sk_buff * skb ;
367368 struct rxe_send_wr * ibwr = & wqe -> wr ;
368- struct rxe_av * av ;
369369 int pad = (- payload ) & 0x3 ;
370370 int paylen ;
371371 int solicited ;
@@ -374,21 +374,9 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
374374
375375 /* length from start of bth to end of icrc */
376376 paylen = rxe_opcode [opcode ].length + payload + pad + RXE_ICRC_SIZE ;
377-
378- /* pkt->hdr, port_num and mask are initialized in ifc layer */
379- pkt -> rxe = rxe ;
380- pkt -> opcode = opcode ;
381- pkt -> qp = qp ;
382- pkt -> psn = qp -> req .psn ;
383- pkt -> mask = rxe_opcode [opcode ].mask ;
384- pkt -> paylen = paylen ;
385- pkt -> wqe = wqe ;
377+ pkt -> paylen = paylen ;
386378
387379 /* init skb */
388- av = rxe_get_av (pkt );
389- if (!av )
390- return NULL ;
391-
392380 skb = rxe_init_packet (rxe , av , paylen , pkt );
393381 if (unlikely (!skb ))
394382 return NULL ;
@@ -447,13 +435,13 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
447435 return skb ;
448436}
449437
450- static int finish_packet (struct rxe_qp * qp , struct rxe_send_wqe * wqe ,
451- struct rxe_pkt_info * pkt , struct sk_buff * skb ,
452- u32 paylen )
438+ static int finish_packet (struct rxe_qp * qp , struct rxe_av * av ,
439+ struct rxe_send_wqe * wqe , struct rxe_pkt_info * pkt ,
440+ struct sk_buff * skb , u32 paylen )
453441{
454442 int err ;
455443
456- err = rxe_prepare (pkt , skb );
444+ err = rxe_prepare (av , pkt , skb );
457445 if (err )
458446 return err ;
459447
@@ -608,6 +596,7 @@ static int rxe_do_local_ops(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
608596int rxe_requester (void * arg )
609597{
610598 struct rxe_qp * qp = (struct rxe_qp * )arg ;
599+ struct rxe_dev * rxe = to_rdev (qp -> ibqp .device );
611600 struct rxe_pkt_info pkt ;
612601 struct sk_buff * skb ;
613602 struct rxe_send_wqe * wqe ;
@@ -619,6 +608,8 @@ int rxe_requester(void *arg)
619608 struct rxe_send_wqe rollback_wqe ;
620609 u32 rollback_psn ;
621610 struct rxe_queue * q = qp -> sq .queue ;
611+ struct rxe_ah * ah ;
612+ struct rxe_av * av ;
622613
623614 rxe_add_ref (qp );
624615
@@ -705,24 +696,41 @@ int rxe_requester(void *arg)
705696 payload = mtu ;
706697 }
707698
708- skb = init_req_packet (qp , wqe , opcode , payload , & pkt );
699+ pkt .rxe = rxe ;
700+ pkt .opcode = opcode ;
701+ pkt .qp = qp ;
702+ pkt .psn = qp -> req .psn ;
703+ pkt .mask = rxe_opcode [opcode ].mask ;
704+ pkt .wqe = wqe ;
705+
706+ av = rxe_get_av (& pkt , & ah );
707+ if (unlikely (!av )) {
708+ pr_err ("qp#%d Failed no address vector\n" , qp_num (qp ));
709+ wqe -> status = IB_WC_LOC_QP_OP_ERR ;
710+ goto err_drop_ah ;
711+ }
712+
713+ skb = init_req_packet (qp , av , wqe , opcode , payload , & pkt );
709714 if (unlikely (!skb )) {
710715 pr_err ("qp#%d Failed allocating skb\n" , qp_num (qp ));
711716 wqe -> status = IB_WC_LOC_QP_OP_ERR ;
712- goto err ;
717+ goto err_drop_ah ;
713718 }
714719
715- ret = finish_packet (qp , wqe , & pkt , skb , payload );
720+ ret = finish_packet (qp , av , wqe , & pkt , skb , payload );
716721 if (unlikely (ret )) {
717722 pr_debug ("qp#%d Error during finish packet\n" , qp_num (qp ));
718723 if (ret == - EFAULT )
719724 wqe -> status = IB_WC_LOC_PROT_ERR ;
720725 else
721726 wqe -> status = IB_WC_LOC_QP_OP_ERR ;
722727 kfree_skb (skb );
723- goto err ;
728+ goto err_drop_ah ;
724729 }
725730
731+ if (ah )
732+ rxe_drop_ref (ah );
733+
726734 /*
727735 * To prevent a race on wqe access between requester and completer,
728736 * wqe members state and psn need to be set before calling
@@ -751,6 +759,9 @@ int rxe_requester(void *arg)
751759
752760 goto next_wqe ;
753761
762+ err_drop_ah :
763+ if (ah )
764+ rxe_drop_ref (ah );
754765err :
755766 wqe -> state = wqe_state_error ;
756767 __rxe_do_task (& qp -> comp .task );
0 commit comments