lkml.org 
[lkml]   [2022]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/19] crypto: sun8i-ss: do not allocate memory when handling hash requests
    Date
    Instead of allocate memory on each requests, it is easier to
    pre-allocate buffers.
    This made error path easier.

    Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
    ---
    drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 10 ++++++++++
    drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 15 +++------------
    drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 4 ++++
    3 files changed, 17 insertions(+), 12 deletions(-)

    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c
    index 657530578643..786b6f5cf300 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c
    @@ -486,6 +486,16 @@ static int allocate_flows(struct sun8i_ss_dev *ss)
    goto error_engine;
    }

    + /* the padding could be up to two block. */
    + ss->flows[i].pad = devm_kmalloc(ss->dev, SHA256_BLOCK_SIZE * 2,
    + GFP_KERNEL | GFP_DMA);
    + if (!ss->flows[i].pad)
    + goto error_engine;
    + ss->flows[i].result = devm_kmalloc(ss->dev, SHA256_DIGEST_SIZE,
    + GFP_KERNEL | GFP_DMA);
    + if (!ss->flows[i].result)
    + goto error_engine;
    +
    ss->flows[i].engine = crypto_engine_alloc_init(ss->dev, true);
    if (!ss->flows[i].engine) {
    dev_err(ss->dev, "Cannot allocate engine\n");
    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c
    index 49e2e947b36b..9582ac450d08 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c
    @@ -332,18 +332,11 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq)
    if (digestsize == SHA224_DIGEST_SIZE)
    digestsize = SHA256_DIGEST_SIZE;

    - /* the padding could be up to two block. */
    - pad = kzalloc(algt->alg.hash.halg.base.cra_blocksize * 2, GFP_KERNEL | GFP_DMA);
    - if (!pad)
    - return -ENOMEM;
    + result = ss->flows[rctx->flow].result;
    + pad = ss->flows[rctx->flow].pad;
    + memset(pad, 0, algt->alg.hash.halg.base.cra_blocksize * 2);
    bf = (__le32 *)pad;

    - result = kzalloc(digestsize, GFP_KERNEL | GFP_DMA);
    - if (!result) {
    - kfree(pad);
    - return -ENOMEM;
    - }
    -
    for (i = 0; i < MAX_SG; i++) {
    rctx->t_dst[i].addr = 0;
    rctx->t_dst[i].len = 0;
    @@ -439,8 +432,6 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq)

    memcpy(areq->result, result, algt->alg.hash.halg.digestsize);
    theend:
    - kfree(pad);
    - kfree(result);
    local_bh_disable();
    crypto_finalize_hash_request(engine, breq, err);
    local_bh_enable();
    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h
    index 57ada8653855..eb82ee5345ae 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h
    @@ -123,6 +123,8 @@ struct sginfo {
    * @stat_req: number of request done by this flow
    * @iv: list of IV to use for each step
    * @biv: buffer which contain the backuped IV
    + * @pad: padding buffer for hash operations
    + * @result: buffer for storing the result of hash operations
    */
    struct sun8i_ss_flow {
    struct crypto_engine *engine;
    @@ -130,6 +132,8 @@ struct sun8i_ss_flow {
    int status;
    u8 *iv[MAX_SG];
    u8 *biv;
    + void *pad;
    + void *result;
    #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG
    unsigned long stat_req;
    #endif
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-03-17 21:59    [W:4.313 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site