Skip to content

Commit

Permalink
net/smc: add sysctl interface for SMC
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dust Li authored and David S. Miller committed Mar 1, 2022
1 parent 1e385c0 commit 462791b
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 1 deletion.
3 changes: 3 additions & 0 deletions include/net/netns/smc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion net/smc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 10 additions & 0 deletions net/smc/af_smc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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();
Expand Down
70 changes: 70 additions & 0 deletions net/smc/smc_sysctl.c
Original file line number Diff line number Diff line change
@@ -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);
}
32 changes: 32 additions & 0 deletions net/smc/smc_sysctl.h
Original file line number Diff line number Diff line change
@@ -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 */

0 comments on commit 462791b

Please sign in to comment.