On Fri, 25 Oct 2024 at 21:15, Eric Biggers <ebiggers@xxxxxxxxxx> wrote: > > From: Eric Biggers <ebiggers@xxxxxxxxxx> > > Make the CRC32 library export some flags that indicate which CRC32 > functions are actually executing optimized code at runtime. Set these > correctly from the architectures that implement the CRC32 functions. > > This will be used to determine whether the crc32[c]-$arch shash > algorithms should be registered in the crypto API. btrfs could also > start using these flags instead of the hack that it currently uses where > it parses the crypto_shash_driver_name. > > Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx> > --- > arch/arm64/lib/crc32-glue.c | 15 +++++++++++++++ > arch/riscv/lib/crc32-riscv.c | 15 +++++++++++++++ > include/linux/crc32.h | 15 +++++++++++++++ > lib/crc32.c | 5 +++++ > 4 files changed, 50 insertions(+) > ... > diff --git a/include/linux/crc32.h b/include/linux/crc32.h > index 58c632533b08..bf26d454b60d 100644 > --- a/include/linux/crc32.h > +++ b/include/linux/crc32.h > @@ -35,10 +35,25 @@ static inline u32 __pure __crc32c_le(u32 crc, const u8 *p, size_t len) > if (IS_ENABLED(CONFIG_CRC32_ARCH)) > return crc32c_le_arch(crc, p, len); > return crc32c_le_base(crc, p, len); > } > > +/* > + * crc32_optimizations contains flags that indicate which CRC32 library > + * functions are using architecture-specific optimizations. Unlike > + * IS_ENABLED(CONFIG_CRC32_ARCH) it takes into account the different CRC32 > + * variants and also whether any needed CPU features are available at runtime. > + */ > +#define CRC32_LE_OPTIMIZATION BIT(0) /* crc32_le() is optimized */ > +#define CRC32_BE_OPTIMIZATION BIT(1) /* crc32_be() is optimized */ > +#define CRC32C_OPTIMIZATION BIT(2) /* __crc32c_le() is optimized */ > +#if IS_ENABLED(CONFIG_CRC32_ARCH) > +extern u32 crc32_optimizations; > +#else > +#define crc32_optimizations 0 > +#endif > + Wouldn't it be cleaner to add a new library function for this, instead of using a global variable? > /** > * crc32_le_combine - Combine two crc32 check values into one. For two > * sequences of bytes, seq1 and seq2 with lengths len1 > * and len2, crc32_le() check values were calculated > * for each, crc1 and crc2. > diff --git a/lib/crc32.c b/lib/crc32.c > index 47151624332e..194de73f30f8 100644 > --- a/lib/crc32.c > +++ b/lib/crc32.c > @@ -336,5 +336,10 @@ u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len) > { > return crc32_be_generic(crc, p, len, crc32table_be, CRC32_POLY_BE); > } > #endif > EXPORT_SYMBOL(crc32_be_base); > + > +#if IS_ENABLED(CONFIG_CRC32_ARCH) > +u32 crc32_optimizations; > +EXPORT_SYMBOL(crc32_optimizations); > +#endif > -- > 2.47.0 > >