[PATCH v5 2/3] bitops: Define generic __bitrev8/16/32 for reuse

Nathan Chancellor nathan at kernel.org
Wed Apr 29 13:29:22 PDT 2026


Hi Jinjie,

On Tue, Apr 21, 2026 at 09:07:51PM +0800, Jinjie Ruan wrote:
> Define generic __bitrev8/16/32 using the implementation
> in <linux/bitrev.h>, so they can be reused in <asm/bitrev.h>,
> such as RISCV.
> 
> Reviewed-by: Yury Norov <ynorov at nvidia.com>
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>
> ---
>  include/asm-generic/bitops/__bitrev.h | 25 +++++++++++++++++++++++++
>  include/linux/bitrev.h                | 20 ++++----------------
>  2 files changed, 29 insertions(+), 16 deletions(-)
>  create mode 100644 include/asm-generic/bitops/__bitrev.h
> 
> diff --git a/include/asm-generic/bitops/__bitrev.h b/include/asm-generic/bitops/__bitrev.h
> new file mode 100644
> index 000000000000..f06af929678d
> --- /dev/null
> +++ b/include/asm-generic/bitops/__bitrev.h
> @@ -0,0 +1,25 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _ASM_GENERIC_BITOPS___BITREV_H_
> +#define _ASM_GENERIC_BITOPS___BITREV_H_
> +
> +#ifdef CONFIG_GENERIC_BITREVERSE

The dependencies of this symbol seem insufficient, as I can trigger a
build failure on next-20260429 like so:

  $ make -skj"$(nproc)" ARCH=s390 CROSS_COMPILE=s390-linux- mrproper tinyconfig fs/select.o
  In file included from include/linux/crc32.h:6,
                   from include/linux/etherdevice.h:23,
                   from include/linux/if_vlan.h:11,
                   from include/linux/filter.h:21,
                   from include/net/xdp.h:10,
                   from include/net/busy_poll.h:19,
                   from fs/select.c:33:
  include/linux/etherdevice.h: In function 'eth_hw_addr_crc':
  include/linux/bitrev.h:16:20: error: implicit declaration of function 'generic___bitrev32' [-Wimplicit-function-declaration]
     16 | #define __bitrev32 generic___bitrev32
        |                    ^~~~~~~~~~~~~~~~~~
  include/linux/bitrev.h:67:9: note: in expansion of macro '__bitrev32'
     67 |         __bitrev32(__x);                                \
        |         ^~~~~~~~~~
  include/linux/crc32.h:107:36: note: in expansion of macro 'bitrev32'
    107 | #define ether_crc(length, data)    bitrev32(crc32_le(~0, data, length))
        |                                    ^~~~~~~~
  include/linux/etherdevice.h:292:16: note: in expansion of macro 'ether_crc'
    292 |         return ether_crc(ETH_ALEN, ha->addr);
        |                ^~~~~~~~~
  make[5]: *** [scripts/Makefile.build:289: fs/select.o] Error 1
  ...

  $ scripts/config -s BITREVERSE
  undef

  $ rg BITREVERSE .config

> +#include <asm/types.h>
> +
> +extern u8 const byte_rev_table[256];
> +static __always_inline __attribute_const__ u8 generic___bitrev8(u8 byte)
> +{
> +	return byte_rev_table[byte];
> +}
> +
> +static __always_inline __attribute_const__ u16 generic___bitrev16(u16 x)
> +{
> +	return (generic___bitrev8(x & 0xff) << 8) | generic___bitrev8(x >> 8);
> +}
> +
> +static __always_inline __attribute_const__ u32 generic___bitrev32(u32 x)
> +{
> +	return (generic___bitrev16(x & 0xffff) << 16) | generic___bitrev16(x >> 16);
> +}
> +#endif /* CONFIG_GENERIC_BITREVERSE */
> +
> +#endif /* _ASM_GENERIC_BITOPS___BITREV_H_ */
> diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
> index d35b8ec1c485..11620a70e776 100644
> --- a/include/linux/bitrev.h
> +++ b/include/linux/bitrev.h
> @@ -12,22 +12,10 @@
>  #define __bitrev8 __arch_bitrev8
>  
>  #else
> -extern u8 const byte_rev_table[256];
> -static inline u8 __bitrev8(u8 byte)
> -{
> -	return byte_rev_table[byte];
> -}
> -
> -static inline u16 __bitrev16(u16 x)
> -{
> -	return (__bitrev8(x & 0xff) << 8) | __bitrev8(x >> 8);
> -}
> -
> -static inline u32 __bitrev32(u32 x)
> -{
> -	return (__bitrev16(x & 0xffff) << 16) | __bitrev16(x >> 16);
> -}
> -
> +#include <asm-generic/bitops/__bitrev.h>
> +#define __bitrev32 generic___bitrev32
> +#define __bitrev16 generic___bitrev16
> +#define __bitrev8 generic___bitrev8
>  #endif /* CONFIG_HAVE_ARCH_BITREVERSE */
>  
>  #define __bitrev8x4(x)	(__bitrev32(swab32(x)))
> -- 
> 2.34.1
> 

-- 
Cheers,
Nathan



More information about the linux-riscv mailing list