mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
netfilter: flowtable: dedicated slab for flow entry
The size of `struct flow_offload` has grown beyond 256 bytes on 64-bit kernels (currently 280 bytes) because of the `flow_offload_tunnel` member added recently. So kmalloc() allocates from the kmalloc-512 slab, causing significant memory waste per entry. Introduce a dedicated slab cache for flow entries to reduce memory footprint. Results in a reduction from 512 bytes to 320 bytes per entry on x86_64 kernels. Signed-off-by: Qingfang Deng <dqfext@gmail.com> Signed-off-by: Florian Westphal <fw@strlen.de>
This commit is contained in:
committed by
Florian Westphal
parent
59ecffa399
commit
2a441a9aac
@@ -16,6 +16,7 @@
|
||||
|
||||
static DEFINE_MUTEX(flowtable_lock);
|
||||
static LIST_HEAD(flowtables);
|
||||
static __read_mostly struct kmem_cache *flow_offload_cachep;
|
||||
|
||||
static void
|
||||
flow_offload_fill_dir(struct flow_offload *flow,
|
||||
@@ -56,7 +57,7 @@ struct flow_offload *flow_offload_alloc(struct nf_conn *ct)
|
||||
if (unlikely(nf_ct_is_dying(ct)))
|
||||
return NULL;
|
||||
|
||||
flow = kzalloc(sizeof(*flow), GFP_ATOMIC);
|
||||
flow = kmem_cache_zalloc(flow_offload_cachep, GFP_ATOMIC);
|
||||
if (!flow)
|
||||
return NULL;
|
||||
|
||||
@@ -812,9 +813,13 @@ static int __init nf_flow_table_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
flow_offload_cachep = KMEM_CACHE(flow_offload, SLAB_HWCACHE_ALIGN);
|
||||
if (!flow_offload_cachep)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = register_pernet_subsys(&nf_flow_table_net_ops);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto out_pernet;
|
||||
|
||||
ret = nf_flow_table_offload_init();
|
||||
if (ret)
|
||||
@@ -830,6 +835,8 @@ out_bpf:
|
||||
nf_flow_table_offload_exit();
|
||||
out_offload:
|
||||
unregister_pernet_subsys(&nf_flow_table_net_ops);
|
||||
out_pernet:
|
||||
kmem_cache_destroy(flow_offload_cachep);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -837,6 +844,7 @@ static void __exit nf_flow_table_module_exit(void)
|
||||
{
|
||||
nf_flow_table_offload_exit();
|
||||
unregister_pernet_subsys(&nf_flow_table_net_ops);
|
||||
kmem_cache_destroy(flow_offload_cachep);
|
||||
}
|
||||
|
||||
module_init(nf_flow_table_module_init);
|
||||
|
||||
Reference in New Issue
Block a user