Using __get_free_pages() has some drawbacks : 1) Not NUMA aware
2) 2^X page granularity : On arches with big PAGE_SIZE, we waste some ram for each cpu. (We currently use 1024 pointers, that is at most 8192 bytes, but PAGE_SIZE can be 65536 for example : With say 64 possible cpus, thats about 56*64 Kbytes that are wasted) Using kmalloc_node() can help to solve these two points. Signed-off-by: Eric Dumazet <[EMAIL PROTECTED]> net/core/flow.c | 15 +++++---------- 1 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/net/core/flow.c b/net/core/flow.c index a618f89..bcbbe2d 100644 --- a/net/core/flow.c +++ b/net/core/flow.c @@ -311,18 +311,13 @@ void flow_cache_flush(void) static void __devinit flow_cache_cpu_prepare(int cpu) { struct tasklet_struct *tasklet; - unsigned long order; - for (order = 0; - (PAGE_SIZE << order) < - (sizeof(struct flow_cache_entry *)*flow_hash_size); - order++) - /* NOTHING */; - - flow_table(cpu) = (struct flow_cache_entry **) - __get_free_pages(GFP_KERNEL|__GFP_ZERO, order); + flow_table(cpu) = kmalloc_node( + sizeof(struct flow_cache_entry *) * flow_hash_size, + GFP_KERNEL | __GFP_ZERO, + cpu_to_node(cpu)); if (!flow_table(cpu)) - panic("NET: failed to allocate flow cache order %lu\n", order); + panic("NET: failed to allocate flow cache for cpu %d\n", cpu); flow_hash_rnd_recalc(cpu) = 1; flow_count(cpu) = 0;