diff options
author | Jay Vosburgh <jay.vosburgh@canonical.com> | 2014-11-14 14:05:06 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-11-14 16:36:25 -0500 |
commit | a77f9c5dcdf8480a93332792c336fa2bf9d31229 (patch) | |
tree | 003964de0cc772f361d254385406fa75f3fcbff2 /include/asm-generic | |
parent | 8cd4313aa775537f724486d5b7503b4d46c9f012 (diff) |
Revert "fast_hash: avoid indirect function calls"
This reverts commit e5a2c899957659cd1a9f789bc462f9c0b35f5150.
Commit e5a2c899 introduced an alternative_call, arch_fast_hash2,
that selects between __jhash2 and __intel_crc4_2_hash based on the
X86_FEATURE_XMM4_2.
Unfortunately, the alternative_call system does not appear to be
suitable for use with C functions, as register usage is not handled
properly for the called functions. The __jhash2 function in particular
clobbers registers that are not preserved when called via
alternative_call, resulting in a panic for direct callers of
arch_fast_hash2 on older CPUs lacking sse4_2. It is possible that
__intel_crc4_2_hash works merely by chance because it uses fewer
registers.
This commit was suggested as the source of the problem by Jesse
Gross <jesse@nicira.com>.
Signed-off-by: Jay Vosburgh <jay.vosburgh@canonical.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/asm-generic')
-rw-r--r-- | include/asm-generic/hash.h | 36 |
1 files changed, 2 insertions, 34 deletions
diff --git a/include/asm-generic/hash.h b/include/asm-generic/hash.h index 3c82760ff2a4..b6312843dbd9 100644 --- a/include/asm-generic/hash.h +++ b/include/asm-generic/hash.h | |||
@@ -1,41 +1,9 @@ | |||
1 | #ifndef __ASM_GENERIC_HASH_H | 1 | #ifndef __ASM_GENERIC_HASH_H |
2 | #define __ASM_GENERIC_HASH_H | 2 | #define __ASM_GENERIC_HASH_H |
3 | 3 | ||
4 | #include <linux/jhash.h> | 4 | struct fast_hash_ops; |
5 | 5 | static inline void setup_arch_fast_hash(struct fast_hash_ops *ops) | |
6 | /** | ||
7 | * arch_fast_hash - Caclulates a hash over a given buffer that can have | ||
8 | * arbitrary size. This function will eventually use an | ||
9 | * architecture-optimized hashing implementation if | ||
10 | * available, and trades off distribution for speed. | ||
11 | * | ||
12 | * @data: buffer to hash | ||
13 | * @len: length of buffer in bytes | ||
14 | * @seed: start seed | ||
15 | * | ||
16 | * Returns 32bit hash. | ||
17 | */ | ||
18 | static inline u32 arch_fast_hash(const void *data, u32 len, u32 seed) | ||
19 | { | ||
20 | return jhash(data, len, seed); | ||
21 | } | ||
22 | |||
23 | /** | ||
24 | * arch_fast_hash2 - Caclulates a hash over a given buffer that has a | ||
25 | * size that is of a multiple of 32bit words. This | ||
26 | * function will eventually use an architecture- | ||
27 | * optimized hashing implementation if available, | ||
28 | * and trades off distribution for speed. | ||
29 | * | ||
30 | * @data: buffer to hash (must be 32bit padded) | ||
31 | * @len: number of 32bit words | ||
32 | * @seed: start seed | ||
33 | * | ||
34 | * Returns 32bit hash. | ||
35 | */ | ||
36 | static inline u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed) | ||
37 | { | 6 | { |
38 | return jhash2(data, len, seed); | ||
39 | } | 7 | } |
40 | 8 | ||
41 | #endif /* __ASM_GENERIC_HASH_H */ | 9 | #endif /* __ASM_GENERIC_HASH_H */ |