diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-10-08 20:16:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-10-13 06:44:02 -0400 |
commit | f373b53b5fe67aa4a6f28f921a529cc90f88e79b (patch) | |
tree | b2cae9152aed2e30b7a39c114678b9355ab5c14f /net/dccp/proto.c | |
parent | c3faca053d0a9c877597935b434150b422dbc6fb (diff) |
tcp: replace ehash_size by ehash_mask
Storing the mask (size - 1) instead of the size allows fast path to be
a bit faster.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp/proto.c')
-rw-r--r-- | net/dccp/proto.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index a156319fd0ac..ecb203fff501 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -1060,11 +1060,12 @@ static int __init dccp_init(void) | |||
1060 | for (ehash_order = 0; (1UL << ehash_order) < goal; ehash_order++) | 1060 | for (ehash_order = 0; (1UL << ehash_order) < goal; ehash_order++) |
1061 | ; | 1061 | ; |
1062 | do { | 1062 | do { |
1063 | dccp_hashinfo.ehash_size = (1UL << ehash_order) * PAGE_SIZE / | 1063 | unsigned long hash_size = (1UL << ehash_order) * PAGE_SIZE / |
1064 | sizeof(struct inet_ehash_bucket); | 1064 | sizeof(struct inet_ehash_bucket); |
1065 | while (dccp_hashinfo.ehash_size & | 1065 | |
1066 | (dccp_hashinfo.ehash_size - 1)) | 1066 | while (hash_size & (hash_size - 1)) |
1067 | dccp_hashinfo.ehash_size--; | 1067 | hash_size--; |
1068 | dccp_hashinfo.ehash_mask = hash_size - 1; | ||
1068 | dccp_hashinfo.ehash = (struct inet_ehash_bucket *) | 1069 | dccp_hashinfo.ehash = (struct inet_ehash_bucket *) |
1069 | __get_free_pages(GFP_ATOMIC|__GFP_NOWARN, ehash_order); | 1070 | __get_free_pages(GFP_ATOMIC|__GFP_NOWARN, ehash_order); |
1070 | } while (!dccp_hashinfo.ehash && --ehash_order > 0); | 1071 | } while (!dccp_hashinfo.ehash && --ehash_order > 0); |
@@ -1074,7 +1075,7 @@ static int __init dccp_init(void) | |||
1074 | goto out_free_bind_bucket_cachep; | 1075 | goto out_free_bind_bucket_cachep; |
1075 | } | 1076 | } |
1076 | 1077 | ||
1077 | for (i = 0; i < dccp_hashinfo.ehash_size; i++) { | 1078 | for (i = 0; i <= dccp_hashinfo.ehash_mask; i++) { |
1078 | INIT_HLIST_NULLS_HEAD(&dccp_hashinfo.ehash[i].chain, i); | 1079 | INIT_HLIST_NULLS_HEAD(&dccp_hashinfo.ehash[i].chain, i); |
1079 | INIT_HLIST_NULLS_HEAD(&dccp_hashinfo.ehash[i].twchain, i); | 1080 | INIT_HLIST_NULLS_HEAD(&dccp_hashinfo.ehash[i].twchain, i); |
1080 | } | 1081 | } |
@@ -1153,7 +1154,7 @@ static void __exit dccp_fini(void) | |||
1153 | get_order(dccp_hashinfo.bhash_size * | 1154 | get_order(dccp_hashinfo.bhash_size * |
1154 | sizeof(struct inet_bind_hashbucket))); | 1155 | sizeof(struct inet_bind_hashbucket))); |
1155 | free_pages((unsigned long)dccp_hashinfo.ehash, | 1156 | free_pages((unsigned long)dccp_hashinfo.ehash, |
1156 | get_order(dccp_hashinfo.ehash_size * | 1157 | get_order((dccp_hashinfo.ehash_mask + 1) * |
1157 | sizeof(struct inet_ehash_bucket))); | 1158 | sizeof(struct inet_ehash_bucket))); |
1158 | inet_ehash_locks_free(&dccp_hashinfo); | 1159 | inet_ehash_locks_free(&dccp_hashinfo); |
1159 | kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); | 1160 | kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); |