Message ID | 20091110092034.3d4ee9b0@nehalam |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Stephen Hemminger a écrit : > The full_name_hash function does not produce well distributed values in > the lower bits, so most code uses hash_32() to fold it. This is really > a bug introduced when name hashing was added, back in 2.5 when I added > name hashing. > > hash_32 is all that is needed since full_name_hash returns unsigned int > which is only 32 bits on 64 bit platforms. > > Also, there is no point in using hash_32 on ifindex, because the is naturally > sequential and usually well distributed. > > Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Thanks Stephen -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Tue, 10 Nov 2009 18:37:11 +0100 > Stephen Hemminger a écrit : >> The full_name_hash function does not produce well distributed values in >> the lower bits, so most code uses hash_32() to fold it. This is really >> a bug introduced when name hashing was added, back in 2.5 when I added >> name hashing. >> >> hash_32 is all that is needed since full_name_hash returns unsigned int >> which is only 32 bits on 64 bit platforms. >> >> Also, there is no point in using hash_32 on ifindex, because the is naturally >> sequential and usually well distributed. >> >> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> >> > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied, thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- a/net/core/dev.c 2009-11-09 22:19:08.731481514 -0800 +++ b/net/core/dev.c 2009-11-10 08:42:23.755003727 -0800 @@ -79,6 +79,7 @@ #include <linux/cpu.h> #include <linux/types.h> #include <linux/kernel.h> +#include <linux/hash.h> #include <linux/sched.h> #include <linux/mutex.h> #include <linux/string.h> @@ -196,7 +197,7 @@ EXPORT_SYMBOL(dev_base_lock); static inline struct hlist_head *dev_name_hash(struct net *net, const char *name) { unsigned hash = full_name_hash(name, strnlen(name, IFNAMSIZ)); - return &net->dev_name_head[hash & (NETDEV_HASHENTRIES - 1)]; + return &net->dev_name_head[hash_32(hash, NETDEV_HASHBITS)]; } static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex)
The full_name_hash function does not produce well distributed values in the lower bits, so most code uses hash_32() to fold it. This is really a bug introduced when name hashing was added, back in 2.5 when I added name hashing. hash_32 is all that is needed since full_name_hash returns unsigned int which is only 32 bits on 64 bit platforms. Also, there is no point in using hash_32 on ifindex, because the is naturally sequential and usually well distributed. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> --- Patch against net-next-2.6 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html