diff options
author | Matthew Ahrens <[email protected]> | 2020-03-27 09:11:22 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2020-03-27 09:11:22 -0700 |
commit | 3f38797338f2e4b16e8e0065e21f1bca6ef59784 (patch) | |
tree | f4f5f48791c5961bb1b8896b66e535020375e973 /module/zcommon | |
parent | ef3331e703a8fa988bc09129f6f8d8f7c4c4082f (diff) |
Compile cityhash code into libzfs
Make the cityhash code compile into libzfs, in preparation for the new
"zstream" command.
Reviewed-by: Paul Dagnelie <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Matthew Ahrens <[email protected]>
Closes #10152
Diffstat (limited to 'module/zcommon')
-rw-r--r-- | module/zcommon/Makefile.in | 1 | ||||
-rw-r--r-- | module/zcommon/cityhash.c | 67 |
2 files changed, 68 insertions, 0 deletions
diff --git a/module/zcommon/Makefile.in b/module/zcommon/Makefile.in index b2e34f2e9..01e0692eb 100644 --- a/module/zcommon/Makefile.in +++ b/module/zcommon/Makefile.in @@ -11,6 +11,7 @@ ccflags-y := $(ZFS_MODULE_CFLAGS) $(ZFS_MODULE_CPPFLAGS) # Suppress unused-value warnings in sparc64 architecture headers ccflags-$(CONFIG_SPARC64) += -Wno-unused-value +$(MODULE)-objs += cityhash.o $(MODULE)-objs += zfeature_common.o $(MODULE)-objs += zfs_comutil.o $(MODULE)-objs += zfs_deleg.o diff --git a/module/zcommon/cityhash.c b/module/zcommon/cityhash.c new file mode 100644 index 000000000..413a96df2 --- /dev/null +++ b/module/zcommon/cityhash.c @@ -0,0 +1,67 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + * Copyright (c) 2017 by Delphix. All rights reserved. + */ + +#include <cityhash.h> + +#define HASH_K1 0xb492b66fbe98f273ULL +#define HASH_K2 0x9ae16a3b2f90404fULL + +/* + * Bitwise right rotate. Normally this will compile to a single + * instruction. + */ +static inline uint64_t +rotate(uint64_t val, int shift) +{ + // Avoid shifting by 64: doing so yields an undefined result. + return (shift == 0 ? val : (val >> shift) | (val << (64 - shift))); +} + +static inline uint64_t +cityhash_helper(uint64_t u, uint64_t v, uint64_t mul) +{ + uint64_t a = (u ^ v) * mul; + a ^= (a >> 47); + uint64_t b = (v ^ a) * mul; + b ^= (b >> 47); + b *= mul; + return (b); +} + +uint64_t +cityhash4(uint64_t w1, uint64_t w2, uint64_t w3, uint64_t w4) +{ + uint64_t mul = HASH_K2 + 64; + uint64_t a = w1 * HASH_K1; + uint64_t b = w2; + uint64_t c = w4 * mul; + uint64_t d = w3 * HASH_K2; + return (cityhash_helper(rotate(a + b, 43) + rotate(c, 30) + d, + a + rotate(b + HASH_K2, 18) + c, mul)); + +} + +#if defined(_KERNEL) +EXPORT_SYMBOL(cityhash4); +#endif |