@@ -292,6 +292,17 @@ static void smc_copy_sock_settings_to_smc(struct smc_sock *smc)
292292 smc_copy_sock_settings (& smc -> sk , smc -> clcsock -> sk , SK_FLAGS_CLC_TO_SMC );
293293}
294294
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+
295306static int smc_clnt_conf_first_link (struct smc_sock * smc )
296307{
297308 struct smc_link_group * lgr = smc -> conn .lgr ;
@@ -321,9 +332,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc)
321332
322333 smc_wr_remember_qp_attr (link );
323334
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 ))
327336 return SMC_CLC_DECL_INTERR ;
328337
329338 /* send CONFIRM LINK response over RoCE fabric */
@@ -473,13 +482,8 @@ static int smc_connect_rdma(struct smc_sock *smc)
473482 goto decline_rdma_unlock ;
474483 }
475484 } 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 )) {
483487 reason_code = SMC_CLC_DECL_INTERR ;
484488 goto decline_rdma_unlock ;
485489 }
@@ -719,9 +723,7 @@ static int smc_serv_conf_first_link(struct smc_sock *smc)
719723
720724 link = & lgr -> lnk [SMC_SINGLE_LINK ];
721725
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 ))
725727 return SMC_CLC_DECL_INTERR ;
726728
727729 /* send CONFIRM LINK request to client over the RoCE fabric */
@@ -854,13 +856,8 @@ static void smc_listen_work(struct work_struct *work)
854856 smc_rx_init (new_smc );
855857
856858 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 )) {
864861 reason_code = SMC_CLC_DECL_INTERR ;
865862 goto decline_rdma_unlock ;
866863 }
@@ -1318,16 +1315,18 @@ static ssize_t smc_sendpage(struct socket *sock, struct page *page,
13181315
13191316 smc = smc_sk (sk );
13201317 lock_sock (sk );
1321- if (sk -> sk_state != SMC_ACTIVE )
1318+ if (sk -> sk_state != SMC_ACTIVE ) {
1319+ release_sock (sk );
13221320 goto out ;
1321+ }
1322+ release_sock (sk );
13231323 if (smc -> use_fallback )
13241324 rc = kernel_sendpage (smc -> clcsock , page , offset ,
13251325 size , flags );
13261326 else
13271327 rc = sock_no_sendpage (sock , page , offset , size , flags );
13281328
13291329out :
1330- release_sock (sk );
13311330 return rc ;
13321331}
13331332
0 commit comments