netfilter: flowtable: fix excessive hw offload attempts after failure
authorFelix Fietkau <nbd@nbd.name>
Mon, 9 May 2022 12:26:13 +0000 (14:26 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 16 May 2022 10:58:55 +0000 (12:58 +0200)
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: c07531c01d82 ("netfilter: flowtable: Remove redundant hw refresh bit")
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_flow_table_core.c

index 3db256da919bad534a5f598b6befda933edab15e..20b4a14e5d4ea0ef2f7691b323efc2284d0667b3 100644 (file)
@@ -335,8 +335,10 @@ void flow_offload_refresh(struct nf_flowtable *flow_table,
        u32 timeout;
 
        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);
+       else
+               return;
 
        if (likely(!nf_flowtable_hw_offload(flow_table)))
                return;