diff options
author | Vadim Lobanov <vlobanov@speakeasy.net> | 2006-12-10 05:21:12 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-10 12:57:22 -0500 |
commit | bbea9f69668a3d0cf9feba15a724cd02896f8675 (patch) | |
tree | bc58506e4daba4a04309181a5501ae4eb5424783 /arch | |
parent | f3d19c90fb117a5f080310a4592929aa8e1ad8e9 (diff) |
[PATCH] fdtable: Make fdarray and fdsets equal in size
Currently, each fdtable supports three dynamically-sized arrays of data: the
fdarray and two fdsets. The code allows the number of fds supported by the
fdarray (fdtable->max_fds) to differ from the number of fds supported by each
of the fdsets (fdtable->max_fdset).
In practice, it is wasteful for these two sizes to differ: whenever we hit a
limit on the smaller-capacity structure, we will reallocate the entire fdtable
and all the dynamic arrays within it, so any delta in the memory used by the
larger-capacity structure will never be touched at all.
Rather than hogging this excess, we shouldn't even allocate it in the first
place, and keep the capacities of the fdarray and the fdsets equal. This
patch removes fdtable->max_fdset. As an added bonus, most of the supporting
code becomes simpler.
Signed-off-by: Vadim Lobanov <vlobanov@speakeasy.net>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Dipankar Sarma <dipankar@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/alpha/kernel/osf_sys.c | 6 | ||||
-rw-r--r-- | arch/mips/kernel/kspd.c | 2 |
2 files changed, 4 insertions, 4 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index fb804043b320..be133f1f75a4 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
@@ -979,7 +979,7 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, | |||
979 | long timeout; | 979 | long timeout; |
980 | int ret = -EINVAL; | 980 | int ret = -EINVAL; |
981 | struct fdtable *fdt; | 981 | struct fdtable *fdt; |
982 | int max_fdset; | 982 | int max_fds; |
983 | 983 | ||
984 | timeout = MAX_SCHEDULE_TIMEOUT; | 984 | timeout = MAX_SCHEDULE_TIMEOUT; |
985 | if (tvp) { | 985 | if (tvp) { |
@@ -1003,9 +1003,9 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, | |||
1003 | 1003 | ||
1004 | rcu_read_lock(); | 1004 | rcu_read_lock(); |
1005 | fdt = files_fdtable(current->files); | 1005 | fdt = files_fdtable(current->files); |
1006 | max_fdset = fdt->max_fdset; | 1006 | max_fds = fdt->max_fds; |
1007 | rcu_read_unlock(); | 1007 | rcu_read_unlock(); |
1008 | if (n < 0 || n > max_fdset) | 1008 | if (n < 0 || n > max_fds) |
1009 | goto out_nofds; | 1009 | goto out_nofds; |
1010 | 1010 | ||
1011 | /* | 1011 | /* |
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 2c82412b9efe..5929f883e46b 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
@@ -301,7 +301,7 @@ static void sp_cleanup(void) | |||
301 | for (;;) { | 301 | for (;;) { |
302 | unsigned long set; | 302 | unsigned long set; |
303 | i = j * __NFDBITS; | 303 | i = j * __NFDBITS; |
304 | if (i >= fdt->max_fdset || i >= fdt->max_fds) | 304 | if (i >= fdt->max_fds) |
305 | break; | 305 | break; |
306 | set = fdt->open_fds->fds_bits[j++]; | 306 | set = fdt->open_fds->fds_bits[j++]; |
307 | while (set) { | 307 | while (set) { |