diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2014-11-04 18:23:04 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-11-05 22:01:21 -0500 |
commit | e5a2c899957659cd1a9f789bc462f9c0b35f5150 (patch) | |
tree | 4c9b8a6f89d961daf9ada9f5ee95f8b371ce3a04 /include/linux/hash.h | |
parent | 2c99cd914d4fed9160d98849c9dd38034616768e (diff) |
fast_hash: avoid indirect function calls
By default the arch_fast_hash hashing function pointers are initialized
to jhash(2). If during boot-up a CPU with SSE4.2 is detected they get
updated to the CRC32 ones. This dispatching scheme incurs a function
pointer lookup and indirect call for every hashing operation.
rhashtable as a user of arch_fast_hash e.g. stores pointers to hashing
functions in its structure, too, causing two indirect branches per
hashing operation.
Using alternative_call we can get away with one of those indirect branches.
Acked-by: Daniel Borkmann <dborkman@redhat.com>
Cc: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/hash.h')
-rw-r--r-- | include/linux/hash.h | 34 |
1 files changed, 0 insertions, 34 deletions
diff --git a/include/linux/hash.h b/include/linux/hash.h index d0494c399392..6e8fb028848c 100644 --- a/include/linux/hash.h +++ b/include/linux/hash.h | |||
@@ -84,38 +84,4 @@ static inline u32 hash32_ptr(const void *ptr) | |||
84 | return (u32)val; | 84 | return (u32)val; |
85 | } | 85 | } |
86 | 86 | ||
87 | struct fast_hash_ops { | ||
88 | u32 (*hash)(const void *data, u32 len, u32 seed); | ||
89 | u32 (*hash2)(const u32 *data, u32 len, u32 seed); | ||
90 | }; | ||
91 | |||
92 | /** | ||
93 | * arch_fast_hash - Caclulates a hash over a given buffer that can have | ||
94 | * arbitrary size. This function will eventually use an | ||
95 | * architecture-optimized hashing implementation if | ||
96 | * available, and trades off distribution for speed. | ||
97 | * | ||
98 | * @data: buffer to hash | ||
99 | * @len: length of buffer in bytes | ||
100 | * @seed: start seed | ||
101 | * | ||
102 | * Returns 32bit hash. | ||
103 | */ | ||
104 | extern u32 arch_fast_hash(const void *data, u32 len, u32 seed); | ||
105 | |||
106 | /** | ||
107 | * arch_fast_hash2 - Caclulates a hash over a given buffer that has a | ||
108 | * size that is of a multiple of 32bit words. This | ||
109 | * function will eventually use an architecture- | ||
110 | * optimized hashing implementation if available, | ||
111 | * and trades off distribution for speed. | ||
112 | * | ||
113 | * @data: buffer to hash (must be 32bit padded) | ||
114 | * @len: number of 32bit words | ||
115 | * @seed: start seed | ||
116 | * | ||
117 | * Returns 32bit hash. | ||
118 | */ | ||
119 | extern u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed); | ||
120 | |||
121 | #endif /* _LINUX_HASH_H */ | 87 | #endif /* _LINUX_HASH_H */ |