Commit 462791bb authored by Dust Li's avatar Dust Li Committed by David S. Miller
Browse files

net/smc: add sysctl interface for SMC

This patch add sysctl interface to support container environment
for SMC as we talk in the mail list.

Link: https://lore.kernel.org/netdev/20220224020253.GF5443@linux.alibaba.com


Co-developed-by: default avatarTony Lu <tonylu@linux.alibaba.com>
Signed-off-by: default avatarTony Lu <tonylu@linux.alibaba.com>
Signed-off-by: default avatarDust Li <dust.li@linux.alibaba.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e385c08
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -14,5 +14,8 @@ struct netns_smc {
	struct smc_stats_rsn		*fback_rsn;

	bool				limit_smc_hs;	/* constraint on handshake */
#ifdef CONFIG_SYSCTL
	struct ctl_table_header		*smc_hdr;
#endif
};
#endif
+1 −1
Original line number Diff line number Diff line
@@ -4,4 +4,4 @@ obj-$(CONFIG_SMC) += smc.o
obj-$(CONFIG_SMC_DIAG)	+= smc_diag.o
smc-y := af_smc.o smc_pnet.o smc_ib.o smc_clc.o smc_core.o smc_wr.o smc_llc.o
smc-y += smc_cdc.o smc_tx.o smc_rx.o smc_close.o smc_ism.o smc_netlink.o smc_stats.o
smc-y += smc_tracepoint.o
smc-y += smc_tracepoint.o smc_sysctl.o
+10 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@
#include "smc_close.h"
#include "smc_stats.h"
#include "smc_tracepoint.h"
#include "smc_sysctl.h"

static DEFINE_MUTEX(smc_server_lgr_pending);	/* serialize link group
						 * creation on server
@@ -3273,9 +3274,17 @@ static int __init smc_init(void)
		goto out_sock;
	}

	rc = smc_sysctl_init();
	if (rc) {
		pr_err("%s: sysctl_init fails with %d\n", __func__, rc);
		goto out_ulp;
	}

	static_branch_enable(&tcp_have_smc);
	return 0;

out_ulp:
	tcp_unregister_ulp(&smc_ulp_ops);
out_sock:
	sock_unregister(PF_SMC);
out_proto6:
@@ -3303,6 +3312,7 @@ static int __init smc_init(void)
static void __exit smc_exit(void)
{
	static_branch_disable(&tcp_have_smc);
	smc_sysctl_exit();
	tcp_unregister_ulp(&smc_ulp_ops);
	sock_unregister(PF_SMC);
	smc_core_exit();

net/smc/smc_sysctl.c

0 → 100644
+70 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 *  Shared Memory Communications over RDMA (SMC-R) and RoCE
 *
 *  smc_sysctl.c: sysctl interface to SMC subsystem.
 *
 *  Copyright (c) 2022, Alibaba Inc.
 *
 *  Author: Tony Lu <tonylu@linux.alibaba.com>
 *
 */

#include <linux/init.h>
#include <linux/sysctl.h>
#include <net/net_namespace.h>

#include "smc_sysctl.h"

static struct ctl_table smc_table[] = {
	{  }
};

static __net_init int smc_sysctl_init_net(struct net *net)
{
	struct ctl_table *table;

	table = smc_table;
	if (!net_eq(net, &init_net)) {
		int i;

		table = kmemdup(table, sizeof(smc_table), GFP_KERNEL);
		if (!table)
			goto err_alloc;

		for (i = 0; i < ARRAY_SIZE(smc_table) - 1; i++)
			table[i].data += (void *)net - (void *)&init_net;
	}

	net->smc.smc_hdr = register_net_sysctl(net, "net/smc", table);
	if (!net->smc.smc_hdr)
		goto err_reg;

	return 0;

err_reg:
	if (!net_eq(net, &init_net))
		kfree(table);
err_alloc:
	return -ENOMEM;
}

static __net_exit void smc_sysctl_exit_net(struct net *net)
{
	unregister_net_sysctl_table(net->smc.smc_hdr);
}

static struct pernet_operations smc_sysctl_ops __net_initdata = {
	.init = smc_sysctl_init_net,
	.exit = smc_sysctl_exit_net,
};

int __init smc_sysctl_init(void)
{
	return register_pernet_subsys(&smc_sysctl_ops);
}

void smc_sysctl_exit(void)
{
	unregister_pernet_subsys(&smc_sysctl_ops);
}

net/smc/smc_sysctl.h

0 → 100644
+32 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/*
 *  Shared Memory Communications over RDMA (SMC-R) and RoCE
 *
 *  smc_sysctl.c: sysctl interface to SMC subsystem.
 *
 *  Copyright (c) 2022, Alibaba Inc.
 *
 *  Author: Tony Lu <tonylu@linux.alibaba.com>
 *
 */

#ifndef _SMC_SYSCTL_H
#define _SMC_SYSCTL_H

#ifdef CONFIG_SYSCTL

int smc_sysctl_init(void);
void smc_sysctl_exit(void);

#else

int smc_sysctl_init(void)
{
	return 0;
}

void smc_sysctl_exit(void) { }

#endif /* CONFIG_SYSCTL */

#endif /* _SMC_SYSCTL_H */