Jarod Wilson 0252aa3
mm: add vzalloc() and vzalloc_node() helpers
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
Drop-in helper function backport from upstream.
Jarod Wilson 0252aa3
    
Jarod Wilson 0252aa3
Upstream commits:
Jarod Wilson 0252aa3
  commit e1ca7788dec6773b1a2bce51b7141948f2b8bccf
Jarod Wilson 0252aa3
  Author: Dave Young <hidave.darkstar@gmail.com>
Jarod Wilson 0252aa3
  Date:   Tue Oct 26 14:22:06 2010 -0700
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    mm: add vzalloc() and vzalloc_node() helpers
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    Add vzalloc() and vzalloc_node() to encapsulate the
Jarod Wilson 0252aa3
    vmalloc-then-memset-zero operation.
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    Use __GFP_ZERO to zero fill the allocated memory.
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Jarod Wilson 0252aa3
    Cc: Christoph Lameter <cl@linux-foundation.org>
Jarod Wilson 0252aa3
    Acked-by: Greg Ungerer <gerg@snapgear.com>
Jarod Wilson 0252aa3
    Cc: David Howells <dhowells@redhat.com>
Jarod Wilson 0252aa3
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Jarod Wilson 0252aa3
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
  commit 9a14f653dfe349c0916e6a78c413effa2fa3f001
Jarod Wilson 0252aa3
  Author: Paul Mundt <lethal@linux-sh.org>
Jarod Wilson 0252aa3
  Date:   Fri Dec 24 11:50:34 2010 +0900
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    nommu: Fix up vmalloc_node() symbol export regression.
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    Commit e1ca778 ("mm: add vzalloc() and vzalloc_node() helpers") ended up
Jarod Wilson 0252aa3
    accidentally deleting the vmalloc_node() symbol export, resulting in:
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    "vmalloc_node" [net/core/pktgen.ko] undefined!
Jarod Wilson 0252aa3
    "vmalloc_node" [net/netfilter/x_tables.ko] undefined!
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    regressions.
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
    Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Jarod Wilson 0252aa3
Jarod Wilson 0252aa3
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
Jarod Wilson 0252aa3
index d9a787a..5e03b00 100644
Jarod Wilson 0252aa3
--- a/include/linux/vmalloc.h
Jarod Wilson 0252aa3
+++ b/include/linux/vmalloc.h
Jarod Wilson 0252aa3
@@ -51,8 +51,10 @@ static inline void vmalloc_init(void)
Jarod Wilson 0252aa3
 #endif
Jarod Wilson 0252aa3
 
Jarod Wilson 0252aa3
 extern void *vmalloc(unsigned long size);
Jarod Wilson 0252aa3
+extern void *vzalloc(unsigned long size);
Jarod Wilson 0252aa3
 extern void *vmalloc_user(unsigned long size);
Jarod Wilson 0252aa3
 extern void *vmalloc_node(unsigned long size, int node);
Jarod Wilson 0252aa3
+extern void *vzalloc_node(unsigned long size, int node);
Jarod Wilson 0252aa3
 extern void *vmalloc_exec(unsigned long size);
Jarod Wilson 0252aa3
 extern void *vmalloc_32(unsigned long size);
Jarod Wilson 0252aa3
 extern void *vmalloc_32_user(unsigned long size);
Jarod Wilson 0252aa3
diff --git a/mm/nommu.c b/mm/nommu.c
Jarod Wilson 0252aa3
index b30fde0..bdb4d22 100644
Jarod Wilson 0252aa3
--- a/mm/nommu.c
Jarod Wilson 0252aa3
+++ b/mm/nommu.c
Jarod Wilson 0252aa3
@@ -298,12 +298,60 @@ void *vmalloc(unsigned long size)
Jarod Wilson 0252aa3
 }
Jarod Wilson 0252aa3
 EXPORT_SYMBOL(vmalloc);
Jarod Wilson 0252aa3
 
