From: Brian Behlendorf Date: Tue, 30 Sep 2014 22:07:07 +0000 (-0400) Subject: Map highbit64() to fls64() X-Git-Tag: zfs-0.8.0-rc1~152^2~209^2~21 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=87f8055a91940e6408420091e1a1601113f7912e;p=zfs Map highbit64() to fls64() The fls64() function has been available since Linux 2.6.16 and it should be used to implemented highbit64(). This allows us to provide an optimized implementation and simplify the code. Signed-off-by: Brian Behlendorf --- diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 08609b80a..fbe880836 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -30,7 +30,6 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ SPL_AC_CTL_NAME SPL_AC_VMALLOC_INFO SPL_AC_PDE_DATA - SPL_AC_FLS64 SPL_AC_SET_NORMALIZED_TIMESPEC_EXPORT SPL_AC_SET_NORMALIZED_TIMESPEC_INLINE SPL_AC_TIMESPEC_SUB @@ -993,24 +992,6 @@ AC_DEFUN([SPL_AC_CTL_NAME], [ ]) ]) -dnl # -dnl # 2.6.16 API change. -dnl # Check if 'fls64()' is available -dnl # -AC_DEFUN([SPL_AC_FLS64], - [AC_MSG_CHECKING([whether fls64() is available]) - SPL_LINUX_TRY_COMPILE([ - #include - ],[ - return fls64(0); - ],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_FLS64, 1, [fls64() is available]) - ],[ - AC_MSG_RESULT(no) - ]) -]) - dnl # dnl # 2.6.26 API change, set_normalized_timespec() is exported. dnl # diff --git a/include/linux/bitops_compat.h b/include/linux/bitops_compat.h index 9c55844ad..0a3ac16f4 100644 --- a/include/linux/bitops_compat.h +++ b/include/linux/bitops_compat.h @@ -27,17 +27,5 @@ #include -#ifndef HAVE_FLS64 - -static inline int fls64(__u64 x) -{ - __u32 h = x >> 32; - if (h) - return fls(h) + 32; - return fls(x); -} - -#endif /* HAVE_FLS64 */ - #endif /* _SPL_BITOPS_COMPAT_H */ diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h index 33e92b6d8..c56d7e12a 100644 --- a/include/sys/sysmacros.h +++ b/include/sys/sysmacros.h @@ -152,13 +152,12 @@ extern char spl_version[32]; extern unsigned long spl_hostid; /* Missing misc functions */ -extern int highbit(unsigned long i); -extern int highbit64(uint64_t i); extern uint32_t zone_get_hostid(void *zone); extern void spl_setup(void); extern void spl_cleanup(void); -#define makedevice(maj,min) makedev(maj,min) +#define highbit64(x) fls64(x) +#define makedevice(maj,min) makedev(maj,min) /* common macros */ #ifndef MIN diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 3e8f874de..1059fb3cc 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -64,68 +64,6 @@ DECLARE_WAIT_QUEUE_HEAD(spl_kallsyms_lookup_name_waitq); kallsyms_lookup_name_t spl_kallsyms_lookup_name_fn = SYMBOL_POISON; #endif -int -highbit(unsigned long i) -{ - register int h = 1; - SENTRY; - - if (i == 0) - SRETURN(0); -#if BITS_PER_LONG == 64 - if (i & 0xffffffff00000000ul) { - h += 32; i >>= 32; - } -#endif - if (i & 0xffff0000) { - h += 16; i >>= 16; - } - if (i & 0xff00) { - h += 8; i >>= 8; - } - if (i & 0xf0) { - h += 4; i >>= 4; - } - if (i & 0xc) { - h += 2; i >>= 2; - } - if (i & 0x2) { - h += 1; - } - SRETURN(h); -} -EXPORT_SYMBOL(highbit); - -int -highbit64(uint64_t i) -{ - register int h = 1; - SENTRY; - - if (i == 0) - SRETURN(0); - if (i & 0xffffffff00000000ull) { - h += 32; i >>= 32; - } - if (i & 0xffff0000) { - h += 16; i >>= 16; - } - if (i & 0xff00) { - h += 8; i >>= 8; - } - if (i & 0xf0) { - h += 4; i >>= 4; - } - if (i & 0xc) { - h += 2; i >>= 2; - } - if (i & 0x2) { - h += 1; - } - SRETURN(h); -} -EXPORT_SYMBOL(highbit64); - #if BITS_PER_LONG == 32 /* * Support 64/64 => 64 division on a 32-bit platform. While the kernel diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index 55b265696..8b52dfede 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -977,7 +977,7 @@ spl_sko_from_obj(spl_kmem_cache_t *skc, void *obj) static inline uint32_t spl_offslab_size(spl_kmem_cache_t *skc) { - return 1UL << (highbit(spl_obj_size(skc)) + 1); + return 1UL << (fls64(spl_obj_size(skc)) + 1); } /*