netfilter: flowtable: fix excessive hw offload attempts after failure

If a flow cannot be offloaded, the code currently repeatedly tries again as
quickly as possible, which can significantly increase system load.
Fix this by limiting flow timeout update and hardware offload retry to once
per second.

Fixes: c07531c01d ("netfilter: flowtable: Remove redundant hw refresh bit")
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
Felix Fietkau
2022-05-09 14:26:13 +02:00
committed by Pablo Neira Ayuso
parent f3f19f939c
commit 396ef64113

View File

@@ -335,8 +335,10 @@ void flow_offload_refresh(struct nf_flowtable *flow_table,
u32 timeout; u32 timeout;
timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow); timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow);
if (READ_ONCE(flow->timeout) != timeout) if (timeout - READ_ONCE(flow->timeout) > HZ)
WRITE_ONCE(flow->timeout, timeout); WRITE_ONCE(flow->timeout, timeout);
else
return;
if (likely(!nf_flowtable_hw_offload(flow_table))) if (likely(!nf_flowtable_hw_offload(flow_table)))
return; return;