Skip to content

Commit d4d89e6

Browse files
Florian Westphalummakynes
authored andcommitted
netfilter: nf_tables: don't store address of last rule on jump
Walk the rule headers until the trailer one (last_bit flag set) instead of stopping at last_rule address. This avoids the need to store the address when jumping to another chain. This cuts size of jumpstack array by one third, on 64bit from 384 to 256 bytes. Still, stack usage is still quite large: scripts/stackusage: nf_tables_core.c:258 nft_do_chain 496 static Next patch will also remove chain pointer. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
1 parent e38fbfa commit d4d89e6

File tree

1 file changed

+2
-6
lines changed

1 file changed

+2
-6
lines changed

net/netfilter/nf_tables_core.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,6 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain,
205205
struct nft_jumpstack {
206206
const struct nft_chain *chain;
207207
const struct nft_rule_dp *rule;
208-
const struct nft_rule_dp *last_rule;
209208
};
210209

211210
static void expr_call_ops_eval(const struct nft_expr *expr,
@@ -259,9 +258,9 @@ unsigned int
259258
nft_do_chain(struct nft_pktinfo *pkt, void *priv)
260259
{
261260
const struct nft_chain *chain = priv, *basechain = chain;
262-
const struct nft_rule_dp *rule, *last_rule;
263261
const struct net *net = nft_net(pkt);
264262
const struct nft_expr *expr, *last;
263+
const struct nft_rule_dp *rule;
265264
struct nft_regs regs = {};
266265
unsigned int stackptr = 0;
267266
struct nft_jumpstack jumpstack[NFT_JUMP_STACK_SIZE];
@@ -279,10 +278,9 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)
279278
blob = rcu_dereference(chain->blob_gen_0);
280279

281280
rule = (struct nft_rule_dp *)blob->data;
282-
last_rule = (void *)blob->data + blob->size;
283281
next_rule:
284282
regs.verdict.code = NFT_CONTINUE;
285-
for (; rule < last_rule; rule = nft_rule_next(rule)) {
283+
for (; !rule->is_last ; rule = nft_rule_next(rule)) {
286284
nft_rule_dp_for_each_expr(expr, last, rule) {
287285
if (expr->ops == &nft_cmp_fast_ops)
288286
nft_cmp_fast_eval(expr, &regs);
@@ -327,7 +325,6 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)
327325
return NF_DROP;
328326
jumpstack[stackptr].chain = chain;
329327
jumpstack[stackptr].rule = nft_rule_next(rule);
330-
jumpstack[stackptr].last_rule = last_rule;
331328
stackptr++;
332329
fallthrough;
333330
case NFT_GOTO:
@@ -344,7 +341,6 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)
344341
stackptr--;
345342
chain = jumpstack[stackptr].chain;
346343
rule = jumpstack[stackptr].rule;
347-
last_rule = jumpstack[stackptr].last_rule;
348344
goto next_rule;
349345
}
350346

0 commit comments

Comments
 (0)