Commit 22eea3de authored by Litao Jiao's avatar Litao Jiao
Browse files

net/smc: add sysctl interface for SMC

mainline inclusion
from mainline-v5.18-rc1
commit 462791bb
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I76JHC
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/net/smc?id=462791bbfa350189e309a5a94541f6b63cd874e8

--------------------------------

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>
Signed-off-by: default avatarLitao Jiao <jiaolitao@sangfor.com.cn>
parent 59bdc5d7
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include <net/netns/mpls.h>
#include <net/netns/can.h>
#include <net/netns/xdp.h>
#include <net/netns/smc.h>
#include <net/netns/bpf.h>
#include <linux/ns_common.h>
#include <linux/idr.h>
@@ -190,7 +191,9 @@ struct net {
	struct sock		*crypto_nlsk;
#endif
	struct sock		*diag_nlsk;

#if IS_ENABLED(CONFIG_SMC)
	struct netns_smc	smc;
#endif
	KABI_RESERVE(1)
	KABI_RESERVE(2)
	KABI_RESERVE(3)
+10 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __NETNS_SMC_H__
#define __NETNS_SMC_H__

struct netns_smc {
#ifdef CONFIG_SYSCTL
	struct ctl_table_header		*smc_hdr;
#endif
};
#endif
+1 −0
Original line number Diff line number Diff line
@@ -3,3 +3,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-y += smc_sysctl.o
+8 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include "smc_tx.h"
#include "smc_rx.h"
#include "smc_close.h"
#include "smc_sysctl.h"

static DEFINE_MUTEX(smc_server_lgr_pending);	/* serialize link group
						 * creation on server
@@ -2655,6 +2656,12 @@ 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_sock;
	}

	static_branch_enable(&tcp_have_smc);
	return 0;

@@ -2683,6 +2690,7 @@ static int __init smc_init(void)
static void __exit smc_exit(void)
{
	static_branch_disable(&tcp_have_smc);
	smc_sysctl_exit();
	sock_unregister(PF_SMC);
	smc_core_exit();
	smc_ib_unregister_client();

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);
}
Loading