@@ -231,7 +231,6 @@ static int rxe_qp_init_req(struct rxe_dev *rxe, struct rxe_qp *qp,
231231 qp -> req .wqe_index = queue_get_producer (qp -> sq .queue ,
232232 QUEUE_TYPE_FROM_CLIENT );
233233
234- qp -> req .state = QP_STATE_RESET ;
235234 qp -> req .opcode = -1 ;
236235 qp -> comp .opcode = -1 ;
237236
@@ -394,12 +393,9 @@ int rxe_qp_chk_attr(struct rxe_dev *rxe, struct rxe_qp *qp,
394393 goto err1 ;
395394 }
396395
397- if (mask & IB_QP_STATE ) {
398- if (cur_state == IB_QPS_SQD ) {
399- if (qp -> req .state == QP_STATE_DRAIN &&
400- new_state != IB_QPS_ERR )
401- goto err1 ;
402- }
396+ if (mask & IB_QP_STATE && cur_state == IB_QPS_SQD ) {
397+ if (qp -> attr .sq_draining && new_state != IB_QPS_ERR )
398+ goto err1 ;
403399 }
404400
405401 if (mask & IB_QP_PORT ) {
@@ -474,9 +470,6 @@ static void rxe_qp_reset(struct rxe_qp *qp)
474470 rxe_disable_task (& qp -> comp .task );
475471 rxe_disable_task (& qp -> req .task );
476472
477- /* move qp to the reset state */
478- qp -> req .state = QP_STATE_RESET ;
479-
480473 /* drain work and packet queuesc */
481474 rxe_requester (qp );
482475 rxe_completer (qp );
@@ -512,22 +505,9 @@ static void rxe_qp_reset(struct rxe_qp *qp)
512505 rxe_enable_task (& qp -> req .task );
513506}
514507
515- /* drain the send queue */
516- static void rxe_qp_drain (struct rxe_qp * qp )
517- {
518- if (qp -> sq .queue ) {
519- if (qp -> req .state != QP_STATE_DRAINED ) {
520- qp -> req .state = QP_STATE_DRAIN ;
521- rxe_sched_task (& qp -> comp .task );
522- rxe_sched_task (& qp -> req .task );
523- }
524- }
525- }
526-
527508/* move the qp to the error state */
528509void rxe_qp_error (struct rxe_qp * qp )
529510{
530- qp -> req .state = QP_STATE_ERROR ;
531511 qp -> attr .qp_state = IB_QPS_ERR ;
532512
533513 /* drain work and packet queues */
@@ -540,6 +520,8 @@ void rxe_qp_error(struct rxe_qp *qp)
540520int rxe_qp_from_attr (struct rxe_qp * qp , struct ib_qp_attr * attr , int mask ,
541521 struct ib_udata * udata )
542522{
523+ enum ib_qp_state cur_state = (mask & IB_QP_CUR_STATE ) ?
524+ attr -> cur_qp_state : qp -> attr .qp_state ;
543525 int err ;
544526
545527 if (mask & IB_QP_MAX_QP_RD_ATOMIC ) {
@@ -656,7 +638,6 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
656638
657639 case IB_QPS_INIT :
658640 rxe_dbg_qp (qp , "state -> INIT\n" );
659- qp -> req .state = QP_STATE_INIT ;
660641 break ;
661642
662643 case IB_QPS_RTR :
@@ -665,12 +646,15 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
665646
666647 case IB_QPS_RTS :
667648 rxe_dbg_qp (qp , "state -> RTS\n" );
668- qp -> req .state = QP_STATE_READY ;
669649 break ;
670650
671651 case IB_QPS_SQD :
672652 rxe_dbg_qp (qp , "state -> SQD\n" );
673- rxe_qp_drain (qp );
653+ if (cur_state != IB_QPS_SQD ) {
654+ qp -> attr .sq_draining = 1 ;
655+ rxe_sched_task (& qp -> comp .task );
656+ rxe_sched_task (& qp -> req .task );
657+ }
674658 break ;
675659
676660 case IB_QPS_SQE :
@@ -708,16 +692,11 @@ int rxe_qp_to_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask)
708692 rxe_av_to_attr (& qp -> pri_av , & attr -> ah_attr );
709693 rxe_av_to_attr (& qp -> alt_av , & attr -> alt_ah_attr );
710694
711- if (qp -> req .state == QP_STATE_DRAIN ) {
712- attr -> sq_draining = 1 ;
713- /* applications that get this state
714- * typically spin on it. yield the
715- * processor
716- */
695+ /* Applications that get this state typically spin on it.
696+ * Yield the processor
697+ */
698+ if (qp -> attr .sq_draining )
717699 cond_resched ();
718- } else {
719- attr -> sq_draining = 0 ;
720- }
721700
722701 rxe_dbg_qp (qp , "attr->sq_draining = %d\n" , attr -> sq_draining );
723702
0 commit comments