Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: crc32 - don't unnecessarily register arch algorithms

Instead of registering the crc32-$arch and crc32c-$arch algorithms if
the arch-specific code was built, only register them when that code was
built *and* is not falling back to the base implementation at runtime.

This avoids confusing users like btrfs which checks the shash driver
name to determine whether it is crc32c-generic.

(It would also make sense to change btrfs to test the crc32_optimization
flags itself, so that it doesn't have to use the weird hack of parsing
the driver name. This change still makes sense either way though.)

Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20241202010844.144356-5-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>

+12 -4
+6 -2
crypto/crc32_generic.c
··· 157 157 .base.cra_init = crc32_cra_init, 158 158 }}; 159 159 160 + static int num_algs; 161 + 160 162 static int __init crc32_mod_init(void) 161 163 { 162 164 /* register the arch flavor only if it differs from the generic one */ 163 - return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH)); 165 + num_algs = 1 + ((crc32_optimizations() & CRC32_LE_OPTIMIZATION) != 0); 166 + 167 + return crypto_register_shashes(algs, num_algs); 164 168 } 165 169 166 170 static void __exit crc32_mod_fini(void) 167 171 { 168 - crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH)); 172 + crypto_unregister_shashes(algs, num_algs); 169 173 } 170 174 171 175 subsys_initcall(crc32_mod_init);
+6 -2
crypto/crc32c_generic.c
··· 197 197 .base.cra_init = crc32c_cra_init, 198 198 }}; 199 199 200 + static int num_algs; 201 + 200 202 static int __init crc32c_mod_init(void) 201 203 { 202 204 /* register the arch flavor only if it differs from the generic one */ 203 - return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH)); 205 + num_algs = 1 + ((crc32_optimizations() & CRC32C_OPTIMIZATION) != 0); 206 + 207 + return crypto_register_shashes(algs, num_algs); 204 208 } 205 209 206 210 static void __exit crc32c_mod_fini(void) 207 211 { 208 - crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH)); 212 + crypto_unregister_shashes(algs, num_algs); 209 213 } 210 214 211 215 subsys_initcall(crc32c_mod_init);