mm: fix up numa read-only thread grouping logic
[linux-drm-fsl-dcu.git] / mm / vmalloc.c
index 39c338896416bd9f70d197ec30ddd003d935c65e..35b25e1340ca49cf0a95bbc80c69490ec68b5554 100644 (file)
@@ -1324,10 +1324,8 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
        if (unlikely(!area))
                return NULL;
 
-       /*
-        * We always allocate a guard page.
-        */
-       size += PAGE_SIZE;
+       if (!(flags & VM_NO_GUARD))
+               size += PAGE_SIZE;
 
        va = alloc_vmap_area(size, align, start, end, node, gfp_mask);
        if (IS_ERR(va)) {
@@ -1621,6 +1619,7 @@ fail:
  *     @end:           vm area range end
  *     @gfp_mask:      flags for the page level allocator
  *     @prot:          protection mask for the allocated pages
+ *     @vm_flags:      additional vm area flags (e.g. %VM_NO_GUARD)
  *     @node:          node to use for allocation or NUMA_NO_NODE
  *     @caller:        caller's return address
  *
@@ -1630,7 +1629,8 @@ fail:
  */
 void *__vmalloc_node_range(unsigned long size, unsigned long align,
                        unsigned long start, unsigned long end, gfp_t gfp_mask,
-                       pgprot_t prot, int node, const void *caller)
+                       pgprot_t prot, unsigned long vm_flags, int node,
+                       const void *caller)
 {
        struct vm_struct *area;
        void *addr;
@@ -1640,8 +1640,8 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align,
        if (!size || (size >> PAGE_SHIFT) > totalram_pages)
                goto fail;
 
-       area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNINITIALIZED,
-                                 start, end, node, gfp_mask, caller);
+       area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNINITIALIZED |
+                               vm_flags, start, end, node, gfp_mask, caller);
        if (!area)
                goto fail;
 
@@ -1690,7 +1690,7 @@ static void *__vmalloc_node(unsigned long size, unsigned long align,
                            int node, const void *caller)
 {
        return __vmalloc_node_range(size, align, VMALLOC_START, VMALLOC_END,
-                               gfp_mask, prot, node, caller);
+                               gfp_mask, prot, 0, node, caller);
 }
 
 void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot)