flow : NUMA aware hash table allocation
Subsystems (2)
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.
net/core/flow.c | 15 +++++---------- 1 files changed, 5 insertions(+), 10 deletions(-)
net/core/flow.c +5 -10
@@ -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 ;
From: Eric Dumazet <[email protected]>
Date: Tue, 01 Jan 2008 13:44:15 +0100
Quoted 7 lines
Using
__get_free_pages()has some drawbacks :1) Not NUMA aware
2) 2^X page granularity :
On arches with bigPAGE_SIZE, we waste some ram for each cpu.
Quoted 7 lines
(We currently use 1024 pointers, that is at most 8192 bytes, but
PAGE_SIZEcan 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]>
Applied, thanks Eric.
It reminds me that flow_hash_shift should at some point be dynamically sized. However, currently the flow cache isn't so heavily used and there are more important fish to fry right now.