Commit 12bbb0d1 authored by Dust Li's avatar Dust Li Committed by David S. Miller

net/smc: add sysctl for autocorking

This add a new sysctl: net.smc.autocorking_size

We can dynamically change the behaviour of autocorking
by change the value of autocorking_size.
Setting to 0 disables autocorking in SMC
Signed-off-by: default avatarDust Li <dust.li@linux.alibaba.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dcd2cf5f
.. SPDX-License-Identifier: GPL-2.0
=========
SMC Sysctl
=========
/proc/sys/net/smc/* Variables
==============================
autocorking_size - INTEGER
Setting SMC auto corking size:
SMC auto corking is like TCP auto corking from the application's
perspective of view. When applications do consecutive small
write()/sendmsg() system calls, we try to coalesce these small writes
as much as possible, to lower total amount of CDC and RDMA Write been
sent.
autocorking_size limits the maximum corked bytes that can be sent to
the under device in 1 single sending. If set to 0, the SMC auto corking
is disabled.
Applications can still use TCP_CORK for optimal behavior when they
know how/when to uncork their sockets.
Default: 64K
...@@ -17,5 +17,6 @@ struct netns_smc { ...@@ -17,5 +17,6 @@ struct netns_smc {
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
struct ctl_table_header *smc_hdr; struct ctl_table_header *smc_hdr;
#endif #endif
unsigned int sysctl_autocorking_size;
}; };
#endif #endif
...@@ -14,9 +14,17 @@ ...@@ -14,9 +14,17 @@
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <net/net_namespace.h> #include <net/net_namespace.h>
#include "smc.h"
#include "smc_sysctl.h" #include "smc_sysctl.h"
static struct ctl_table smc_table[] = { static struct ctl_table smc_table[] = {
{
.procname = "autocorking_size",
.data = &init_net.smc.sysctl_autocorking_size,
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_douintvec,
},
{ } { }
}; };
...@@ -40,6 +48,8 @@ static __net_init int smc_sysctl_init_net(struct net *net) ...@@ -40,6 +48,8 @@ static __net_init int smc_sysctl_init_net(struct net *net)
if (!net->smc.smc_hdr) if (!net->smc.smc_hdr)
goto err_reg; goto err_reg;
net->smc.sysctl_autocorking_size = SMC_AUTOCORKING_DEFAULT_SIZE;
return 0; return 0;
err_reg: err_reg:
......
...@@ -147,7 +147,7 @@ static bool smc_should_autocork(struct smc_sock *smc) ...@@ -147,7 +147,7 @@ static bool smc_should_autocork(struct smc_sock *smc)
struct smc_connection *conn = &smc->conn; struct smc_connection *conn = &smc->conn;
int corking_size; int corking_size;
corking_size = min(SMC_AUTOCORKING_DEFAULT_SIZE, corking_size = min(sock_net(&smc->sk)->smc.sysctl_autocorking_size,
conn->sndbuf_desc->len >> 1); conn->sndbuf_desc->len >> 1);
if (atomic_read(&conn->cdc_pend_tx_wr) == 0 || if (atomic_read(&conn->cdc_pend_tx_wr) == 0 ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment