All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] fs/select: add vmalloc fallback for select(2)
@ 2016-09-22 16:43 ` Vlastimil Babka
  0 siblings, 0 replies; 38+ messages in thread
From: Vlastimil Babka @ 2016-09-22 16:43 UTC (permalink / raw)
  To: Alexander Viro, Andrew Morton
  Cc: linux-fsdevel, linux-kernel, linux-mm, Michal Hocko, netdev,
	Eric Dumazet, Vlastimil Babka

The select(2) syscall performs a kmalloc(size, GFP_KERNEL) where size grows
with the number of fds passed. We had a customer report page allocation
failures of order-4 for this allocation. This is a costly order, so it might
easily fail, as the VM expects such allocation to have a lower-order fallback.

Such trivial fallback is vmalloc(), as the memory doesn't have to be
physically contiguous. Also the allocation is temporary for the duration of the
syscall, so it's unlikely to stress vmalloc too much.

Note that the poll(2) syscall seems to use a linked list of order-0 pages, so
it doesn't need this kind of fallback.

[eric.dumazet@gmail.com: fix failure path logic]
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
---
 fs/select.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/fs/select.c b/fs/select.c
index 8ed9da50896a..b99e98524fde 100644
--- a/fs/select.c
+++ b/fs/select.c
@@ -29,6 +29,7 @@
 #include <linux/sched/rt.h>
 #include <linux/freezer.h>
 #include <net/busy_poll.h>
+#include <linux/vmalloc.h>
 
 #include <asm/uaccess.h>
 
@@ -558,6 +559,7 @@ int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
 	struct fdtable *fdt;
 	/* Allocate small arguments on the stack to save memory and be faster */
 	long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
+	unsigned long alloc_size;
 
 	ret = -EINVAL;
 	if (n < 0)
@@ -580,8 +582,12 @@ int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
 	bits = stack_fds;
 	if (size > sizeof(stack_fds) / 6) {
 		/* Not enough space in on-stack array; must use kmalloc */
+		alloc_size = 6 * size;
 		ret = -ENOMEM;
-		bits = kmalloc(6 * size, GFP_KERNEL);
+		bits = kmalloc(alloc_size, GFP_KERNEL|__GFP_NOWARN);
+		if (!bits && alloc_size > PAGE_SIZE)
+			bits = vmalloc(alloc_size);
+
 		if (!bits)
 			goto out_nofds;
 	}
@@ -618,7 +624,7 @@ int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
 
 out:
 	if (bits != stack_fds)
-		kfree(bits);
+		kvfree(bits);
 out_nofds:
 	return ret;
 }
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2016-09-27 13:34 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-22 16:43 [PATCH v2] fs/select: add vmalloc fallback for select(2) Vlastimil Babka
2016-09-22 16:43 ` Vlastimil Babka
2016-09-22 16:49 ` Eric Dumazet
2016-09-22 16:49   ` Eric Dumazet
2016-09-22 16:49   ` Eric Dumazet
2016-09-22 16:56   ` Vlastimil Babka
2016-09-22 16:56     ` Vlastimil Babka
2016-09-22 17:07     ` Eric Dumazet
2016-09-22 17:07       ` Eric Dumazet
2016-09-22 17:07       ` Eric Dumazet
2016-09-22 17:55       ` Vlastimil Babka
2016-09-22 17:55         ` Vlastimil Babka
2016-09-23  9:42         ` David Laight
2016-09-23  9:58           ` Vlastimil Babka
2016-09-23  9:58             ` Vlastimil Babka
2016-09-23  9:58             ` Vlastimil Babka
2016-09-23 13:35             ` David Laight
2016-09-26 10:01               ` Vlastimil Babka
2016-09-26 10:01                 ` Vlastimil Babka
2016-09-26 15:02                 ` David Laight
2016-09-25 18:50   ` Andi Kleen
2016-09-25 18:50     ` Andi Kleen
2016-09-27  0:01 ` Andrew Morton
2016-09-27  0:01   ` Andrew Morton
2016-09-27  1:38   ` Eric Dumazet
2016-09-27  1:38     ` Eric Dumazet
2016-09-27  1:38     ` Eric Dumazet
2016-09-27  8:13     ` Vlastimil Babka
2016-09-27  8:13       ` Vlastimil Babka
2016-09-27 13:34       ` Eric Dumazet
2016-09-27 13:34         ` Eric Dumazet
2016-09-27 13:34         ` Eric Dumazet
2016-09-27  8:06   ` Vlastimil Babka
2016-09-27  8:06     ` Vlastimil Babka
2016-09-27  8:45 ` [PATCH v3] " Vlastimil Babka
2016-09-27  8:45   ` Vlastimil Babka
2016-09-27 10:22   ` Michal Hocko
2016-09-27 10:22     ` Michal Hocko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.