|
@@ -339,7 +339,9 @@ EXPORT_SYMBOL(vm_mmap);
|
|
|
* Uses kmalloc to get the memory but if the allocation fails then falls back
|
|
|
* to the vmalloc allocator. Use kvfree for freeing the memory.
|
|
|
*
|
|
|
- * Reclaim modifiers - __GFP_NORETRY, __GFP_REPEAT and __GFP_NOFAIL are not supported
|
|
|
+ * Reclaim modifiers - __GFP_NORETRY and __GFP_NOFAIL are not supported. __GFP_REPEAT
|
|
|
+ * is supported only for large (>32kB) allocations, and it should be used only if
|
|
|
+ * kmalloc is preferable to the vmalloc fallback, due to visible performance drawbacks.
|
|
|
*
|
|
|
* Any use of gfp flags outside of GFP_KERNEL should be consulted with mm people.
|
|
|
*/
|
|
@@ -358,8 +360,18 @@ void *kvmalloc_node(size_t size, gfp_t flags, int node)
|
|
|
* Make sure that larger requests are not too disruptive - no OOM
|
|
|
* killer and no allocation failure warnings as we have a fallback
|
|
|
*/
|
|
|
- if (size > PAGE_SIZE)
|
|
|
- kmalloc_flags |= __GFP_NORETRY | __GFP_NOWARN;
|
|
|
+ if (size > PAGE_SIZE) {
|
|
|
+ kmalloc_flags |= __GFP_NOWARN;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We have to override __GFP_REPEAT by __GFP_NORETRY for !costly
|
|
|
+ * requests because there is no other way to tell the allocator
|
|
|
+ * that we want to fail rather than retry endlessly.
|
|
|
+ */
|
|
|
+ if (!(kmalloc_flags & __GFP_REPEAT) ||
|
|
|
+ (size <= PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
|
|
|
+ kmalloc_flags |= __GFP_NORETRY;
|
|
|
+ }
|
|
|
|
|
|
ret = kmalloc_node(size, kmalloc_flags, node);
|
|
|
|