@@ -160,12 +160,23 @@ static int smc_lgr_create(struct smc_sock *smc, __be32 peer_in_addr,
160160 lnk -> smcibdev = smcibdev ;
161161 lnk -> ibport = ibport ;
162162 lnk -> path_mtu = smcibdev -> pattr [ibport - 1 ].active_mtu ;
163+ if (!smcibdev -> initialized )
164+ smc_ib_setup_per_ibdev (smcibdev );
163165 get_random_bytes (rndvec , sizeof (rndvec ));
164166 lnk -> psn_initial = rndvec [0 ] + (rndvec [1 ] << 8 ) + (rndvec [2 ] << 16 );
165167 rc = smc_wr_alloc_link_mem (lnk );
166168 if (rc )
167169 goto free_lgr ;
168170 init_waitqueue_head (& lnk -> wr_tx_wait );
171+ rc = smc_ib_create_protection_domain (lnk );
172+ if (rc )
173+ goto free_link_mem ;
174+ rc = smc_ib_create_queue_pair (lnk );
175+ if (rc )
176+ goto dealloc_pd ;
177+ rc = smc_wr_create_link (lnk );
178+ if (rc )
179+ goto destroy_qp ;
169180
170181 smc -> conn .lgr = lgr ;
171182 rwlock_init (& lgr -> conns_lock );
@@ -174,6 +185,12 @@ static int smc_lgr_create(struct smc_sock *smc, __be32 peer_in_addr,
174185 spin_unlock_bh (& smc_lgr_list .lock );
175186 return 0 ;
176187
188+ destroy_qp :
189+ smc_ib_destroy_queue_pair (lnk );
190+ dealloc_pd :
191+ smc_ib_dealloc_protection_domain (lnk );
192+ free_link_mem :
193+ smc_wr_free_link_mem (lnk );
177194free_lgr :
178195 kfree (lgr );
179196out :
@@ -211,7 +228,10 @@ void smc_conn_free(struct smc_connection *conn)
211228static void smc_link_clear (struct smc_link * lnk )
212229{
213230 lnk -> peer_qpn = 0 ;
231+ smc_ib_modify_qp_reset (lnk );
214232 smc_wr_free_link (lnk );
233+ smc_ib_destroy_queue_pair (lnk );
234+ smc_ib_dealloc_protection_domain (lnk );
215235 smc_wr_free_link_mem (lnk );
216236}
217237
@@ -223,6 +243,10 @@ static void smc_lgr_free_sndbufs(struct smc_link_group *lgr)
223243 for (i = 0 ; i < SMC_RMBE_SIZES ; i ++ ) {
224244 list_for_each_entry_safe (sndbuf_desc , bf_desc , & lgr -> sndbufs [i ],
225245 list ) {
246+ list_del (& sndbuf_desc -> list );
247+ smc_ib_buf_unmap (lgr -> lnk [SMC_SINGLE_LINK ].smcibdev ,
248+ smc_uncompress_bufsize (i ),
249+ sndbuf_desc , DMA_TO_DEVICE );
226250 kfree (sndbuf_desc -> cpu_addr );
227251 kfree (sndbuf_desc );
228252 }
@@ -232,11 +256,16 @@ static void smc_lgr_free_sndbufs(struct smc_link_group *lgr)
232256static void smc_lgr_free_rmbs (struct smc_link_group * lgr )
233257{
234258 struct smc_buf_desc * rmb_desc , * bf_desc ;
259+ struct smc_link * lnk = & lgr -> lnk [SMC_SINGLE_LINK ];
235260 int i ;
236261
237262 for (i = 0 ; i < SMC_RMBE_SIZES ; i ++ ) {
238263 list_for_each_entry_safe (rmb_desc , bf_desc , & lgr -> rmbs [i ],
239264 list ) {
265+ list_del (& rmb_desc -> list );
266+ smc_ib_buf_unmap (lnk -> smcibdev ,
267+ smc_uncompress_bufsize (i ),
268+ rmb_desc , DMA_FROM_DEVICE );
240269 kfree (rmb_desc -> cpu_addr );
241270 kfree (rmb_desc );
242271 }
@@ -550,6 +579,18 @@ int smc_rmb_create(struct smc_sock *smc)
550579 kfree (rmb_desc );
551580 continue ; /* if mapping failed, try smaller one */
552581 }
582+ rc = smc_ib_get_memory_region (lgr -> lnk [SMC_SINGLE_LINK ].roce_pd ,
583+ IB_ACCESS_REMOTE_WRITE |
584+ IB_ACCESS_LOCAL_WRITE ,
585+ & rmb_desc -> mr_rx [SMC_SINGLE_LINK ]);
586+ if (rc ) {
587+ smc_ib_buf_unmap (lgr -> lnk [SMC_SINGLE_LINK ].smcibdev ,
588+ tmp_bufsize , rmb_desc ,
589+ DMA_FROM_DEVICE );
590+ kfree (rmb_desc -> cpu_addr );
591+ kfree (rmb_desc );
592+ continue ;
593+ }
553594 rmb_desc -> used = 1 ;
554595 write_lock_bh (& lgr -> rmbs_lock );
555596 list_add (& rmb_desc -> list ,
@@ -567,3 +608,38 @@ int smc_rmb_create(struct smc_sock *smc)
567608 return - ENOMEM ;
568609 }
569610}
611+
612+ static inline int smc_rmb_reserve_rtoken_idx (struct smc_link_group * lgr )
613+ {
614+ int i ;
615+
616+ for_each_clear_bit (i , lgr -> rtokens_used_mask , SMC_RMBS_PER_LGR_MAX ) {
617+ if (!test_and_set_bit (i , lgr -> rtokens_used_mask ))
618+ return i ;
619+ }
620+ return - ENOSPC ;
621+ }
622+
623+ /* save rkey and dma_addr received from peer during clc handshake */
624+ int smc_rmb_rtoken_handling (struct smc_connection * conn ,
625+ struct smc_clc_msg_accept_confirm * clc )
626+ {
627+ u64 dma_addr = be64_to_cpu (clc -> rmb_dma_addr );
628+ struct smc_link_group * lgr = conn -> lgr ;
629+ u32 rkey = ntohl (clc -> rmb_rkey );
630+ int i ;
631+
632+ for (i = 0 ; i < SMC_RMBS_PER_LGR_MAX ; i ++ ) {
633+ if ((lgr -> rtokens [i ][SMC_SINGLE_LINK ].rkey == rkey ) &&
634+ test_bit (i , lgr -> rtokens_used_mask )) {
635+ conn -> rtoken_idx = i ;
636+ return 0 ;
637+ }
638+ }
639+ conn -> rtoken_idx = smc_rmb_reserve_rtoken_idx (lgr );
640+ if (conn -> rtoken_idx < 0 )
641+ return conn -> rtoken_idx ;
642+ lgr -> rtokens [conn -> rtoken_idx ][SMC_SINGLE_LINK ].rkey = rkey ;
643+ lgr -> rtokens [conn -> rtoken_idx ][SMC_SINGLE_LINK ].dma_addr = dma_addr ;
644+ return 0 ;
645+ }
0 commit comments