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: Dust Li <dust.li@linux.alibaba.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
dcd2cf5f2f
commit
12bbb0d163
|
@ -0,0 +1,23 @@
|
||||||
|
.. 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 {
|
||||||
#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 @@
|
||||||
#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)
|
||||||
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)
|
||||||
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 ||
|
||||||
|
|
Loading…
Reference in New Issue