Jarod Wilson 0252aa3
+/*
Jarod Wilson 0252aa3
+ *	vzalloc - allocate virtually continguos memory with zero fill
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ *	@size:		allocation size
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ *	Allocate enough pages to cover @size from the page level
Jarod Wilson 0252aa3
+ *	allocator and map them into continguos kernel virtual space.
Jarod Wilson 0252aa3
+ *	The memory allocated is set to zero.
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ *	For tight control over page level allocator and protection flags
Jarod Wilson 0252aa3
+ *	use __vmalloc() instead.
Jarod Wilson 0252aa3
+ */
Jarod Wilson 0252aa3
+void *vzalloc(unsigned long size)
Jarod Wilson 0252aa3
+{
Jarod Wilson 0252aa3
+	return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO,
Jarod Wilson 0252aa3
+			PAGE_KERNEL);
Jarod Wilson 0252aa3
+}
Jarod Wilson 0252aa3
+EXPORT_SYMBOL(vzalloc);
Jarod Wilson 0252aa3
+
Jarod Wilson 0252aa3
+/**
Jarod Wilson 0252aa3
+ * vmalloc_node - allocate memory on a specific node
Jarod Wilson 0252aa3
+ * @size:	allocation size
Jarod Wilson 0252aa3
+ * @node:	numa node
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ * Allocate enough pages to cover @size from the page level
Jarod Wilson 0252aa3
+ * allocator and map them into contiguous kernel virtual space.
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ * For tight control over page level allocator and protection flags
Jarod Wilson 0252aa3
+ * use __vmalloc() instead.
Jarod Wilson 0252aa3
+ */
Jarod Wilson 0252aa3
 void *vmalloc_node(unsigned long size, int node)
Jarod Wilson 0252aa3
 {
Jarod Wilson 0252aa3
 	return vmalloc(size);
Jarod Wilson 0252aa3
 }
Jarod Wilson 0252aa3
 EXPORT_SYMBOL(vmalloc_node);
Jarod Wilson 0252aa3
 
Jarod Wilson 0252aa3
+/**
Jarod Wilson 0252aa3
+ * vzalloc_node - allocate memory on a specific node with zero fill
Jarod Wilson 0252aa3
+ * @size:	allocation size
Jarod Wilson 0252aa3
+ * @node:	numa node
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ * Allocate enough pages to cover @size from the page level
Jarod Wilson 0252aa3
+ * allocator and map them into contiguous kernel virtual space.
Jarod Wilson 0252aa3
+ * The memory allocated is set to zero.
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ * For tight control over page level allocator and protection flags
Jarod Wilson 0252aa3
+ * use __vmalloc() instead.
Jarod Wilson 0252aa3
+ */
Jarod Wilson 0252aa3
+void *vzalloc_node(unsigned long size, int node)
Jarod Wilson 0252aa3
+{
Jarod Wilson 0252aa3
+	return vzalloc(size);
Jarod Wilson 0252aa3
+}
Jarod Wilson 0252aa3
+EXPORT_SYMBOL(vzalloc_node);
Jarod Wilson 0252aa3
+
Jarod Wilson 0252aa3
 #ifndef PAGE_KERNEL_EXEC
Jarod Wilson 0252aa3
 # define PAGE_KERNEL_EXEC PAGE_KERNEL
Jarod Wilson 0252aa3
 #endif
Jarod Wilson 0252aa3
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
Jarod Wilson 0252aa3
index 12568fa..2e2e7a3 100644
Jarod Wilson 0252aa3
--- a/mm/vmalloc.c
Jarod Wilson 0252aa3
+++ b/mm/vmalloc.c
Jarod Wilson 0252aa3
@@ -1583,6 +1583,13 @@ void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot)
Jarod Wilson 0252aa3
 }
Jarod Wilson 0252aa3
 EXPORT_SYMBOL(__vmalloc);
Jarod Wilson 0252aa3
 
Jarod Wilson 0252aa3
+static inline void *__vmalloc_node_flags(unsigned long size,
Jarod Wilson 0252aa3
+					int node, gfp_t flags)
Jarod Wilson 0252aa3
+{
Jarod Wilson 0252aa3
+	return __vmalloc_node(size, 1, flags, PAGE_KERNEL,
Jarod Wilson 0252aa3
+					node, __builtin_return_address(0));
Jarod Wilson 0252aa3
+}
Jarod Wilson 0252aa3
+
Jarod Wilson 0252aa3
 /**
Jarod Wilson 0252aa3
  *	vmalloc  -  allocate virtually contiguous memory
Jarod Wilson 0252aa3
  *	@size:		allocation size
Jarod Wilson 0252aa3
@@ -1594,12 +1601,28 @@ EXPORT_SYMBOL(__vmalloc);
Jarod Wilson 0252aa3
  */
