Merge branch 'x86-hash-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 hashing changes from Ingo Molnar: "Small fixes and cleanups to the librarized arch_fast_hash() methods, used by the net/openvswitch code" * 'x86-hash-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86, hash: Simplify switch, add __init annotation x86, hash: Swap arguments passed to crc32_u32() x86, hash: Fix build failure with older binutils
This commit is contained in:
commit
d9fcca40eb
2 changed files with 14 additions and 9 deletions
|
@ -152,6 +152,7 @@ cfi-sections := $(call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTI
|
||||||
|
|
||||||
# does binutils support specific instructions?
|
# does binutils support specific instructions?
|
||||||
asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1)
|
asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1)
|
||||||
|
asinstr += $(call as-instr,crc32l %eax$(comma)%eax,-DCONFIG_AS_CRC32=1)
|
||||||
avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1)
|
avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1)
|
||||||
avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)
|
avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/hash.h>
|
#include <linux/hash.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpufeature.h>
|
||||||
|
@ -39,7 +40,11 @@
|
||||||
|
|
||||||
static inline u32 crc32_u32(u32 crc, u32 val)
|
static inline u32 crc32_u32(u32 crc, u32 val)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_AS_CRC32
|
||||||
asm ("crc32l %1,%0\n" : "+r" (crc) : "rm" (val));
|
asm ("crc32l %1,%0\n" : "+r" (crc) : "rm" (val));
|
||||||
|
#else
|
||||||
|
asm (".byte 0xf2, 0x0f, 0x38, 0xf1, 0xc1" : "+a" (crc) : "c" (val));
|
||||||
|
#endif
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,19 +54,18 @@ static u32 intel_crc4_2_hash(const void *data, u32 len, u32 seed)
|
||||||
u32 i, tmp = 0;
|
u32 i, tmp = 0;
|
||||||
|
|
||||||
for (i = 0; i < len / 4; i++)
|
for (i = 0; i < len / 4; i++)
|
||||||
seed = crc32_u32(*p32++, seed);
|
seed = crc32_u32(seed, *p32++);
|
||||||
|
|
||||||
switch (3 - (len & 0x03)) {
|
switch (len & 3) {
|
||||||
case 0:
|
case 3:
|
||||||
tmp |= *((const u8 *) p32 + 2) << 16;
|
tmp |= *((const u8 *) p32 + 2) << 16;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case 1:
|
case 2:
|
||||||
tmp |= *((const u8 *) p32 + 1) << 8;
|
tmp |= *((const u8 *) p32 + 1) << 8;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case 2:
|
case 1:
|
||||||
tmp |= *((const u8 *) p32);
|
tmp |= *((const u8 *) p32);
|
||||||
seed = crc32_u32(tmp, seed);
|
seed = crc32_u32(seed, tmp);
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,12 +78,12 @@ static u32 intel_crc4_2_hash2(const u32 *data, u32 len, u32 seed)
|
||||||
u32 i;
|
u32 i;
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
seed = crc32_u32(*p32++, seed);
|
seed = crc32_u32(seed, *p32++);
|
||||||
|
|
||||||
return seed;
|
return seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_arch_fast_hash(struct fast_hash_ops *ops)
|
void __init setup_arch_fast_hash(struct fast_hash_ops *ops)
|
||||||
{
|
{
|
||||||
if (cpu_has_xmm4_2) {
|
if (cpu_has_xmm4_2) {
|
||||||
ops->hash = intel_crc4_2_hash;
|
ops->hash = intel_crc4_2_hash;
|
||||||
|
|
Loading…
Add table
Reference in a new issue