diff mbox series

lib/crc: make the CPU feature static keys __ro_after_init

Message ID 20250413154350.10819-1-ebiggers@kernel.org (mailing list archive)
State New
Headers show
Series lib/crc: make the CPU feature static keys __ro_after_init | expand

Commit Message

Eric Biggers April 13, 2025, 3:43 p.m. UTC
From: Eric Biggers <ebiggers@google.com>

All of the CRC library's CPU feature static_keys are initialized by
initcalls and never change afterwards, so there's no need for them to be
in the regular .data section.  Put them in .data..ro_after_init instead.

Signed-off-by: Eric Biggers <ebiggers@google.com>
---

I'm planning to take this via the crc tree.

 arch/arm/lib/crc-t10dif-glue.c       | 4 ++--
 arch/arm/lib/crc32-glue.c            | 4 ++--
 arch/arm64/lib/crc-t10dif-glue.c     | 4 ++--
 arch/loongarch/lib/crc32-loongarch.c | 2 +-
 arch/mips/lib/crc32-mips.c           | 2 +-
 arch/powerpc/lib/crc-t10dif-glue.c   | 2 +-
 arch/powerpc/lib/crc32-glue.c        | 2 +-
 arch/s390/lib/crc32-glue.c           | 2 +-
 arch/sparc/lib/crc32_glue.c          | 2 +-
 arch/x86/lib/crc-t10dif-glue.c       | 2 +-
 arch/x86/lib/crc32-glue.c            | 4 ++--
 arch/x86/lib/crc64-glue.c            | 2 +-
 12 files changed, 16 insertions(+), 16 deletions(-)


base-commit: e8c24520a1338f938774268a9bafb679ace93b76

Comments

Ard Biesheuvel April 14, 2025, 7:03 a.m. UTC | #1
On Sun, 13 Apr 2025 at 17:44, Eric Biggers <ebiggers@kernel.org> wrote:
>
> From: Eric Biggers <ebiggers@google.com>
>
> All of the CRC library's CPU feature static_keys are initialized by
> initcalls and never change afterwards, so there's no need for them to be
> in the regular .data section.  Put them in .data..ro_after_init instead.
>
> Signed-off-by: Eric Biggers <ebiggers@google.com>
> ---
>
> I'm planning to take this via the crc tree.
>
>  arch/arm/lib/crc-t10dif-glue.c       | 4 ++--
>  arch/arm/lib/crc32-glue.c            | 4 ++--
>  arch/arm64/lib/crc-t10dif-glue.c     | 4 ++--
>  arch/loongarch/lib/crc32-loongarch.c | 2 +-
>  arch/mips/lib/crc32-mips.c           | 2 +-
>  arch/powerpc/lib/crc-t10dif-glue.c   | 2 +-
>  arch/powerpc/lib/crc32-glue.c        | 2 +-
>  arch/s390/lib/crc32-glue.c           | 2 +-
>  arch/sparc/lib/crc32_glue.c          | 2 +-
>  arch/x86/lib/crc-t10dif-glue.c       | 2 +-
>  arch/x86/lib/crc32-glue.c            | 4 ++--
>  arch/x86/lib/crc64-glue.c            | 2 +-
>  12 files changed, 16 insertions(+), 16 deletions(-)
>


Acked-by: Ard Biesheuvel <ardb@kernel.org>



