Replacing spinlocks by nx_copy_ctx on NX-AES-CTR
Subsystems (3)
PATCH 4/8 Replacing spinlocks by nx_copy_ctx on NX-AES-CTR
Replaces spinlock usage by a simple copy of the crypto context, avoiding possible bottlenecks.
Signed-off-by Leonidas Da Silva Barbosa <[email protected]>
--- drivers/crypto/nx/nx-aes-ctr.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-)
drivers/crypto/nx/nx-aes-ctr.c +12 -8
@@ -88,34 +88,38 @@ static int ctr_aes_nx_crypt(struct blkcipher_desc *desc, {struct nx_crypto_ctx *nx_ctx =crypto_blkcipher_ctx (desc->tfm);struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; -unsigned long irq_flags;unsigned int processed =0 , to_process;u32 max_sg_len;int rc; -spin_lock_irqsave (&nx_ctx->lock, irq_flags); +struct nx_crypto_ctx curr_nx_ctx; + +if (nx_copy_ctx (&curr_nx_ctx, nx_ctx)) +return -ENOMEM ; + + csbcpb = curr_nx_ctx.csbcpb; max_sg_len =min_t (u32, nx_driver.of.max_sg_len/sizeof (struct nx_sg ), - nx_ctx->ap->sglen); + curr_nx_ctx.ap->sglen); do { to_process = min_t(u64, nbytes - processed, - nx_ctx->ap->databytelen); + curr_nx_ctx.ap->databytelen); to_process = min_t(u64, to_process, NX_PAGE_SIZE * (max_sg_len - 1)); to_process = to_process & ~(AES_BLOCK_SIZE - 1); - rc = nx_build_sg_lists(nx_ctx, desc, dst, src, to_process, + rc = nx_build_sg_lists(&curr_nx_ctx, desc, dst, src, to_process, processed, csbcpb->cpb.aes_ctr.iv); if (rc) goto out; - if (!nx_ctx->op.inlen || !nx_ctx->op.outlen) { + if (!curr_nx_ctx.op.inlen || !curr_nx_ctx.op.outlen) { rc = -EINVAL; goto out; } - rc = nx_hcall_sync(nx_ctx, &nx_ctx->op, + rc = nx_hcall_sync(&curr_nx_ctx, &curr_nx_ctx.op, desc->flags & CRYPTO_TFM_REQ_MAY_SLEEP); if (rc) goto out;
@@ -129,7 +133,7 @@ static int ctr_aes_nx_crypt(struct blkcipher_desc *desc, processed += to_process; }while (processed < nbytes); out: -spin_unlock_irqrestore (&nx_ctx->lock, irq_flags); +kmem_cache_free (nx_driver.slab, curr_nx_ctx.kmem);return rc; }
Signature · 1 line
1.7.1