tcp: Namespace-ify sysctl_tcp_default_congestion_control
Subsystems (4)
PATCH v2 1/1 tcp: Namespace-ify sysctl_tcp_default_congestion_control
Make default TCP default congestion control to a per namespace value. This changes default congestion control to a pointer to congestion ops (rather than implicit as first element of available lsit).
The congestion control setting of new namespaces is inherited from the current setting of the root namespace.
---
v2 - drop restriction that modules are only loaded in initial name space.
include/net/netns/ipv4.h | 1 + include/net/tcp.h | 6 ++-- net/ipv4/fib_semantics.c | 4 +-- net/ipv4/sysctl_net_ipv4.c | 19 +++++++----- net/ipv4/tcp_cong.c | 76 ++++++++++++++++++++++------------------------ net/ipv4/tcp_ipv4.c | 9 ++++++ net/ipv6/route.c | 3 +- 7 files changed, 64 insertions(+), 54 deletions(-)
include/net/netns/ipv4.h +1 -0
@@ -160,6 +160,7 @@ struct netns_ipv4 {struct inet_timewait_death_row tcp_death_row;int sysctl_max_syn_backlog;int sysctl_tcp_fastopen; +const struct tcp_congestion_ops __rcu *tcp_congestion_control;struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;spinlock_t tcp_fastopen_ctx_lock;unsigned int sysctl_tcp_fastopen_blackhole_timeout;
include/net/tcp.h +3 -3
@@ -1002,8 +1002,8 @@ void tcp_unregister_congestion_control(struct tcp_congestion_ops *type);void tcp_assign_congestion_control (struct sock *sk);void tcp_init_congestion_control (struct sock *sk);void tcp_cleanup_congestion_control (struct sock *sk); -int tcp_set_default_congestion_control (const char *name); -void tcp_get_default_congestion_control (char *name); +int tcp_set_default_congestion_control (struct net *net,const char *name); +void tcp_get_default_congestion_control (struct net *net,char *name);void tcp_get_available_congestion_control (char *buf,size_t len);void tcp_get_allowed_congestion_control (char *buf,size_t len);int tcp_set_allowed_congestion_control (char *allowed);
@@ -1017,7 +1017,7 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked);extern struct tcp_congestion_ops tcp_reno;struct tcp_congestion_ops *tcp_ca_find_key (u32 key); -u32 tcp_ca_get_key_by_name (const char *name,bool *ecn_ca); +u32 tcp_ca_get_key_by_name (struct net *net,const char *name,bool *ecn_ca);#ifdef CONFIG_INET char *tcp_ca_get_name_by_key (u32 key,char *buffer);#else
net/ipv4/fib_semantics.c +2 -2
@@ -710,7 +710,7 @@ bool fib_metrics_match(struct fib_config *cfg, struct fib_info *fi)bool ecn_ca = false;nla_strlcpy (tmp, nla,sizeof (tmp)); - val =tcp_ca_get_key_by_name (tmp, &ecn_ca); + val =tcp_ca_get_key_by_name (fi->fib_net, tmp, &ecn_ca); }else { val =nla_get_u32 (nla); }
@@ -1030,7 +1030,7 @@ fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg)char tmp[TCP_CA_NAME_MAX ];nla_strlcpy (tmp, nla,sizeof (tmp)); - val =tcp_ca_get_key_by_name (tmp, &ecn_ca); + val =tcp_ca_get_key_by_name (fi->fib_net, tmp, &ecn_ca);if (val ==TCP_CA_UNSPEC )return -EINVAL ; }else {
net/ipv4/sysctl_net_ipv4.c +11 -8
@@ -201,6 +201,8 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write,static int proc_tcp_congestion_control (struct ctl_table *ctl,int write,void __user *buffer,size_t *lenp,loff_t *ppos) { + struct net *net = container_of(ctl->data, struct net, + ipv4.tcp_congestion_control);char val[TCP_CA_NAME_MAX ];struct ctl_table tbl = { .data = val,
@@ -208,11 +210,11 @@ static int proc_tcp_congestion_control(struct ctl_table *ctl, int write, };int ret; -tcp_get_default_congestion_control (val); +tcp_get_default_congestion_control (net, val); ret =proc_dostring (&tbl, write, buffer, lenp, ppos);if (write && ret ==0 ) - ret =tcp_set_default_congestion_control (val); + ret =tcp_set_default_congestion_control (net, val);return ret; }
@@ -447,12 +449,6 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, - { - .procname = "tcp_congestion_control", - .mode = 0644, - .maxlen = TCP_CA_NAME_MAX, - .proc_handler = proc_tcp_congestion_control, - },#ifdef CONFIG_NETLABEL { .procname = "cipso_cache_enable",
@@ -764,6 +760,13 @@ static struct ctl_table ipv4_net_table[] = { },#endif { + .procname = "tcp_congestion_control", + .data = &init_net.ipv4.tcp_congestion_control, + .mode = 0644, + .maxlen = TCP_CA_NAME_MAX, + .proc_handler = proc_tcp_congestion_control, + }, + { .procname = "tcp_keepalive_time", .data = &init_net.ipv4.sysctl_tcp_keepalive_time, .maxlen = sizeof(int),
net/ipv4/tcp_cong.c +36 -40
144 lines not on this page · raw message
net/ipv4/tcp_ipv4.c +9 -0
@@ -2430,6 +2430,8 @@ static void __net_exit tcp_sk_exit(struct net *net) {int cpu; +module_put (net->ipv4.tcp_congestion_control->owner); +for_each_possible_cpu (cpu)inet_ctl_sock_destroy (*per_cpu_ptr (net->ipv4.tcp_sk, cpu));free_percpu (net->ipv4.tcp_sk);
@@ -2522,6 +2524,13 @@ static int __net_init tcp_sk_init(struct net *net) net->ipv4.sysctl_tcp_fastopen_blackhole_timeout =60 *60 ;atomic_set (&net->ipv4.tfo_active_disable_times,0 ); +/* Reno is always built in */ +if (!net_eq (net, &init_net) && +try_module_get (init_net.ipv4.tcp_congestion_control->owner)) + net->ipv4.tcp_congestion_control = init_net.ipv4.tcp_congestion_control; +else + net->ipv4.tcp_congestion_control = &tcp_reno; +return 0 ; fail:tcp_sk_exit (net);
net/ipv6/route.c +2 -1
@@ -2378,6 +2378,7 @@ static int ip6_dst_gc(struct dst_ops *ops)static int ip6_convert_metrics (struct mx6_config *mxc,const struct fib6_config *cfg) { +struct net *net = cfg->fc_nlinfo.nl_net;bool ecn_ca = false;struct nlattr *nla;int remaining;
@@ -2403,7 +2404,7 @@ static int ip6_convert_metrics(struct mx6_config *mxc,char tmp[TCP_CA_NAME_MAX ];nla_strlcpy (tmp, nla,sizeof (tmp)); - val =tcp_ca_get_key_by_name (tmp, &ecn_ca); + val =tcp_ca_get_key_by_name (net, tmp, &ecn_ca);if (val ==TCP_CA_UNSPEC ) goto err; }else {
Signature · 1 line
2.11.0
Quoted 10 lines · Stephen Hemminger
Make default TCP default congestion control to a per namespace value. This changes default congestion control to a pointer to congestion ops (rather than implicit as first element of available lsit).
The congestion control setting of new namespaces is inherited from the current setting of the root namespace.
Signed-off-by Stephen Hemminger <[email protected]>---
v2 - drop restriction that modules are only loaded in initial name space.
Thanks Stephen !
From: Stephen Hemminger <[email protected]>
Date: Tue, 14 Nov 2017 08:25:49 -0800
Quoted 10 lines
Make default TCP default congestion control to a per namespace value. This changes default congestion control to a pointer to congestion ops (rather than implicit as first element of available lsit).
The congestion control setting of new namespaces is inherited from the current setting of the root namespace.
Signed-off-by Stephen Hemminger <[email protected]>---
v2 - drop restriction that modules are only loaded in initial name space.
Applied.