Jarod Wilson 0252aa3
 void *vmalloc(unsigned long size)
Jarod Wilson 0252aa3
 {
Jarod Wilson 0252aa3
-	return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL,
Jarod Wilson 0252aa3
-					-1, __builtin_return_address(0));
Jarod Wilson 0252aa3
+	return __vmalloc_node_flags(size, -1, GFP_KERNEL | __GFP_HIGHMEM);
Jarod Wilson 0252aa3
 }
Jarod Wilson 0252aa3
 EXPORT_SYMBOL(vmalloc);
Jarod Wilson 0252aa3
 
Jarod Wilson 0252aa3
 /**
Jarod Wilson 0252aa3
+ *	vzalloc - allocate virtually contiguous memory with zero fill
Jarod Wilson 0252aa3
+ *	@size:	allocation size
Jarod Wilson 0252aa3
+ *	Allocate enough pages to cover @size from the page level
Jarod Wilson 0252aa3
+ *	allocator and map them into contiguous kernel virtual space.
Jarod Wilson 0252aa3
+ *	The memory allocated is set to zero.
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ *	For tight control over page level allocator and protection flags
Jarod Wilson 0252aa3
+ *	use __vmalloc() instead.
Jarod Wilson 0252aa3
+ */
Jarod Wilson 0252aa3
+void *vzalloc(unsigned long size)
Jarod Wilson 0252aa3
+{
Jarod Wilson 0252aa3
+	return __vmalloc_node_flags(size, -1,
Jarod Wilson 0252aa3
+				GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO);
Jarod Wilson 0252aa3
+}
Jarod Wilson 0252aa3
+EXPORT_SYMBOL(vzalloc);
Jarod Wilson 0252aa3
+
Jarod Wilson 0252aa3
+/**
Jarod Wilson 0252aa3
  * vmalloc_user - allocate zeroed virtually contiguous memory for userspace
Jarod Wilson 0252aa3
  * @size: allocation size
Jarod Wilson 0252aa3
  *
Jarod Wilson 0252aa3
@@ -1640,6 +1663,25 @@ void *vmalloc_node(unsigned long size, int node)
Jarod Wilson 0252aa3
 }
Jarod Wilson 0252aa3
 EXPORT_SYMBOL(vmalloc_node);
Jarod Wilson 0252aa3
 
Jarod Wilson 0252aa3
+/**
Jarod Wilson 0252aa3
+ * vzalloc_node - allocate memory on a specific node with zero fill
Jarod Wilson 0252aa3
+ * @size:	allocation size
Jarod Wilson 0252aa3
+ * @node:	numa node
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ * Allocate enough pages to cover @size from the page level
Jarod Wilson 0252aa3
+ * allocator and map them into contiguous kernel virtual space.
Jarod Wilson 0252aa3
+ * The memory allocated is set to zero.
Jarod Wilson 0252aa3
+ *
Jarod Wilson 0252aa3
+ * For tight control over page level allocator and protection flags
Jarod Wilson 0252aa3
+ * use __vmalloc_node() instead.
Jarod Wilson 0252aa3
+ */
Jarod Wilson 0252aa3
+void *vzalloc_node(unsigned long size, int node)
Jarod Wilson 0252aa3
+{
Jarod Wilson 0252aa3
+	return __vmalloc_node_flags(size, node,
Jarod Wilson 0252aa3
+			 GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO);
Jarod Wilson 0252aa3
+}
Jarod Wilson 0252aa3
+EXPORT_SYMBOL(vzalloc_node);
Jarod Wilson 0252aa3
+
Jarod Wilson 0252aa3
 #ifndef PAGE_KERNEL_EXEC
Jarod Wilson 0252aa3
 # define PAGE_KERNEL_EXEC PAGE_KERNEL
Jarod Wilson 0252aa3
 #endif