Commit 2a441a9a authored by Qingfang Deng's avatar Qingfang Deng Committed by Florian Westphal
Browse files

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: default avatarQingfang Deng <dqfext@gmail.com>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
parent 59ecffa3
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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 @@ static int __init nf_flow_table_module_init(void)
	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);