Messages in this thread Patch in this message | | | Date | Thu, 22 Sep 2005 14:11:26 +0200 | From | Eric Dumazet <> | Subject | Re: [PATCH 0/3] netfilter : 3 patches to boost ip_tables performance |
| |
Christoph Lameter a écrit : > On Wed, 21 Sep 2005, David S. Miller wrote: > > >>From: Christoph Lameter <clameter@engr.sgi.com> >>Date: Wed, 21 Sep 2005 15:43:29 -0700 (PDT) >> >> >>>Maybe we better introduce vmalloc_node() instead of improvising this for >>>several subsystems? The e1000 driver has similar issues. >> >>I agree. > > > I did an implementation in June. > > See http://marc.theaimsgroup.com/?l=linux-mm&m=111766643127530&w=2 > > Not sure if this will fit the bill. Never really tested it.
Maybe this simpler patch has more chances to be accepted ?
Thank you
[NUMA]
- Adds a vmalloc_node() function : A simple wrapper around vmalloc() to allocate memory from a preferred node.
This NUMA aware variant will be used by ip_tables and various network drivers.
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> --- linux-2.6.14-rc2/include/linux/vmalloc.h 2005-09-20 05:00:41.000000000 +0200 +++ linux-2.6.14-rc2-ed/include/linux/vmalloc.h 2005-09-22 11:34:55.000000000 +0200 @@ -1,6 +1,7 @@ #ifndef _LINUX_VMALLOC_H #define _LINUX_VMALLOC_H +#include <linux/config.h> /* vmalloc_node() needs CONFIG_ options */ #include <linux/spinlock.h> #include <asm/page.h> /* pgprot_t */ @@ -32,6 +33,14 @@ * Highlevel APIs for driver use */ extern void *vmalloc(unsigned long size); +#ifdef CONFIG_NUMA +extern void *vmalloc_node(unsigned long size, int node); +#else +static inline void *vmalloc_node(unsigned long size, int node) +{ + return vmalloc(size); +} +#endif extern void *vmalloc_exec(unsigned long size); extern void *vmalloc_32(unsigned long size); extern void *__vmalloc(unsigned long size, unsigned int __nocast gfp_mask, pgprot_t prot); --- linux-2.6.14-rc2/mm/vmalloc.c 2005-09-20 05:00:41.000000000 +0200 +++ linux-2.6.14-rc2-ed/mm/vmalloc.c 2005-09-22 11:55:19.000000000 +0200 @@ -19,6 +19,9 @@ #include <asm/uaccess.h> #include <asm/tlbflush.h> +#ifdef CONFIG_NUMA +#include <linux/mempolicy.h> +#endif DEFINE_RWLOCK(vmlist_lock); struct vm_struct *vmlist; @@ -471,7 +474,7 @@ * Allocate enough pages to cover @size from the page level * allocator and map them into contiguous kernel virtual space. * - * For tight cotrol over page level allocator and protection flags + * For tight control over page level allocator and protection flags * use __vmalloc() instead. */ void *vmalloc(unsigned long size) @@ -481,6 +484,40 @@ EXPORT_SYMBOL(vmalloc); +#ifdef CONFIG_NUMA +/** + * vmalloc_node - allocate virtually contiguous memory + * + * @size: allocation size + * @node: preferred node + * + * This vmalloc variant try to allocate memory from a preferred node. + */ +void *vmalloc_node(unsigned long size, int node) +{ + void *result; + struct mempolicy *oldpol = current->mempolicy; + mm_segment_t oldfs = get_fs(); + DECLARE_BITMAP(prefnode, MAX_NUMNODES); + + mpol_get(oldpol); + bitmap_zero(prefnode, MAX_NUMNODES); + set_bit(node, prefnode); + + set_fs(KERNEL_DS); + sys_set_mempolicy(MPOL_PREFERRED, prefnode, MAX_NUMNODES); + set_fs(oldfs); + + result = vmalloc(size); + + mpol_free(current->mempolicy); + current->mempolicy = oldpol; + return result; +} + +EXPORT_SYMBOL(vmalloc_node); +#endif + #ifndef PAGE_KERNEL_EXEC # define PAGE_KERNEL_EXEC PAGE_KERNEL #endif | |