@@ -292,6 +292,17 @@ static void smc_copy_sock_settings_to_smc(struct smc_sock *smc)
292
292
smc_copy_sock_settings (& smc -> sk , smc -> clcsock -> sk , SK_FLAGS_CLC_TO_SMC );
293
293
}
294
294
295
+ /* register a new rmb */
296
+ static int smc_reg_rmb (struct smc_link * link , struct smc_buf_desc * rmb_desc )
297
+ {
298
+ /* register memory region for new rmb */
299
+ if (smc_wr_reg_send (link , rmb_desc -> mr_rx [SMC_SINGLE_LINK ])) {
300
+ rmb_desc -> regerr = 1 ;
301
+ return - EFAULT ;
302
+ }
303
+ return 0 ;
304
+ }
305
+
295
306
static int smc_clnt_conf_first_link (struct smc_sock * smc )
296
307
{
297
308
struct smc_link_group * lgr = smc -> conn .lgr ;
@@ -321,9 +332,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc)
321
332
322
333
smc_wr_remember_qp_attr (link );
323
334
324
- rc = smc_wr_reg_send (link ,
325
- smc -> conn .rmb_desc -> mr_rx [SMC_SINGLE_LINK ]);
326
- if (rc )
335
+ if (smc_reg_rmb (link , smc -> conn .rmb_desc ))
327
336
return SMC_CLC_DECL_INTERR ;
328
337
329
338
/* send CONFIRM LINK response over RoCE fabric */
@@ -473,13 +482,8 @@ static int smc_connect_rdma(struct smc_sock *smc)
473
482
goto decline_rdma_unlock ;
474
483
}
475
484
} else {
476
- struct smc_buf_desc * buf_desc = smc -> conn .rmb_desc ;
477
-
478
- if (!buf_desc -> reused ) {
479
- /* register memory region for new rmb */
480
- rc = smc_wr_reg_send (link ,
481
- buf_desc -> mr_rx [SMC_SINGLE_LINK ]);
482
- if (rc ) {
485
+ if (!smc -> conn .rmb_desc -> reused ) {
486
+ if (smc_reg_rmb (link , smc -> conn .rmb_desc )) {
483
487
reason_code = SMC_CLC_DECL_INTERR ;
484
488
goto decline_rdma_unlock ;
485
489
}
@@ -719,9 +723,7 @@ static int smc_serv_conf_first_link(struct smc_sock *smc)
719
723
720
724
link = & lgr -> lnk [SMC_SINGLE_LINK ];
721
725
722
- rc = smc_wr_reg_send (link ,
723
- smc -> conn .rmb_desc -> mr_rx [SMC_SINGLE_LINK ]);
724
- if (rc )
726
+ if (smc_reg_rmb (link , smc -> conn .rmb_desc ))
725
727
return SMC_CLC_DECL_INTERR ;
726
728
727
729
/* send CONFIRM LINK request to client over the RoCE fabric */
@@ -854,13 +856,8 @@ static void smc_listen_work(struct work_struct *work)
854
856
smc_rx_init (new_smc );
855
857
856
858
if (local_contact != SMC_FIRST_CONTACT ) {
857
- struct smc_buf_desc * buf_desc = new_smc -> conn .rmb_desc ;
858
-
859
- if (!buf_desc -> reused ) {
860
- /* register memory region for new rmb */
861
- rc = smc_wr_reg_send (link ,
862
- buf_desc -> mr_rx [SMC_SINGLE_LINK ]);
863
- if (rc ) {
859
+ if (!new_smc -> conn .rmb_desc -> reused ) {
860
+ if (smc_reg_rmb (link , new_smc -> conn .rmb_desc )) {
864
861
reason_code = SMC_CLC_DECL_INTERR ;
865
862
goto decline_rdma_unlock ;
866
863
}
@@ -1318,16 +1315,18 @@ static ssize_t smc_sendpage(struct socket *sock, struct page *page,
1318
1315
1319
1316
smc = smc_sk (sk );
1320
1317
lock_sock (sk );
1321
- if (sk -> sk_state != SMC_ACTIVE )
1318
+ if (sk -> sk_state != SMC_ACTIVE ) {
1319
+ release_sock (sk );
1322
1320
goto out ;
1321
+ }
1322
+ release_sock (sk );
1323
1323
if (smc -> use_fallback )
1324
1324
rc = kernel_sendpage (smc -> clcsock , page , offset ,
1325
1325
size , flags );
1326
1326
else
1327
1327
rc = sock_no_sendpage (sock , page , offset , size , flags );
1328
1328
1329
1329
out :
1330
- release_sock (sk );
1331
1330
return rc ;
1332
1331
}
1333
1332
0 commit comments