optimize compat_core_sys_select() by a using stack space for small fd sets
Optimize select by a using stack space for small fd sets. core_sys_select() already has this optimization. This is for compat version. Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7bb44adef3
commit
6087b2dab2
1 changed files with 11 additions and 6 deletions
17
fs/compat.c
17
fs/compat.c
|
@ -1544,9 +1544,10 @@ int compat_core_sys_select(int n, compat_ulong_t __user *inp,
|
||||||
compat_ulong_t __user *outp, compat_ulong_t __user *exp, s64 *timeout)
|
compat_ulong_t __user *outp, compat_ulong_t __user *exp, s64 *timeout)
|
||||||
{
|
{
|
||||||
fd_set_bits fds;
|
fd_set_bits fds;
|
||||||
char *bits;
|
void *bits;
|
||||||
int size, max_fds, ret = -EINVAL;
|
int size, max_fds, ret = -EINVAL;
|
||||||
struct fdtable *fdt;
|
struct fdtable *fdt;
|
||||||
|
long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
|
||||||
|
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
goto out_nofds;
|
goto out_nofds;
|
||||||
|
@ -1564,11 +1565,14 @@ int compat_core_sys_select(int n, compat_ulong_t __user *inp,
|
||||||
* since we used fdset we need to allocate memory in units of
|
* since we used fdset we need to allocate memory in units of
|
||||||
* long-words.
|
* long-words.
|
||||||
*/
|
*/
|
||||||
ret = -ENOMEM;
|
|
||||||
size = FDS_BYTES(n);
|
size = FDS_BYTES(n);
|
||||||
bits = kmalloc(6 * size, GFP_KERNEL);
|
bits = stack_fds;
|
||||||
if (!bits)
|
if (size > sizeof(stack_fds) / 6) {
|
||||||
goto out_nofds;
|
bits = kmalloc(6 * size, GFP_KERNEL);
|
||||||
|
ret = -ENOMEM;
|
||||||
|
if (!bits)
|
||||||
|
goto out_nofds;
|
||||||
|
}
|
||||||
fds.in = (unsigned long *) bits;
|
fds.in = (unsigned long *) bits;
|
||||||
fds.out = (unsigned long *) (bits + size);
|
fds.out = (unsigned long *) (bits + size);
|
||||||
fds.ex = (unsigned long *) (bits + 2*size);
|
fds.ex = (unsigned long *) (bits + 2*size);
|
||||||
|
@ -1600,7 +1604,8 @@ int compat_core_sys_select(int n, compat_ulong_t __user *inp,
|
||||||
compat_set_fd_set(n, exp, fds.res_ex))
|
compat_set_fd_set(n, exp, fds.res_ex))
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
out:
|
out:
|
||||||
kfree(bits);
|
if (bits != stack_fds)
|
||||||
|
kfree(bits);
|
||||||
out_nofds:
|
out_nofds:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue