File tree Expand file tree Collapse file tree 3 files changed +24
-5
lines changed Expand file tree Collapse file tree 3 files changed +24
-5
lines changed Original file line number Diff line number Diff line change @@ -296,8 +296,10 @@ static void smc_copy_sock_settings_to_smc(struct smc_sock *smc)
296296static int smc_reg_rmb (struct smc_link * link , struct smc_buf_desc * rmb_desc )
297297{
298298 /* register memory region for new rmb */
299- if (smc_wr_reg_send (link , rmb_desc -> mr_rx [SMC_SINGLE_LINK ]))
299+ if (smc_wr_reg_send (link , rmb_desc -> mr_rx [SMC_SINGLE_LINK ])) {
300+ rmb_desc -> regerr = 1 ;
300301 return - EFAULT ;
302+ }
301303 return 0 ;
302304}
303305
Original file line number Diff line number Diff line change 3232
3333static u32 smc_lgr_num ; /* unique link group number */
3434
35+ static void smc_buf_free (struct smc_buf_desc * buf_desc , struct smc_link * lnk ,
36+ bool is_rmb );
37+
3538static void smc_lgr_schedule_free_work (struct smc_link_group * lgr )
3639{
3740 /* client link group creation always follows the server link group
@@ -234,9 +237,22 @@ static void smc_buf_unuse(struct smc_connection *conn)
234237 conn -> sndbuf_size = 0 ;
235238 }
236239 if (conn -> rmb_desc ) {
237- conn -> rmb_desc -> reused = true;
238- conn -> rmb_desc -> used = 0 ;
239- conn -> rmbe_size = 0 ;
240+ if (!conn -> rmb_desc -> regerr ) {
241+ conn -> rmb_desc -> reused = 1 ;
242+ conn -> rmb_desc -> used = 0 ;
243+ conn -> rmbe_size = 0 ;
244+ } else {
245+ /* buf registration failed, reuse not possible */
246+ struct smc_link_group * lgr = conn -> lgr ;
247+ struct smc_link * lnk ;
248+
249+ write_lock_bh (& lgr -> rmbs_lock );
250+ list_del (& conn -> rmb_desc -> list );
251+ write_unlock_bh (& lgr -> rmbs_lock );
252+
253+ lnk = & lgr -> lnk [SMC_SINGLE_LINK ];
254+ smc_buf_free (conn -> rmb_desc , lnk , true);
255+ }
240256 }
241257}
242258
Original file line number Diff line number Diff line change @@ -123,7 +123,8 @@ struct smc_buf_desc {
123123 */
124124 u32 order ; /* allocation order */
125125 u32 used ; /* currently used / unused */
126- bool reused ; /* new created / reused */
126+ u8 reused : 1 ; /* new created / reused */
127+ u8 regerr : 1 ; /* err during registration */
127128};
128129
129130struct smc_rtoken { /* address/key of remote RMB */
You can’t perform that action at this time.
0 commit comments