@@ -613,6 +613,7 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg)
613
613
/* Else will do memory reg/dereg for each chunk */
614
614
ia -> ri_memreg_strategy = memreg ;
615
615
616
+ rwlock_init (& ia -> ri_qplock );
616
617
return 0 ;
617
618
out2 :
618
619
rdma_destroy_id (ia -> ri_id );
@@ -859,7 +860,7 @@ rpcrdma_ep_destroy(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
859
860
int
860
861
rpcrdma_ep_connect (struct rpcrdma_ep * ep , struct rpcrdma_ia * ia )
861
862
{
862
- struct rdma_cm_id * id ;
863
+ struct rdma_cm_id * id , * old ;
863
864
int rc = 0 ;
864
865
int retry_count = 0 ;
865
866
@@ -905,9 +906,14 @@ rpcrdma_ep_connect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
905
906
rc = - ENETUNREACH ;
906
907
goto out ;
907
908
}
908
- rdma_destroy_qp (ia -> ri_id );
909
- rdma_destroy_id (ia -> ri_id );
909
+
910
+ write_lock (& ia -> ri_qplock );
911
+ old = ia -> ri_id ;
910
912
ia -> ri_id = id ;
913
+ write_unlock (& ia -> ri_qplock );
914
+
915
+ rdma_destroy_qp (old );
916
+ rdma_destroy_id (old );
911
917
} else {
912
918
dprintk ("RPC: %s: connecting...\n" , __func__ );
913
919
rc = rdma_create_qp (ia -> ri_id , ia -> ri_pd , & ep -> rep_attr );
@@ -1590,17 +1596,18 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
1590
1596
struct ib_send_wr invalidate_wr , * bad_wr ;
1591
1597
int rc ;
1592
1598
1593
- while (seg1 -> mr_nsegs -- )
1594
- rpcrdma_unmap_one (ia , seg ++ );
1595
-
1596
1599
memset (& invalidate_wr , 0 , sizeof invalidate_wr );
1597
1600
invalidate_wr .wr_id = (unsigned long )(void * )seg1 -> mr_chunk .rl_mw ;
1598
1601
invalidate_wr .opcode = IB_WR_LOCAL_INV ;
1599
1602
invalidate_wr .send_flags = IB_SEND_SIGNALED ;
1600
1603
invalidate_wr .ex .invalidate_rkey = seg1 -> mr_chunk .rl_mw -> r .frmr .fr_mr -> rkey ;
1601
1604
DECR_CQCOUNT (& r_xprt -> rx_ep );
1602
1605
1606
+ read_lock (& ia -> ri_qplock );
1607
+ while (seg1 -> mr_nsegs -- )
1608
+ rpcrdma_unmap_one (ia , seg ++ );
1603
1609
rc = ib_post_send (ia -> ri_id -> qp , & invalidate_wr , & bad_wr );
1610
+ read_unlock (& ia -> ri_qplock );
1604
1611
if (rc )
1605
1612
dprintk ("RPC: %s: failed ib_post_send for invalidate,"
1606
1613
" status %i\n" , __func__ , rc );
@@ -1661,8 +1668,10 @@ rpcrdma_deregister_fmr_external(struct rpcrdma_mr_seg *seg,
1661
1668
1662
1669
list_add (& seg1 -> mr_chunk .rl_mw -> r .fmr -> list , & l );
1663
1670
rc = ib_unmap_fmr (& l );
1671
+ read_lock (& ia -> ri_qplock );
1664
1672
while (seg1 -> mr_nsegs -- )
1665
1673
rpcrdma_unmap_one (ia , seg ++ );
1674
+ read_unlock (& ia -> ri_qplock );
1666
1675
if (rc )
1667
1676
dprintk ("RPC: %s: failed ib_unmap_fmr,"
1668
1677
" status %i\n" , __func__ , rc );
@@ -1718,7 +1727,9 @@ rpcrdma_deregister_external(struct rpcrdma_mr_seg *seg,
1718
1727
1719
1728
#if RPCRDMA_PERSISTENT_REGISTRATION
1720
1729
case RPCRDMA_ALLPHYSICAL :
1730
+ read_lock (& ia -> ri_qplock );
1721
1731
rpcrdma_unmap_one (ia , seg );
1732
+ read_unlock (& ia -> ri_qplock );
1722
1733
break ;
1723
1734
#endif
1724
1735
0 commit comments