From: Tim Chase Date: Sun, 27 Apr 2014 01:56:03 +0000 (-0500) Subject: Add functions and macros as used upstream. X-Git-Tag: spl-0.7.12~232 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=7f23e0010977ffa492d6df57aee0c97ce8e74278;p=mirror_spl.git Add functions and macros as used upstream. Added highbit64() and howmany() which are used in recent upstream code. Both highbit() and highbit64() should at some point be re-factored to use the optimized fls() and fls64() functions. Signed-off-by: Brian Behlendorf Signed-off-by: Prakash Surya Signed-off-by: Tim Chase Closes #363 --- diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h index e73c7fd..565fc56 100644 --- a/include/sys/sysmacros.h +++ b/include/sys/sysmacros.h @@ -150,6 +150,7 @@ 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); @@ -172,6 +173,9 @@ extern void spl_cleanup(void); #ifndef roundup #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) #endif +#ifndef howmany +#define howmany(x, y) (((x) + ((y) - 1)) / (y)) +#endif /* * Compatibility macros/typedefs needed for Solaris -> Linux port diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 4f0842b..6cb73dd 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -97,6 +97,36 @@ highbit(unsigned long i) } 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