From: Michal Hocko <mho...@suse.com>

kvmalloc warned about incompatible gfp_mask to catch abusers (mostly
GFP_NOFS) with an intention that this will motivate authors of the code
to fix those.  Linus argues that this just motivates people to do even
more hacks like

        if (gfp == GFP_KERNEL)
                kvmalloc
        else
                kmalloc

I haven't seen this happening much (Linus pointed to bucket_lock special
cases an atomic allocation but my git foo hasn't found much more) but it
is true that we can grow those in future.  Therefore Linus suggested to
simply not fallback to vmalloc for incompatible gfp flags and rather
stick with the kmalloc path.

Link: http://lkml.kernel.org/r/20180601115329.27807-1-mho...@kernel.org
Signed-off-by: Michal Hocko <mho...@suse.com>
Suggested-by: Linus Torvalds <torva...@linux-foundation.org>
Cc: Tom Herbert <t...@quantonium.net>
Signed-off-by: Andrew Morton <a...@linux-foundation.org>
Signed-off-by: Linus Torvalds <torva...@linux-foundation.org>

https://pmc.acronis.com/browse/VSTOR-14758
https://jira.sw.ru/browse/HCI-132
(cherry picked from commit ce91f6ee5b3bbbad8caff61b1c46d845c8db19bf)
Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com>
---
 mm/util.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/mm/util.c b/mm/util.c
index b9afaef17dfd..5f27a98cbb2d 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -346,7 +346,8 @@ EXPORT_SYMBOL(vm_mmap);
  * 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.
+ * Please note that any use of gfp flags outside of GFP_KERNEL is careful to 
not
+ * fall back to vmalloc.
  */
 void *kvmalloc_node(size_t size, gfp_t flags, int node)
 {
@@ -357,7 +358,8 @@ void *kvmalloc_node(size_t size, gfp_t flags, int node)
         * vmalloc uses GFP_KERNEL for some internal allocations (e.g page 
tables)
         * so the given set of flags has to be compatible.
         */
-       WARN_ON_ONCE((flags & GFP_KERNEL) != GFP_KERNEL);
+       if ((flags & GFP_KERNEL) != GFP_KERNEL)
+               return kmalloc_node(size, flags, node);
 
        /*
         * Make sure that larger requests are not too disruptive - no OOM
-- 
2.16.4

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to