net/smc: add sysctl interface for SMC
authorDust Li <dust.li@linux.alibaba.com>
Tue, 1 Mar 2022 09:43:56 +0000 (17:43 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Mar 2022 14:25:12 +0000 (14:25 +0000)
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: Tony Lu <tonylu@linux.alibaba.com>
Signed-off-by: Tony Lu <tonylu@linux.alibaba.com>
Signed-off-by: Dust Li <dust.li@linux.alibaba.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netns/smc.h
net/smc/Makefile
net/smc/af_smc.c
net/smc/smc_sysctl.c [new file with mode: 0644]
net/smc/smc_sysctl.h [new file with mode: 0644]

index 47b1666..1682eae 100644 (file)
@@ -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
index 196fb6f..640af9a 100644 (file)
@@ -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
index 30acc31..19b3066 100644 (file)
@@ -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 @@ out_pernet_subsys:
 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();
diff --git a/net/smc/smc_sysctl.c b/net/smc/smc_sysctl.c
new file mode 100644 (file)
index 0000000..8a3a8e1
--- /dev/null
@@ -0,0 +1,70 @@
+// 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);
+}
diff --git a/net/smc/smc_sysctl.h b/net/smc/smc_sysctl.h
new file mode 100644 (file)
index 0000000..49553ac
--- /dev/null
@@ -0,0 +1,32 @@
+/* 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 */