ramips: add two-way hashing scheme for MT7621
authorHsiuWen Yen <y.hsiuwen@gmail.com>
Mon, 7 Jan 2019 08:29:35 +0000 (16:29 +0800)
committerJohn Crispin <john@phrozen.org>
Mon, 7 Jan 2019 14:40:51 +0000 (15:40 +0100)
Sometimes the tuples might be hashed to the same FOE entry.
When this hash collision problem occurs, some of the
connections will not be bound and consequently the CPU
idle rate cannot reach 100%. Therefore, two-way hashing
is adopted to alleviate this problem.

Signed-off-by: HsiuWen Yen <y.hsiuwen@gmail.com>
target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_offload.c

index 3001c081f7c48989773301342306c2c88e23b9ff..d0d0790ad9c8c24f0a6a5b26a5e7280699f233df 100644 (file)
@@ -118,6 +118,13 @@ mtk_foe_set_mac(struct mtk_foe_entry *entry, u8 *smac, u8 *dmac)
        entry->ipv4_hnapt.smac_lo = swab16(*((u16*) &smac[4]));
 }
 
+static int
+mtk_check_hashcollision(struct mtk_eth *eth, u32 hash)
+{
+        struct mtk_foe_entry entry = ((struct mtk_foe_entry *)eth->foe_table)[hash];
+        return (entry.bfib1.state != BIND)? 0:1;
+}
+
 static void
 mtk_foe_write(struct mtk_eth *eth, u32 hash,
              struct mtk_foe_entry *entry)
@@ -173,6 +180,10 @@ int mtk_flow_offload(struct mtk_eth *eth,
                goto write;
        }
 
+        if(mtk_check_hashcollision(eth, ohash))       // Two-way hash: when hash collision occurs, the hash value will be shifted to the next position.
+                ohash += 1;
+        if(mtk_check_hashcollision(eth, rhash))
+                rhash += 1;
        mtk_foe_set_mac(&orig, dest->eth_src, dest->eth_dest);
        mtk_foe_set_mac(&reply, src->eth_src, src->eth_dest);