On Thu, Oct 17, 2019 at 09:09:01PM +0200, Ard Biesheuvel wrote: > +void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds) > +{ > + state = PTR_ALIGN(state, CHACHA_STATE_ALIGN); > + > + if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable()) { > + hchacha_block_generic(state, stream, nrounds); > + } else { > + kernel_fpu_begin(); > + hchacha_block_ssse3(state, stream, nrounds); > + kernel_fpu_end(); > + } > +} > +EXPORT_SYMBOL(hchacha_block_arch); I generally find negative logic like the above harder to read than the other way: if (static_branch_likely(&chacha_use_simd) && crypto_simd_usable()) { kernel_fpu_begin(); hchacha_block_ssse3(state, stream, nrounds); kernel_fpu_end(); } else { hchacha_block_generic(state, stream, nrounds); } (This applies to lots of places in this patch series.) Not a big deal though. > static int __init chacha_simd_mod_init(void) > { > if (!boot_cpu_has(X86_FEATURE_SSSE3)) > - return -ENODEV; > - > -#ifdef CONFIG_AS_AVX2 > - chacha_use_avx2 = boot_cpu_has(X86_FEATURE_AVX) && > - boot_cpu_has(X86_FEATURE_AVX2) && > - cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL); > -#ifdef CONFIG_AS_AVX512 > - chacha_use_avx512vl = chacha_use_avx2 && > - boot_cpu_has(X86_FEATURE_AVX512VL) && > - boot_cpu_has(X86_FEATURE_AVX512BW); /* kmovq */ > -#endif > -#endif > + return 0; > + > + static_branch_enable(&chacha_use_simd); > + > + if (IS_ENABLED(CONFIG_AS_AVX2) && > + boot_cpu_has(X86_FEATURE_AVX) && > + boot_cpu_has(X86_FEATURE_AVX2) && > + cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) { > + static_branch_enable(&chacha_use_avx2); > + > + if (IS_ENABLED(CONFIG_AS_AVX512) && > + boot_cpu_has(X86_FEATURE_AVX512VL) && > + boot_cpu_has(X86_FEATURE_AVX512BW)) /* kmovq */ > + static_branch_enable(&chacha_use_avx512vl); > + } > return crypto_register_skciphers(algs, ARRAY_SIZE(algs)); > } > This patch is missing the corresponding change to chacha_simd_mod_fini(), to skip unregistering the skcipher algorithms if they weren't registered. - Eric