Skip to content

Commit 08239d4

Browse files
committed
Merge branch 'smc-fixes'
Ursula Braun says: ==================== net/smc: fixes 2018-07-18 here are small fixes for SMC: The first patch speeds up unidirectional traffic, the second patch increases security, and the third patch fixes a problem for fallback cases. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 3bc53be + f6bdc42 commit 08239d4

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

net/smc/af_smc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1456,7 +1456,8 @@ static int smc_setsockopt(struct socket *sock, int level, int optname,
14561456

14571457
if (optlen < sizeof(int))
14581458
return -EINVAL;
1459-
get_user(val, (int __user *)optval);
1459+
if (get_user(val, (int __user *)optval))
1460+
return -EFAULT;
14601461

14611462
lock_sock(sk);
14621463
switch (optname) {

net/smc/smc_clc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ int smc_clc_prfx_match(struct socket *clcsock,
250250
int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
251251
u8 expected_type)
252252
{
253+
long rcvtimeo = smc->clcsock->sk->sk_rcvtimeo;
253254
struct sock *clc_sk = smc->clcsock->sk;
254255
struct smc_clc_msg_hdr *clcm = buf;
255256
struct msghdr msg = {NULL, 0};
@@ -306,7 +307,6 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
306307
memset(&msg, 0, sizeof(struct msghdr));
307308
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, datlen);
308309
krflags = MSG_WAITALL;
309-
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
310310
len = sock_recvmsg(smc->clcsock, &msg, krflags);
311311
if (len < datlen || !smc_clc_msg_hdr_valid(clcm)) {
312312
smc->sk.sk_err = EPROTO;
@@ -322,6 +322,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
322322
}
323323

324324
out:
325+
smc->clcsock->sk->sk_rcvtimeo = rcvtimeo;
325326
return reason_code;
326327
}
327328

net/smc/smc_tx.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,8 @@ void smc_tx_work(struct work_struct *work)
495495

496496
void smc_tx_consumer_update(struct smc_connection *conn, bool force)
497497
{
498-
union smc_host_cursor cfed, cons;
498+
union smc_host_cursor cfed, cons, prod;
499+
int sender_free = conn->rmb_desc->len;
499500
int to_confirm;
500501

501502
smc_curs_write(&cons,
@@ -505,11 +506,18 @@ void smc_tx_consumer_update(struct smc_connection *conn, bool force)
505506
smc_curs_read(&conn->rx_curs_confirmed, conn),
506507
conn);
507508
to_confirm = smc_curs_diff(conn->rmb_desc->len, &cfed, &cons);
509+
if (to_confirm > conn->rmbe_update_limit) {
510+
smc_curs_write(&prod,
511+
smc_curs_read(&conn->local_rx_ctrl.prod, conn),
512+
conn);
513+
sender_free = conn->rmb_desc->len -
514+
smc_curs_diff(conn->rmb_desc->len, &prod, &cfed);
515+
}
508516

509517
if (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req ||
510518
force ||
511519
((to_confirm > conn->rmbe_update_limit) &&
512-
((to_confirm > (conn->rmb_desc->len / 2)) ||
520+
((sender_free <= (conn->rmb_desc->len / 2)) ||
513521
conn->local_rx_ctrl.prod_flags.write_blocked))) {
514522
if ((smc_cdc_get_slot_and_msg_send(conn) < 0) &&
515523
conn->alert_token_local) { /* connection healthy */

0 commit comments

Comments
 (0)