Patch "crypto: inside-secure - avoid unmapping DMA memory that was not mapped" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
crypto: inside-secure - avoid unmapping DMA memory that was not mapped
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
crypto-inside-secure-avoid-unmapping-dma-memory-that-was-not-mapped.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c957f8b3e2e54b29f53ef69decc87bbc858c9b58Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Antoine=20T=C3=A9nart?= <[email protected]>
Date: Tue, 26 Dec 2017 17:21:16 +0100
Subject: crypto: inside-secure - avoid unmapping DMA memory that was not mapped
From: Antoine Tenart <[email protected]>
commit c957f8b3e2e54b29f53ef69decc87bbc858c9b58 upstream.
This patch adds a parameter in the SafeXcel ahash request structure to keep track of the number of SG entries mapped. This allows not to call dma_unmap_sg() when dma_map_sg() wasn't called in the first place. This also removes a warning when the debugging of the DMA-API is enabled in the kernel configuration: "DMA-API: device driver tries to free DMA memory it has not allocated".
--- drivers/crypto/inside-secure/safexcel_hash.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/crypto/inside-secure/safexcel_hash.c +12 -8
@@ -33,6 +33,8 @@ struct safexcel_ahash_req {bool finish;bool hmac; +int nents; +u8 state_sz;/* expected sate size, only set once */ u32 state[SHA256_DIGEST_SIZE /sizeof (u32)];
@@ -151,8 +153,10 @@ static int safexcel_handle_result(struct result_sz =crypto_ahash_digestsize (ahash);memcpy (sreq->state, areq->result, result_sz); -dma_unmap_sg (priv->dev, areq->src, -sg_nents_for_len (areq->src, areq->nbytes),DMA_TO_DEVICE ); +if (sreq->nents) { +dma_unmap_sg (priv->dev, areq->src, sreq->nents,DMA_TO_DEVICE ); + sreq->nents =0 ; + }safexcel_free_context (priv, async, sreq->state_sz);
@@ -177,7 +181,7 @@ static int safexcel_ahash_send(struct crstruct safexcel_command_desc *cdesc, *first_cdesc =NULL ;struct safexcel_result_desc *rdesc;struct scatterlist *sg; -int i, nents, queued, len, cache_len, extra, n_cdesc =0 , ret =0 ; +int i, queued, len, cache_len, extra, n_cdesc =0 , ret =0 ; queued = len = req->len - req->processed;if (queued <crypto_ahash_blocksize (ahash))
@@ -247,15 +251,15 @@ static int safexcel_ahash_send(struct cr }/* Now handle the current ahash request buffer(s) */ - nents =dma_map_sg (priv->dev, areq->src, -sg_nents_for_len (areq->src, areq->nbytes), -DMA_TO_DEVICE ); -if (!nents) { + req->nents =dma_map_sg (priv->dev, areq->src, +sg_nents_for_len (areq->src, areq->nbytes), +DMA_TO_DEVICE ); +if (!req->nents) { ret = -ENOMEM ; goto cdesc_rollback; } -for_each_sg (areq->src, sg, nents, i) { +for_each_sg (areq->src, sg, req->nents, i) {int sglen =sg_dma_len (sg);/* Do not overflow the request */
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/crypto-inside-secure-avoid-unmapping-dma-memory-that-was-not-mapped.patch queue-4.14/crypto-inside-secure-fix-hash-when-length-is-a-multiple-of-a-block.patch