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)
296
296
static int smc_reg_rmb (struct smc_link * link , struct smc_buf_desc * rmb_desc )
297
297
{
298
298
/* 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 ;
300
301
return - EFAULT ;
302
+ }
301
303
return 0 ;
302
304
}
303
305
Original file line number Diff line number Diff line change 32
32
33
33
static u32 smc_lgr_num ; /* unique link group number */
34
34
35
+ static void smc_buf_free (struct smc_buf_desc * buf_desc , struct smc_link * lnk ,
36
+ bool is_rmb );
37
+
35
38
static void smc_lgr_schedule_free_work (struct smc_link_group * lgr )
36
39
{
37
40
/* client link group creation always follows the server link group
@@ -234,9 +237,22 @@ static void smc_buf_unuse(struct smc_connection *conn)
234
237
conn -> sndbuf_size = 0 ;
235
238
}
236
239
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
+ }
240
256
}
241
257
}
242
258
Original file line number Diff line number Diff line change @@ -123,7 +123,8 @@ struct smc_buf_desc {
123
123
*/
124
124
u32 order ; /* allocation order */
125
125
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 */
127
128
};
128
129
129
130
struct smc_rtoken { /* address/key of remote RMB */
You can’t perform that action at this time.
0 commit comments