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

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
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
.. 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
+1 −0
Original line number Diff line number Diff line
@@ -17,5 +17,6 @@ struct netns_smc {
#ifdef CONFIG_SYSCTL
	struct ctl_table_header		*smc_hdr;
#endif
	unsigned int			sysctl_autocorking_size;
};
#endif
+10 −0
Original line number Diff line number Diff line
@@ -14,9 +14,17 @@
#include <linux/sysctl.h>
#include <net/net_namespace.h>

#include "smc.h"
#include "smc_sysctl.h"

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)
		goto err_reg;

	net->smc.sysctl_autocorking_size = SMC_AUTOCORKING_DEFAULT_SIZE;

	return 0;

err_reg:
+1 −1
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ static bool smc_should_autocork(struct smc_sock *smc)
	struct smc_connection *conn = &smc->conn;
	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);

	if (atomic_read(&conn->cdc_pend_tx_wr) == 0 ||