]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/netfilter/xt_hashlimit.c
[NETFILTER]: xt_hashlimit: speedup hash_dst()
[linux-2.6-omap-h63xx.git] / net / netfilter / xt_hashlimit.c
index 951d4c829674e323308f6ba848d3da3dbe95a328..651c1d26564a76b5dbf801ad03fcf1312d088c85 100644 (file)
@@ -105,7 +105,16 @@ static inline bool dst_cmp(const struct dsthash_ent *ent,
 static u_int32_t
 hash_dst(const struct xt_hashlimit_htable *ht, const struct dsthash_dst *dst)
 {
-       return jhash(dst, sizeof(*dst), ht->rnd) % ht->cfg.size;
+       u_int32_t hash = jhash2((const u32 *)dst,
+                               sizeof(*dst)/sizeof(u32),
+                               ht->rnd);
+       /*
+        * Instead of returning hash % ht->cfg.size (implying a divide)
+        * we return the high 32 bits of the (hash * ht->cfg.size) that will
+        * give results between [0 and cfg.size-1] and same hash distribution,
+        * but using a multiply, less expensive than a divide
+        */
+       return ((u64)hash * ht->cfg.size) >> 32;
 }
 
 static struct dsthash_ent *