]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
riscv: checksum: Use riscv_has_extension_likely
authorVivian Wang <wangruikang@iscas.ac.cn>
Tue, 18 Nov 2025 04:19:21 +0000 (21:19 -0700)
committerPaul Walmsley <pjw@kernel.org>
Wed, 19 Nov 2025 16:19:27 +0000 (09:19 -0700)
Use riscv_has_extension_likely() to check for RISCV_ISA_EXT_ZBB,
replacing the use of asm goto with ALTERNATIVE.

The "likely" variant is used to match the behavior of the original
implementation using ALTERNATIVE("j %l[no_zbb]", "nop", ...).

While we're at it, also remove bogus comment about Zbb being likely
available. We have to choose between "likely" and "unlikely" due to
limitations of the asm goto feature, but that does not mean we should
put a bad comment on why we pick "likely" over "unlikely".

Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
Link: https://patch.msgid.link/20251020-riscv-altn-helper-wip-v4-2-ef941c87669a@iscas.ac.cn
Signed-off-by: Paul Walmsley <pjw@kernel.org>
arch/riscv/include/asm/checksum.h
arch/riscv/lib/csum.c

index da378856f1d590e22271b90e803c7e55e8dd22e3..945cce34be921d8e2ec30d458ea0e30bc27d9d4a 100644 (file)
@@ -49,16 +49,11 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
         * ZBB only saves three instructions on 32-bit and five on 64-bit so not
         * worth checking if supported without Alternatives.
         */
-       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB)) {
+       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
+           IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&
+           riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) {
                unsigned long fold_temp;
 
-               asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
-                                             RISCV_ISA_EXT_ZBB, 1)
-                   :
-                   :
-                   :
-                   : no_zbb);
-
                if (IS_ENABLED(CONFIG_32BIT)) {
                        asm(".option push                               \n\
                        .option arch,+zbb                               \n\
@@ -81,7 +76,7 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
                }
                return (__force __sum16)(csum >> 16);
        }
-no_zbb:
+
 #ifndef CONFIG_32BIT
        csum += ror64(csum, 32);
        csum >>= 32;
index 9408f50ca59a8901f7cfbcf3297d1492172c6ea2..75bd0abffd6312790f8a5064117d156e8f55185c 100644 (file)
@@ -40,20 +40,11 @@ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
        uproto = (__force unsigned int)htonl(proto);
        sum += uproto;
 
-       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB)) {
+       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
+           IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&
+           riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) {
                unsigned long fold_temp;
 
-               /*
-                * Zbb is likely available when the kernel is compiled with Zbb
-                * support, so nop when Zbb is available and jump when Zbb is
-                * not available.
-                */
-               asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
-                                             RISCV_ISA_EXT_ZBB, 1)
-                                 :
-                                 :
-                                 :
-                                 : no_zbb);
                asm(".option push                                       \n\
                .option arch,+zbb                                       \n\
                        rori    %[fold_temp], %[sum], 32                \n\
@@ -66,7 +57,7 @@ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
                : [sum] "+r" (sum), [fold_temp] "=&r" (fold_temp));
                return (__force __sum16)(sum >> 16);
        }
-no_zbb:
+
        sum += ror64(sum, 32);
        sum >>= 32;
        return csum_fold((__force __wsum)sum);
@@ -152,21 +143,11 @@ do_csum_with_alignment(const unsigned char *buff, int len)
        csum = do_csum_common(ptr, end, data);
 
 #ifdef CC_HAS_ASM_GOTO_TIED_OUTPUT
-       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB)) {
+       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
+           IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&
+           riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) {
                unsigned long fold_temp;
 
-               /*
-                * Zbb is likely available when the kernel is compiled with Zbb
-                * support, so nop when Zbb is available and jump when Zbb is
-                * not available.
-                */
-               asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
-                                             RISCV_ISA_EXT_ZBB, 1)
-                                 :
-                                 :
-                                 :
-                                 : no_zbb);
-
 #ifdef CONFIG_32BIT
                asm_goto_output(".option push                   \n\
                .option arch,+zbb                               \n\
@@ -204,7 +185,7 @@ do_csum_with_alignment(const unsigned char *buff, int len)
 end:
                return csum >> 16;
        }
-no_zbb:
+
 #endif /* CC_HAS_ASM_GOTO_TIED_OUTPUT */
 #ifndef CONFIG_32BIT
        csum += ror64(csum, 32);
@@ -234,21 +215,11 @@ do_csum_no_alignment(const unsigned char *buff, int len)
        end = (const unsigned long *)(buff + len);
        csum = do_csum_common(ptr, end, data);
 
-       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB)) {
+       if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
+           IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&
+           riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) {
                unsigned long fold_temp;
 
-               /*
-                * Zbb is likely available when the kernel is compiled with Zbb
-                * support, so nop when Zbb is available and jump when Zbb is
-                * not available.
-                */
-               asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
-                                             RISCV_ISA_EXT_ZBB, 1)
-                                 :
-                                 :
-                                 :
-                                 : no_zbb);
-
 #ifdef CONFIG_32BIT
                asm (".option push                              \n\
                .option arch,+zbb                               \n\
@@ -274,7 +245,7 @@ do_csum_no_alignment(const unsigned char *buff, int len)
 #endif /* !CONFIG_32BIT */
                return csum >> 16;
        }
-no_zbb:
+
 #ifndef CONFIG_32BIT
        csum += ror64(csum, 32);
        csum >>= 32;