> diff --git a/arch/arm/lib/crc-t10dif-glue.c b/arch/arm/lib/crc-t10dif-glue.c
> index 6efad3d78284..382437094bdd 100644
> --- a/arch/arm/lib/crc-t10dif-glue.c
> +++ b/arch/arm/lib/crc-t10dif-glue.c
> @@ -14,12 +14,12 @@
>  #include <crypto/internal/simd.h>
>
>  #include <asm/neon.h>
>  #include <asm/simd.h>
>
> -static DEFINE_STATIC_KEY_FALSE(have_neon);
> -static DEFINE_STATIC_KEY_FALSE(have_pmull);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pmull);
>
>  #define CRC_T10DIF_PMULL_CHUNK_SIZE    16U
>
>  asmlinkage u16 crc_t10dif_pmull64(u16 init_crc, const u8 *buf, size_t len);
>  asmlinkage void crc_t10dif_pmull8(u16 init_crc, const u8 *buf, size_t len,
> diff --git a/arch/arm/lib/crc32-glue.c b/arch/arm/lib/crc32-glue.c
> index 4340351dbde8..7ef7db9c0de7 100644
> --- a/arch/arm/lib/crc32-glue.c
> +++ b/arch/arm/lib/crc32-glue.c
> @@ -16,12 +16,12 @@
>
>  #include <asm/hwcap.h>
>  #include <asm/neon.h>
>  #include <asm/simd.h>
>
> -static DEFINE_STATIC_KEY_FALSE(have_crc32);
> -static DEFINE_STATIC_KEY_FALSE(have_pmull);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pmull);
>
>  #define PMULL_MIN_LEN  64      /* min size of buffer for pmull functions */
>
>  asmlinkage u32 crc32_pmull_le(const u8 buf[], u32 len, u32 init_crc);
>  asmlinkage u32 crc32_armv8_le(u32 init_crc, const u8 buf[], u32 len);
> diff --git a/arch/arm64/lib/crc-t10dif-glue.c b/arch/arm64/lib/crc-t10dif-glue.c
> index bacd18f23168..99d0b5668a28 100644
> --- a/arch/arm64/lib/crc-t10dif-glue.c
> +++ b/arch/arm64/lib/crc-t10dif-glue.c
> @@ -15,12 +15,12 @@
>  #include <crypto/internal/simd.h>
>
>  #include <asm/neon.h>
>  #include <asm/simd.h>
>
> -static DEFINE_STATIC_KEY_FALSE(have_asimd);
> -static DEFINE_STATIC_KEY_FALSE(have_pmull);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_asimd);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pmull);
>
>  #define CRC_T10DIF_PMULL_CHUNK_SIZE    16U
>
>  asmlinkage void crc_t10dif_pmull_p8(u16 init_crc, const u8 *buf, size_t len,
>                                     u8 out[16]);
> diff --git a/arch/loongarch/lib/crc32-loongarch.c b/arch/loongarch/lib/crc32-loongarch.c
> index c44ee4f32557..8e6d1f517e73 100644
> --- a/arch/loongarch/lib/crc32-loongarch.c
> +++ b/arch/loongarch/lib/crc32-loongarch.c
> @@ -24,11 +24,11 @@ do {                                                        \
>  } while (0)
>
>  #define CRC32(crc, value, size)                _CRC32(crc, value, size, crc)
>  #define CRC32C(crc, value, size)       _CRC32(crc, value, size, crcc)
>
> -static DEFINE_STATIC_KEY_FALSE(have_crc32);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
>
>  u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
>  {
>         if (!static_branch_likely(&have_crc32))
>                 return crc32_le_base(crc, p, len);
> diff --git a/arch/mips/lib/crc32-mips.c b/arch/mips/lib/crc32-mips.c
> index 676a4b3e290b..84df361e7181 100644
> --- a/arch/mips/lib/crc32-mips.c
> +++ b/arch/mips/lib/crc32-mips.c
> @@ -60,11 +60,11 @@ do {                                                        \
>         _CRC32(crc, value, size, crc32)
>
>  #define CRC32C(crc, value, size) \
>         _CRC32(crc, value, size, crc32c)
>
> -static DEFINE_STATIC_KEY_FALSE(have_crc32);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
>
>  u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
>  {
>         if (!static_branch_likely(&have_crc32))
>                 return crc32_le_base(crc, p, len);
> diff --git a/arch/powerpc/lib/crc-t10dif-glue.c b/arch/powerpc/lib/crc-t10dif-glue.c
> index f411b0120cc5..ddd5c4088f50 100644
> --- a/arch/powerpc/lib/crc-t10dif-glue.c
> +++ b/arch/powerpc/lib/crc-t10dif-glue.c
> @@ -19,11 +19,11 @@
>  #define VMX_ALIGN              16
>  #define VMX_ALIGN_MASK         (VMX_ALIGN-1)
>
>  #define VECTOR_BREAKPOINT      64
>
> -static DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
>
>  u32 __crct10dif_vpmsum(u32 crc, unsigned char const *p, size_t len);
>
>  u16 crc_t10dif_arch(u16 crci, const u8 *p, size_t len)
>  {
> diff --git a/arch/powerpc/lib/crc32-glue.c b/arch/powerpc/lib/crc32-glue.c
> index dbd10f339183..42f2dd3c85dd 100644
> --- a/arch/powerpc/lib/crc32-glue.c
> +++ b/arch/powerpc/lib/crc32-glue.c
> @@ -11,11 +11,11 @@
>  #define VMX_ALIGN              16
>  #define VMX_ALIGN_MASK         (VMX_ALIGN-1)
>
>  #define VECTOR_BREAKPOINT      512
>
> -static DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
>
>  u32 __crc32c_vpmsum(u32 crc, const u8 *p, size_t len);
>
>  u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
>  {
> diff --git a/arch/s390/lib/crc32-glue.c b/arch/s390/lib/crc32-glue.c
> index 124214a27340..8f20a8e595c3 100644
> --- a/arch/s390/lib/crc32-glue.c
> +++ b/arch/s390/lib/crc32-glue.c
> @@ -16,11 +16,11 @@
>
>  #define VX_MIN_LEN             64
>  #define VX_ALIGNMENT           16L
>  #define VX_ALIGN_MASK          (VX_ALIGNMENT - 1)
>
> -static DEFINE_STATIC_KEY_FALSE(have_vxrs);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_vxrs);
>
>  /*
>   * DEFINE_CRC32_VX() - Define a CRC-32 function using the vector extension
>   *
>   * Creates a function to perform a particular CRC-32 computation. Depending
> diff --git a/arch/sparc/lib/crc32_glue.c b/arch/sparc/lib/crc32_glue.c
> index a70752c729cf..d34e7cc7e1a1 100644
> --- a/arch/sparc/lib/crc32_glue.c
> +++ b/arch/sparc/lib/crc32_glue.c
> @@ -15,11 +15,11 @@
>  #include <linux/kernel.h>
>  #include <linux/crc32.h>
>  #include <asm/pstate.h>
>  #include <asm/elf.h>
>
> -static DEFINE_STATIC_KEY_FALSE(have_crc32c_opcode);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32c_opcode);
>
>  u32 crc32_le_arch(u32 crc, const u8 *data, size_t len)
>  {
>         return crc32_le_base(crc, data, len);
>  }
> diff --git a/arch/x86/lib/crc-t10dif-glue.c b/arch/x86/lib/crc-t10dif-glue.c
> index f89c335cde3c..d073b3678edc 100644
> --- a/arch/x86/lib/crc-t10dif-glue.c
> +++ b/arch/x86/lib/crc-t10dif-glue.c
> @@ -7,11 +7,11 @@
>
>  #include <linux/crc-t10dif.h>
>  #include <linux/module.h>
>  #include "crc-pclmul-template.h"
>
> -static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
>
>  DECLARE_CRC_PCLMUL_FUNCS(crc16_msb, u16);
>
>  u16 crc_t10dif_arch(u16 crc, const u8 *p, size_t len)
>  {
> diff --git a/arch/x86/lib/crc32-glue.c b/arch/x86/lib/crc32-glue.c
> index e3f93b17ac3f..e6a6285cfca8 100644
> --- a/arch/x86/lib/crc32-glue.c
> +++ b/arch/x86/lib/crc32-glue.c
> @@ -9,12 +9,12 @@
>
>  #include <linux/crc32.h>
>  #include <linux/module.h>
>  #include "crc-pclmul-template.h"
>
> -static DEFINE_STATIC_KEY_FALSE(have_crc32);
> -static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
>
>  DECLARE_CRC_PCLMUL_FUNCS(crc32_lsb, u32);
>
>  u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
>  {
> diff --git a/arch/x86/lib/crc64-glue.c b/arch/x86/lib/crc64-glue.c
> index b0e1b719ecbf..1214ee726c16 100644
> --- a/arch/x86/lib/crc64-glue.c
> +++ b/arch/x86/lib/crc64-glue.c
> @@ -7,11 +7,11 @@
>
>  #include <linux/crc64.h>
>  #include <linux/module.h>
>  #include "crc-pclmul-template.h"
>
> -static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
> +static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
>
>  DECLARE_CRC_PCLMUL_FUNCS(crc64_msb, u64);
>  DECLARE_CRC_PCLMUL_FUNCS(crc64_lsb, u64);
>
>  u64 crc64_be_arch(u64 crc, const u8 *p, size_t len)
>
> base-commit: e8c24520a1338f938774268a9bafb679ace93b76
> --
> 2.49.0
>
Martin K. Petersen April 14, 2025, 2:03 p.m. UTC | #2
Eric,

> All of the CRC library's CPU feature static_keys are initialized by
> initcalls and never change afterwards, so there's no need for them to
> be in the regular .data section. Put them in .data..ro_after_init
> instead.

LGTM.

Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
diff mbox series

Patch

diff --git a/arch/arm/lib/crc-t10dif-glue.c b/arch/arm/lib/crc-t10dif-glue.c
index 6efad3d78284..382437094bdd 100644
--- a/arch/arm/lib/crc-t10dif-glue.c
+++ b/arch/arm/lib/crc-t10dif-glue.c
@@ -14,12 +14,12 @@ 
 #include <crypto/internal/simd.h>
 
 #include <asm/neon.h>
 #include <asm/simd.h>
 
-static DEFINE_STATIC_KEY_FALSE(have_neon);
-static DEFINE_STATIC_KEY_FALSE(have_pmull);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pmull);
 
 #define CRC_T10DIF_PMULL_CHUNK_SIZE	16U
 
 asmlinkage u16 crc_t10dif_pmull64(u16 init_crc, const u8 *buf, size_t len);
 asmlinkage void crc_t10dif_pmull8(u16 init_crc, const u8 *buf, size_t len,
diff --git a/arch/arm/lib/crc32-glue.c b/arch/arm/lib/crc32-glue.c
index 4340351dbde8..7ef7db9c0de7 100644
--- a/arch/arm/lib/crc32-glue.c
+++ b/arch/arm/lib/crc32-glue.c
@@ -16,12 +16,12 @@ 
 
 #include <asm/hwcap.h>
 #include <asm/neon.h>
 #include <asm/simd.h>
 
-static DEFINE_STATIC_KEY_FALSE(have_crc32);
-static DEFINE_STATIC_KEY_FALSE(have_pmull);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pmull);
 
 #define PMULL_MIN_LEN	64	/* min size of buffer for pmull functions */
 
 asmlinkage u32 crc32_pmull_le(const u8 buf[], u32 len, u32 init_crc);
 asmlinkage u32 crc32_armv8_le(u32 init_crc, const u8 buf[], u32 len);
diff --git a/arch/arm64/lib/crc-t10dif-glue.c b/arch/arm64/lib/crc-t10dif-glue.c
index bacd18f23168..99d0b5668a28 100644
--- a/arch/arm64/lib/crc-t10dif-glue.c
+++ b/arch/arm64/lib/crc-t10dif-glue.c
@@ -15,12 +15,12 @@ 
 #include <crypto/internal/simd.h>
 
 #include <asm/neon.h>
 #include <asm/simd.h>
 
-static DEFINE_STATIC_KEY_FALSE(have_asimd);
-static DEFINE_STATIC_KEY_FALSE(have_pmull);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_asimd);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pmull);
 
 #define CRC_T10DIF_PMULL_CHUNK_SIZE	16U
 
 asmlinkage void crc_t10dif_pmull_p8(u16 init_crc, const u8 *buf, size_t len,
 				    u8 out[16]);
diff --git a/arch/loongarch/lib/crc32-loongarch.c b/arch/loongarch/lib/crc32-loongarch.c
index c44ee4f32557..8e6d1f517e73 100644
--- a/arch/loongarch/lib/crc32-loongarch.c
+++ b/arch/loongarch/lib/crc32-loongarch.c
@@ -24,11 +24,11 @@  do {							\
 } while (0)
 
 #define CRC32(crc, value, size)		_CRC32(crc, value, size, crc)
 #define CRC32C(crc, value, size)	_CRC32(crc, value, size, crcc)
 
-static DEFINE_STATIC_KEY_FALSE(have_crc32);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
 
 u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
 {
 	if (!static_branch_likely(&have_crc32))
 		return crc32_le_base(crc, p, len);
diff --git a/arch/mips/lib/crc32-mips.c b/arch/mips/lib/crc32-mips.c
index 676a4b3e290b..84df361e7181 100644
--- a/arch/mips/lib/crc32-mips.c
+++ b/arch/mips/lib/crc32-mips.c
@@ -60,11 +60,11 @@  do {							\
 	_CRC32(crc, value, size, crc32)
 
 #define CRC32C(crc, value, size) \
 	_CRC32(crc, value, size, crc32c)
 
-static DEFINE_STATIC_KEY_FALSE(have_crc32);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
 
 u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
 {
 	if (!static_branch_likely(&have_crc32))
 		return crc32_le_base(crc, p, len);
diff --git a/arch/powerpc/lib/crc-t10dif-glue.c b/arch/powerpc/lib/crc-t10dif-glue.c
index f411b0120cc5..ddd5c4088f50 100644
--- a/arch/powerpc/lib/crc-t10dif-glue.c
+++ b/arch/powerpc/lib/crc-t10dif-glue.c
@@ -19,11 +19,11 @@ 
 #define VMX_ALIGN		16
 #define VMX_ALIGN_MASK		(VMX_ALIGN-1)
 
 #define VECTOR_BREAKPOINT	64
 
-static DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
 
 u32 __crct10dif_vpmsum(u32 crc, unsigned char const *p, size_t len);
 
 u16 crc_t10dif_arch(u16 crci, const u8 *p, size_t len)
 {
diff --git a/arch/powerpc/lib/crc32-glue.c b/arch/powerpc/lib/crc32-glue.c
index dbd10f339183..42f2dd3c85dd 100644
--- a/arch/powerpc/lib/crc32-glue.c
+++ b/arch/powerpc/lib/crc32-glue.c
@@ -11,11 +11,11 @@ 
 #define VMX_ALIGN		16
 #define VMX_ALIGN_MASK		(VMX_ALIGN-1)
 
 #define VECTOR_BREAKPOINT	512
 
-static DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_vec_crypto);
 
 u32 __crc32c_vpmsum(u32 crc, const u8 *p, size_t len);
 
 u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
 {
diff --git a/arch/s390/lib/crc32-glue.c b/arch/s390/lib/crc32-glue.c
index 124214a27340..8f20a8e595c3 100644
--- a/arch/s390/lib/crc32-glue.c
+++ b/arch/s390/lib/crc32-glue.c
@@ -16,11 +16,11 @@ 
 
 #define VX_MIN_LEN		64
 #define VX_ALIGNMENT		16L
 #define VX_ALIGN_MASK		(VX_ALIGNMENT - 1)
 
-static DEFINE_STATIC_KEY_FALSE(have_vxrs);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_vxrs);
 
 /*
  * DEFINE_CRC32_VX() - Define a CRC-32 function using the vector extension
  *
  * Creates a function to perform a particular CRC-32 computation. Depending
diff --git a/arch/sparc/lib/crc32_glue.c b/arch/sparc/lib/crc32_glue.c
index a70752c729cf..d34e7cc7e1a1 100644
--- a/arch/sparc/lib/crc32_glue.c
+++ b/arch/sparc/lib/crc32_glue.c
@@ -15,11 +15,11 @@ 
 #include <linux/kernel.h>
 #include <linux/crc32.h>
 #include <asm/pstate.h>
 #include <asm/elf.h>
 
-static DEFINE_STATIC_KEY_FALSE(have_crc32c_opcode);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32c_opcode);
 
 u32 crc32_le_arch(u32 crc, const u8 *data, size_t len)
 {
 	return crc32_le_base(crc, data, len);
 }
diff --git a/arch/x86/lib/crc-t10dif-glue.c b/arch/x86/lib/crc-t10dif-glue.c
index f89c335cde3c..d073b3678edc 100644
--- a/arch/x86/lib/crc-t10dif-glue.c
+++ b/arch/x86/lib/crc-t10dif-glue.c
@@ -7,11 +7,11 @@ 
 
 #include <linux/crc-t10dif.h>
 #include <linux/module.h>
 #include "crc-pclmul-template.h"
 
-static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
 
 DECLARE_CRC_PCLMUL_FUNCS(crc16_msb, u16);
 
 u16 crc_t10dif_arch(u16 crc, const u8 *p, size_t len)
 {
diff --git a/arch/x86/lib/crc32-glue.c b/arch/x86/lib/crc32-glue.c
index e3f93b17ac3f..e6a6285cfca8 100644
--- a/arch/x86/lib/crc32-glue.c
+++ b/arch/x86/lib/crc32-glue.c
@@ -9,12 +9,12 @@ 
 
 #include <linux/crc32.h>
 #include <linux/module.h>
 #include "crc-pclmul-template.h"
 
-static DEFINE_STATIC_KEY_FALSE(have_crc32);
-static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_crc32);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
 
 DECLARE_CRC_PCLMUL_FUNCS(crc32_lsb, u32);
 
 u32 crc32_le_arch(u32 crc, const u8 *p, size_t len)
 {
diff --git a/arch/x86/lib/crc64-glue.c b/arch/x86/lib/crc64-glue.c
index b0e1b719ecbf..1214ee726c16 100644
--- a/arch/x86/lib/crc64-glue.c
+++ b/arch/x86/lib/crc64-glue.c
@@ -7,11 +7,11 @@ 
 
 #include <linux/crc64.h>
 #include <linux/module.h>
 #include "crc-pclmul-template.h"
 
-static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
 
 DECLARE_CRC_PCLMUL_FUNCS(crc64_msb, u64);
 DECLARE_CRC_PCLMUL_FUNCS(crc64_lsb, u64);
 
 u64 crc64_be_arch(u64 crc, const u8 *p, size_t len)