lkml.org 
[lkml]   [2018]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 6/9] crypto: crc-t10dif/arm - move PMULL based code into core library
    Date
    Move the PMULL based routines out of the crypto API into the core
    CRC-T10DIF library.

    Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    ---
    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 <linux/crc-t10dif.h>
    #include <linux/init.h>
    +#include <linux/ffp.h>
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/string.h>

    -#include <crypto/internal/hash.h>
    -
    #include <asm/neon.h>
    #include <asm/simd.h>

    @@ -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 <ard.biesheuvel@linaro.org>");
    MODULE_LICENSE("GPL v2");
    -MODULE_ALIAS_CRYPTO("crct10dif");
    --
    2.11.0
    \
     
     \ /
      Last update: 2018-10-05 10:14    [W:3.973 / U:0.376 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site