OSDN Git Service

netfilter: reduce size of hook entry point locations
authorFlorian Westphal <fw@strlen.de>
Sat, 2 Dec 2017 23:58:47 +0000 (00:58 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 8 Jan 2018 17:01:08 +0000 (18:01 +0100)
commitb0f38338aef2dae5ade3c16acf713737e3b15a73
treedb01bbe9ba795c8c91933624fb14206ec2c2b2cc
parent8c873e2199700c2de7dbd5eedb9d90d5f109462b
netfilter: reduce size of hook entry point locations

struct net contains:

struct nf_hook_entries __rcu *hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS];

which store the hook entry point locations for the various protocol
families and the hooks.

Using array results in compact c code when doing accesses, i.e.
  x = rcu_dereference(net->nf.hooks[pf][hook]);

but its also wasting a lot of memory, as most families are
not used.

So split the array into those families that are used, which
are only 5 (instead of 13).  In most cases, the 'pf' argument is
constant, i.e. gcc removes switch statement.

struct net before:
 /* size: 5184, cachelines: 81, members: 46 */
after:
 /* size: 4672, cachelines: 73, members: 46 */

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/linux/netfilter.h
include/net/netns/netfilter.h
net/bridge/br_netfilter_hooks.c
net/netfilter/core.c
net/netfilter/nf_queue.c