@@ -454,6 +454,7 @@ static inline void smc_wr_rx_process_cqes(struct ib_wc wc[], int num)
454
454
455
455
for (i = 0 ; i < num ; i ++ ) {
456
456
link = wc [i ].qp -> qp_context ;
457
+ link -> wr_rx_id_compl = wc [i ].wr_id ;
457
458
if (wc [i ].status == IB_WC_SUCCESS ) {
458
459
link -> wr_rx_tstamp = jiffies ;
459
460
smc_wr_rx_demultiplex (& wc [i ]);
@@ -465,6 +466,8 @@ static inline void smc_wr_rx_process_cqes(struct ib_wc wc[], int num)
465
466
case IB_WC_RNR_RETRY_EXC_ERR :
466
467
case IB_WC_WR_FLUSH_ERR :
467
468
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 );
468
471
break ;
469
472
default :
470
473
smc_wr_rx_post (link ); /* refill WR RX */
@@ -639,6 +642,7 @@ void smc_wr_free_link(struct smc_link *lnk)
639
642
return ;
640
643
ibdev = lnk -> smcibdev -> ibdev ;
641
644
645
+ smc_wr_drain_cq (lnk );
642
646
smc_wr_wakeup_reg_wait (lnk );
643
647
smc_wr_wakeup_tx_wait (lnk );
644
648
@@ -889,6 +893,7 @@ int smc_wr_create_link(struct smc_link *lnk)
889
893
atomic_set (& lnk -> wr_tx_refcnt , 0 );
890
894
init_waitqueue_head (& lnk -> wr_reg_wait );
891
895
atomic_set (& lnk -> wr_reg_refcnt , 0 );
896
+ init_waitqueue_head (& lnk -> wr_rx_empty_wait );
892
897
return rc ;
893
898
894
899
dma_unmap :
0 commit comments