Skip to content

Commit 31140b4

Browse files
committed
Merge branch 'smc-fixes'
Ursula Braun says: ==================== net/smc: fixes 2018/05/03 here are smc fixes for 2 problems: * receive buffers in SMC must be registered. If registration fails these buffers must not be kept within the link group for reuse. Patch 1 is a preparational patch; patch 2 contains the fix. * sendpage: do not hold the sock lock when calling kernel_sendpage() or sock_no_sendpage() ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents df80b8f + bda27ff commit 31140b4

File tree

3 files changed

+42
-26
lines changed

3 files changed

+42
-26
lines changed

net/smc/af_smc.c

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
295306
static 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

13291329
out:
1330-
release_sock(sk);
13311330
return rc;
13321331
}
13331332

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)