diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2008-02-06 04:37:16 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-06 13:41:06 -0500 |
commit | 9cfe015aa424b3c003baba3841a60dd9b5ad319b (patch) | |
tree | 5575e06efcf91018f860f2db43979e8e91aba1c3 /kernel | |
parent | 774ed22c21ab95d582dfff38560f11cf290baeb4 (diff) |
get rid of NR_OPEN and introduce a sysctl_nr_open
NR_OPEN (historically set to 1024*1024) actually forbids processes to open
more than 1024*1024 handles.
Unfortunatly some production servers hit the not so 'ridiculously high
value' of 1024*1024 file descriptors per process.
Changing NR_OPEN is not considered safe because of vmalloc space potential
exhaust.
This patch introduces a new sysctl (/proc/sys/fs/nr_open) wich defaults to
1024*1024, so that admins can decide to change this limit if their workload
needs it.
[akpm@linux-foundation.org: export it for sparc64]
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sys.c | 2 | ||||
-rw-r--r-- | kernel/sysctl.c | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index 53de35fc8245..2b8e2daa9d95 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -1472,7 +1472,7 @@ asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim) | |||
1472 | if ((new_rlim.rlim_max > old_rlim->rlim_max) && | 1472 | if ((new_rlim.rlim_max > old_rlim->rlim_max) && |
1473 | !capable(CAP_SYS_RESOURCE)) | 1473 | !capable(CAP_SYS_RESOURCE)) |
1474 | return -EPERM; | 1474 | return -EPERM; |
1475 | if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > NR_OPEN) | 1475 | if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > sysctl_nr_open) |
1476 | return -EPERM; | 1476 | return -EPERM; |
1477 | 1477 | ||
1478 | retval = security_task_setrlimit(resource, &new_rlim); | 1478 | retval = security_task_setrlimit(resource, &new_rlim); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 5e2ad5bf88e2..86daaa26d120 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -1203,6 +1203,14 @@ static struct ctl_table fs_table[] = { | |||
1203 | .proc_handler = &proc_dointvec, | 1203 | .proc_handler = &proc_dointvec, |
1204 | }, | 1204 | }, |
1205 | { | 1205 | { |
1206 | .ctl_name = CTL_UNNUMBERED, | ||
1207 | .procname = "nr_open", | ||
1208 | .data = &sysctl_nr_open, | ||
1209 | .maxlen = sizeof(int), | ||
1210 | .mode = 0644, | ||
1211 | .proc_handler = &proc_dointvec, | ||
1212 | }, | ||
1213 | { | ||
1206 | .ctl_name = FS_DENTRY, | 1214 | .ctl_name = FS_DENTRY, |
1207 | .procname = "dentry-state", | 1215 | .procname = "dentry-state", |
1208 | .data = &dentry_stat, | 1216 | .data = &dentry_stat, |