Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e2f82ac3fcffffca59751b65124544d11ed8be4a
Commit:     e2f82ac3fcffffca59751b65124544d11ed8be4a
Parent:     22c2d8bca212a655c120fd6617328ffa3480afad
Author:     Eric Dumazet <[EMAIL PROTECTED]>
AuthorDate: Mon Dec 17 22:45:13 2007 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 14:59:10 2008 -0800

    [NETFILTER]: xt_hashlimit: speedup hash_dst()
    
    1) Using jhash2() instead of jhash() is a litle bit faster if applicable.
    
    2) Thanks to jhash, hash value uses full 32 bits.
       Instead of returning hash % size (implying a divide)
       we return the high 32 bits of the (hash * size) that will
       give results between [0 and size-1] and same hash distribution.
    
      On most cpus, a multiply is less expensive than a divide, by an order
      of magnitude.
    
    Signed-off-by: Eric Dumazet <[EMAIL PROTECTED]>
    Signed-off-by: Patrick McHardy <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/netfilter/xt_hashlimit.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c
index 951d4c8..651c1d2 100644
--- a/net/netfilter/xt_hashlimit.c
+++ b/net/netfilter/xt_hashlimit.c
@@ -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 *
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to