2009-04-08 02:18:07

by Shen Feng

[permalink] [raw]
Subject: [PATCH] IPv4/IPv6: update sysctl files


Now the following sysctl files in /proc/sys/net/ipv4 are used by
both IPv4 and IPv6.
tcp_mem tcp_rmem tcp_wmem
udp_mem udp_rmem_min udp_wmem_min
Putting them in /proc/sys/net/ipv4 is not a good choice.

So move tcp_mem tcp_rmem tcp_wmem to /proc/sys/net/tcp and
move udp_mem udp_rmem_min udp_wmem_min to /poc/sys/net/udp.

Signed-off-by: Shen Feng <[email protected]>
---
net/ipv4/sysctl_net_ipv4.c | 95 ++++++++++++++++++++++++++++++-------------
1 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index 4710d21..a520011 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -503,30 +503,6 @@ static struct ctl_table ipv4_table[] = {
.proc_handler = proc_dointvec
},
{
- .ctl_name = NET_TCP_MEM,
- .procname = "tcp_mem",
- .data = &sysctl_tcp_mem,
- .maxlen = sizeof(sysctl_tcp_mem),
- .mode = 0644,
- .proc_handler = proc_dointvec
- },
- {
- .ctl_name = NET_TCP_WMEM,
- .procname = "tcp_wmem",
- .data = &sysctl_tcp_wmem,
- .maxlen = sizeof(sysctl_tcp_wmem),
- .mode = 0644,
- .proc_handler = proc_dointvec
- },
- {
- .ctl_name = NET_TCP_RMEM,
- .procname = "tcp_rmem",
- .data = &sysctl_tcp_rmem,
- .maxlen = sizeof(sysctl_tcp_rmem),
- .mode = 0644,
- .proc_handler = proc_dointvec
- },
- {
.ctl_name = NET_TCP_APP_WIN,
.procname = "tcp_app_win",
.data = &sysctl_tcp_app_win,
@@ -712,6 +688,38 @@ static struct ctl_table ipv4_table[] = {
.mode = 0644,
.proc_handler = proc_dointvec,
},
+ { .ctl_name = 0 }
+};
+
+static struct ctl_table proc_tcp_table[] = {
+ {
+ .ctl_name = NET_TCP_MEM,
+ .procname = "tcp_mem",
+ .data = &sysctl_tcp_mem,
+ .maxlen = sizeof(sysctl_tcp_mem),
+ .mode = 0644,
+ .proc_handler = proc_dointvec
+ },
+ {
+ .ctl_name = NET_TCP_WMEM,
+ .procname = "tcp_wmem",
+ .data = &sysctl_tcp_wmem,
+ .maxlen = sizeof(sysctl_tcp_wmem),
+ .mode = 0644,
+ .proc_handler = proc_dointvec
+ },
+ {
+ .ctl_name = NET_TCP_RMEM,
+ .procname = "tcp_rmem",
+ .data = &sysctl_tcp_rmem,
+ .maxlen = sizeof(sysctl_tcp_rmem),
+ .mode = 0644,
+ .proc_handler = proc_dointvec
+ },
+ {},
+};
+
+static struct ctl_table proc_udp_table[] = {
{
.ctl_name = CTL_UNNUMBERED,
.procname = "udp_mem",
@@ -742,7 +750,7 @@ static struct ctl_table ipv4_table[] = {
.strategy = sysctl_intvec,
.extra1 = &zero
},
- { .ctl_name = 0 }
+ {},
};

static struct ctl_table ipv4_net_table[] = {
@@ -813,6 +821,20 @@ struct ctl_path net_ipv4_ctl_path[] = {
};
EXPORT_SYMBOL_GPL(net_ipv4_ctl_path);

+struct ctl_path net_tcp_ctl_path[] = {
+ { .procname = "net", .ctl_name = CTL_NET, },
+ { .procname = "tcp", .ctl_name = CTL_UNNUMBERED, },
+ {},
+};
+EXPORT_SYMBOL_GPL(net_tcp_ctl_path);
+
+struct ctl_path net_udp_ctl_path[] = {
+ { .procname = "net", .ctl_name = CTL_NET, },
+ { .procname = "udp", .ctl_name = CTL_UNNUMBERED, },
+ {},
+};
+EXPORT_SYMBOL_GPL(net_udp_ctl_path);
+
static __net_init int ipv4_sysctl_init_net(struct net *net)
{
struct ctl_table *table;
@@ -871,14 +893,29 @@ static __net_initdata struct pernet_operations ipv4_sysctl_ops = {

static __init int sysctl_ipv4_init(void)
{
- struct ctl_table_header *hdr;
+ struct ctl_table_header *hdr_ipv4, *hdr_tcp, *hdr_udp;
+
+ hdr_ipv4 = register_sysctl_paths(net_ipv4_ctl_path, ipv4_table);
+ if (hdr_ipv4 == NULL)
+ return -ENOMEM;

- hdr = register_sysctl_paths(net_ipv4_ctl_path, ipv4_table);
- if (hdr == NULL)
+ hdr_tcp = register_sysctl_paths(net_tcp_ctl_path, proc_tcp_table);
+ if (hdr_tcp == NULL) {
+ unregister_sysctl_table(hdr_ipv4);
return -ENOMEM;
+ }
+
+ hdr_udp = register_sysctl_paths(net_udp_ctl_path, proc_udp_table);
+ if (hdr_udp == NULL) {
+ unregister_sysctl_table(hdr_ipv4);
+ unregister_sysctl_table(hdr_tcp);
+ return -ENOMEM;
+ }

if (register_pernet_subsys(&ipv4_sysctl_ops)) {
- unregister_sysctl_table(hdr);
+ unregister_sysctl_table(hdr_ipv4);
+ unregister_sysctl_table(hdr_tcp);
+ unregister_sysctl_table(hdr_udp);
return -ENOMEM;
}

--
1.6.0.6


2009-04-08 02:41:28

by Eric W. Biederman

[permalink] [raw]
Subject: Re: [PATCH] IPv4/IPv6: update sysctl files

Shen Feng <[email protected]> writes:

> Now the following sysctl files in /proc/sys/net/ipv4 are used by
> both IPv4 and IPv6.
> tcp_mem tcp_rmem tcp_wmem
> udp_mem udp_rmem_min udp_wmem_min
> Putting them in /proc/sys/net/ipv4 is not a good choice.
>
> So move tcp_mem tcp_rmem tcp_wmem to /proc/sys/net/tcp and
> move udp_mem udp_rmem_min udp_wmem_min to /poc/sys/net/udp.

How badly does this blow up when you enable sysctl_check?
You just enabled new binary sysctl mappings, which is big no-no.

Further how many user space scripts did you break that touch those
files? This is an ABI change.

Eric

2009-04-08 02:48:13

by Ben Hutchings

[permalink] [raw]
Subject: Re: [PATCH] IPv4/IPv6: update sysctl files

On Wed, 2009-04-08 at 02:39 +0000, Shen Feng wrote:
> Now the following sysctl files in /proc/sys/net/ipv4 are used by
> both IPv4 and IPv6.
> tcp_mem tcp_rmem tcp_wmem
> udp_mem udp_rmem_min udp_wmem_min
> Putting them in /proc/sys/net/ipv4 is not a good choice.
[...]

But this is part of the ABI to userland. You cannot remove sysctl files
without long advance notice documented in feature-removal-schedule.txt
(if at all).

If it is possible to add the paths
/proc/sys/net/{tcp,udp} while retaining aliases under /proc/sys/net/ipv4
then that might be a workable solution.

Ben.

--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

2009-04-08 03:29:25

by Shen Feng

[permalink] [raw]
Subject: Re: [PATCH] IPv4/IPv6: update sysctl files



on 04/08/2009 10:47 AM, Ben Hutchings wrote:
> On Wed, 2009-04-08 at 02:39 +0000, Shen Feng wrote:
>> Now the following sysctl files in /proc/sys/net/ipv4 are used by
>> both IPv4 and IPv6.
>> tcp_mem tcp_rmem tcp_wmem
>> udp_mem udp_rmem_min udp_wmem_min
>> Putting them in /proc/sys/net/ipv4 is not a good choice.
> [...]
>
> But this is part of the ABI to userland. You cannot remove sysctl files
> without long advance notice documented in feature-removal-schedule.txt
> (if at all).
>
> If it is possible to add the paths
> /proc/sys/net/{tcp,udp} while retaining aliases under /proc/sys/net/ipv4
> then that might be a workable solution.

Thanks. That's a good solution.

But I'm still confused.
Why not create another tcp_mem in /proc/sys/net/ipv6?

Shen

>
> Ben.
>

2009-04-08 07:18:53

by David Miller

[permalink] [raw]
Subject: Re: [PATCH] IPv4/IPv6: update sysctl files

From: Shen Feng <[email protected]>
Date: Wed, 08 Apr 2009 11:28:21 +0800

>
>
> on 04/08/2009 10:47 AM, Ben Hutchings wrote:
>> On Wed, 2009-04-08 at 02:39 +0000, Shen Feng wrote:
>>> Now the following sysctl files in /proc/sys/net/ipv4 are used by
>>> both IPv4 and IPv6.
>>> tcp_mem tcp_rmem tcp_wmem
>>> udp_mem udp_rmem_min udp_wmem_min
>>> Putting them in /proc/sys/net/ipv4 is not a good choice.
>> [...]
>>
>> But this is part of the ABI to userland. You cannot remove sysctl files
>> without long advance notice documented in feature-removal-schedule.txt
>> (if at all).
>>
>> If it is possible to add the paths
>> /proc/sys/net/{tcp,udp} while retaining aliases under /proc/sys/net/ipv4
>> then that might be a workable solution.
>
> Thanks. That's a good solution.
>
> But I'm still confused.
> Why not create another tcp_mem in /proc/sys/net/ipv6?

People just need to understand that ipv4 is always going to be
there and that's where all the tcp controls are.

I really am not going to entertain changes that try to move generic
inet sysctl things out of the ipv4 directory. There is really no
point at all.

2009-04-08 08:53:38

by Shen Feng

[permalink] [raw]
Subject: Re: [PATCH] IPv4/IPv6: update sysctl files



on 04/08/2009 03:18 PM, David Miller wrote:
> From: Shen Feng <[email protected]>
> Date: Wed, 08 Apr 2009 11:28:21 +0800
>
>>
>> on 04/08/2009 10:47 AM, Ben Hutchings wrote:
>>> On Wed, 2009-04-08 at 02:39 +0000, Shen Feng wrote:
>>>> Now the following sysctl files in /proc/sys/net/ipv4 are used by
>>>> both IPv4 and IPv6.
>>>> tcp_mem tcp_rmem tcp_wmem
>>>> udp_mem udp_rmem_min udp_wmem_min
>>>> Putting them in /proc/sys/net/ipv4 is not a good choice.
>>> [...]
>>>
>>> But this is part of the ABI to userland. You cannot remove sysctl files
>>> without long advance notice documented in feature-removal-schedule.txt
>>> (if at all).
>>>
>>> If it is possible to add the paths
>>> /proc/sys/net/{tcp,udp} while retaining aliases under /proc/sys/net/ipv4
>>> then that might be a workable solution.
>> Thanks. That's a good solution.
>>
>> But I'm still confused.
>> Why not create another tcp_mem in /proc/sys/net/ipv6?
>
> People just need to understand that ipv4 is always going to be
> there and that's where all the tcp controls are.
>
> I really am not going to entertain changes that try to move generic
> inet sysctl things out of the ipv4 directory. There is really no
> point at all.
>

/proc/sys/net/ipv4/tcp_mem is a inet sysctl, but it also controls the tcp v6.
So it's also a inet6 sysctl. Is it intentional?
This may confuse users. We may have a /proc/sys/net/ipv6/tcp6_mem.

>
>

2009-04-08 09:09:43

by David Miller

[permalink] [raw]
Subject: Re: [PATCH] IPv4/IPv6: update sysctl files

From: Shen Feng <[email protected]>
Date: Wed, 08 Apr 2009 16:50:49 +0800

> /proc/sys/net/ipv4/tcp_mem is a inet sysctl, but it also controls the tcp v6.
> So it's also a inet6 sysctl. Is it intentional?

Yes, please just drop this.