Skip to content

Commit a6920d1

Browse files
karstengrdavem330
authored andcommitted
net/smc: handle unregistered buffers
When smc_wr_reg_send() fails then tag (regerr) the affected buffer and free it in smc_buf_unuse(). Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent e63a5f8 commit a6920d1

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

net/smc/af_smc.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,10 @@ static void smc_copy_sock_settings_to_smc(struct smc_sock *smc)
296296
static 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

net/smc/smc_core.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232

3333
static 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+
3538
static 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

net/smc/smc_core.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff 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

129130
struct smc_rtoken { /* address/key of remote RMB */

0 commit comments

Comments
 (0)