From: Ard Biesheuvel Subject: [RFC PATCH 6/9] crypto: crc-t10dif/arm - move PMULL based code into core library Date: Fri, 5 Oct 2018 10:13:30 +0200 Message-ID: <20181005081333.15018-7-ard.biesheuvel@linaro.org> References: <20181005081333.15018-1-ard.biesheuvel@linaro.org> Cc: Ard Biesheuvel , "Jason A . Donenfeld" , Eric Biggers , Samuel Neves , Andy Lutomirski , Arnd Bergmann , Herbert Xu , "David S. Miller" , Catalin Marinas , Will Deacon , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Thomas Gleixner , Ingo Molnar , Kees Cook , "Martin K. Petersen" , Greg Kroah-Hartman , Andrew Morton To: linux-kernel@vger.kernel.org Return-path: In-Reply-To: <20181005081333.15018-1-ard.biesheuvel@linaro.org> Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-crypto.vger.kernel.org Move the PMULL based routines out of the crypto API into the core CRC-T10DIF library. Signed-off-by: Ard Biesheuvel --- arch/arm/crypto/crct10dif-ce-glue.c | 78 ++++++-------------- 1 file changed, 22 insertions(+), 56 deletions(-) diff --git a/arch/arm/crypto/crct10dif-ce-glue.c b/arch/arm/crypto/crct10dif-ce-glue.c index d428355cf38d..2020d9c29ff1 100644 --- a/arch/arm/crypto/crct10dif-ce-glue.c +++ b/arch/arm/crypto/crct10dif-ce-glue.c @@ -10,12 +10,11 @@ #include #include +#include #include #include #include -#include - #include #include @@ -23,74 +22,42 @@ asmlinkage u16 crc_t10dif_pmull(u16 init_crc, const u8 buf[], u32 len); -static int crct10dif_init(struct shash_desc *desc) +static __u16 crct10dif_update_arm(__u16 crc, const u8 *data, unsigned int length) { - u16 *crc = shash_desc_ctx(desc); - - *crc = 0; - return 0; -} - -static int crct10dif_update(struct shash_desc *desc, const u8 *data, - unsigned int length) -{ - u16 *crc = shash_desc_ctx(desc); unsigned int l; - if (!may_use_simd()) { - *crc = crc_t10dif_generic(*crc, data, length); - } else { - if (unlikely((u32)data % CRC_T10DIF_PMULL_CHUNK_SIZE)) { - l = min_t(u32, length, CRC_T10DIF_PMULL_CHUNK_SIZE - - ((u32)data % CRC_T10DIF_PMULL_CHUNK_SIZE)); + if (!may_use_simd()) + return crc_t10dif_generic(crc, data, length); - *crc = crc_t10dif_generic(*crc, data, l); + if (unlikely((u32)data % CRC_T10DIF_PMULL_CHUNK_SIZE)) { + l = min_t(u32, length, CRC_T10DIF_PMULL_CHUNK_SIZE - + ((u32)data % CRC_T10DIF_PMULL_CHUNK_SIZE)); - length -= l; - data += l; - } - if (length > 0) { - kernel_neon_begin(); - *crc = crc_t10dif_pmull(*crc, data, length); - kernel_neon_end(); - } - } - return 0; -} + crc = crc_t10dif_generic(crc, data, l); -static int crct10dif_final(struct shash_desc *desc, u8 *out) -{ - u16 *crc = shash_desc_ctx(desc); - - *(u16 *)out = *crc; - return 0; + length -= l; + data += l; + } + if (length > 0) { + kernel_neon_begin(); + crc = crc_t10dif_pmull(crc, data, length); + kernel_neon_end(); + } + return crc; } -static struct shash_alg crc_t10dif_alg = { - .digestsize = CRC_T10DIF_DIGEST_SIZE, - .init = crct10dif_init, - .update = crct10dif_update, - .final = crct10dif_final, - .descsize = CRC_T10DIF_DIGEST_SIZE, - - .base.cra_name = "crct10dif", - .base.cra_driver_name = "crct10dif-arm-ce", - .base.cra_priority = 200, - .base.cra_blocksize = CRC_T10DIF_BLOCK_SIZE, - .base.cra_module = THIS_MODULE, -}; - static int __init crc_t10dif_mod_init(void) { - if (!(elf_hwcap2 & HWCAP2_PMULL)) - return -ENODEV; + SET_FFP(crc_t10dif_update_arch, crct10dif_update_arm); - return crypto_register_shash(&crc_t10dif_alg); + return 0; } static void __exit crc_t10dif_mod_exit(void) { - crypto_unregister_shash(&crc_t10dif_alg); + RESET_FFP(crc_t10dif_update_arch); + /* wait for all users to switch back to the old version */ + synchronize_rcu(); } module_init(crc_t10dif_mod_init); @@ -98,4 +65,3 @@ module_exit(crc_t10dif_mod_exit); MODULE_AUTHOR("Ard Biesheuvel "); MODULE_LICENSE("GPL v2"); -MODULE_ALIAS_CRYPTO("crct10dif"); -- 2.11.0