@@ -454,6 +454,7 @@ static inline void smc_wr_rx_process_cqes(struct ib_wc wc[], int num)
454454
455455 for (i = 0 ; i < num ; i ++ ) {
456456 link = wc [i ].qp -> qp_context ;
457+ link -> wr_rx_id_compl = wc [i ].wr_id ;
457458 if (wc [i ].status == IB_WC_SUCCESS ) {
458459 link -> wr_rx_tstamp = jiffies ;
459460 smc_wr_rx_demultiplex (& wc [i ]);
@@ -465,6 +466,8 @@ static inline void smc_wr_rx_process_cqes(struct ib_wc wc[], int num)
465466 case IB_WC_RNR_RETRY_EXC_ERR :
466467 case IB_WC_WR_FLUSH_ERR :
467468 smcr_link_down_cond_sched (link );
469+ if (link -> wr_rx_id_compl == link -> wr_rx_id )
470+ wake_up (& link -> wr_rx_empty_wait );
468471 break ;
469472 default :
470473 smc_wr_rx_post (link ); /* refill WR RX */
@@ -639,6 +642,7 @@ void smc_wr_free_link(struct smc_link *lnk)
639642 return ;
640643 ibdev = lnk -> smcibdev -> ibdev ;
641644
645+ smc_wr_drain_cq (lnk );
642646 smc_wr_wakeup_reg_wait (lnk );
643647 smc_wr_wakeup_tx_wait (lnk );
644648
@@ -889,6 +893,7 @@ int smc_wr_create_link(struct smc_link *lnk)
889893 atomic_set (& lnk -> wr_tx_refcnt , 0 );
890894 init_waitqueue_head (& lnk -> wr_reg_wait );
891895 atomic_set (& lnk -> wr_reg_refcnt , 0 );
896+ init_waitqueue_head (& lnk -> wr_rx_empty_wait );
892897 return rc ;
893898
894899dma_unmap :
0 commit comments