|
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
|