crypto: inside_secure - Avoid dma map if size is zero
authorPeter Harliman Liem <pliem@maxlinear.com>
Tue, 13 Sep 2022 08:03:47 +0000 (16:03 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 24 Sep 2022 08:14:42 +0000 (16:14 +0800)
From commit d03c54419274 ("dma-mapping: disallow .map_sg
operations from returning zero on error"), dma_map_sg()
produces warning if size is 0. This results in visible
warnings if crypto length is zero.
To avoid that, we avoid calling dma_map_sg if size is zero.

Signed-off-by: Peter Harliman Liem <pliem@maxlinear.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/inside-secure/safexcel_cipher.c

index d68ef16..5a222c2 100644 (file)
@@ -642,10 +642,16 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin
        safexcel_complete(priv, ring);
 
        if (src == dst) {
-               dma_unmap_sg(priv->dev, src, sreq->nr_src, DMA_BIDIRECTIONAL);
+               if (sreq->nr_src > 0)
+                       dma_unmap_sg(priv->dev, src, sreq->nr_src,
+                                    DMA_BIDIRECTIONAL);
        } else {
-               dma_unmap_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE);
-               dma_unmap_sg(priv->dev, dst, sreq->nr_dst, DMA_FROM_DEVICE);
+               if (sreq->nr_src > 0)
+                       dma_unmap_sg(priv->dev, src, sreq->nr_src,
+                                    DMA_TO_DEVICE);
+               if (sreq->nr_dst > 0)
+                       dma_unmap_sg(priv->dev, dst, sreq->nr_dst,
+                                    DMA_FROM_DEVICE);
        }
 
        /*
@@ -737,23 +743,29 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring,
                                max(totlen_src, totlen_dst));
                        return -EINVAL;
                }
-               dma_map_sg(priv->dev, src, sreq->nr_src, DMA_BIDIRECTIONAL);
+               if (sreq->nr_src > 0)
+                       dma_map_sg(priv->dev, src, sreq->nr_src,
+                                  DMA_BIDIRECTIONAL);
        } else {
                if (unlikely(totlen_src && (sreq->nr_src <= 0))) {
                        dev_err(priv->dev, "Source buffer not large enough (need %d bytes)!",
                                totlen_src);
                        return -EINVAL;
                }
-               dma_map_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE);
+
+               if (sreq->nr_src > 0)
+                       dma_map_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE);
 
                if (unlikely(totlen_dst && (sreq->nr_dst <= 0))) {
                        dev_err(priv->dev, "Dest buffer not large enough (need %d bytes)!",
                                totlen_dst);
-                       dma_unmap_sg(priv->dev, src, sreq->nr_src,
-                                    DMA_TO_DEVICE);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto unmap;
                }
-               dma_map_sg(priv->dev, dst, sreq->nr_dst, DMA_FROM_DEVICE);
+
+               if (sreq->nr_dst > 0)
+                       dma_map_sg(priv->dev, dst, sreq->nr_dst,
+                                  DMA_FROM_DEVICE);
        }
 
        memcpy(ctx->base.ctxr->data, ctx->key, ctx->key_len);
@@ -883,12 +895,18 @@ rdesc_rollback:
 cdesc_rollback:
        for (i = 0; i < n_cdesc; i++)
                safexcel_ring_rollback_wptr(priv, &priv->ring[ring].cdr);
-
+unmap:
        if (src == dst) {
-               dma_unmap_sg(priv->dev, src, sreq->nr_src, DMA_BIDIRECTIONAL);
+               if (sreq->nr_src > 0)
+                       dma_unmap_sg(priv->dev, src, sreq->nr_src,
+                                    DMA_BIDIRECTIONAL);
        } else {
-               dma_unmap_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE);
-               dma_unmap_sg(priv->dev, dst, sreq->nr_dst, DMA_FROM_DEVICE);
+               if (sreq->nr_src > 0)
+                       dma_unmap_sg(priv->dev, src, sreq->nr_src,
+                                    DMA_TO_DEVICE);
+               if (sreq->nr_dst > 0)
+                       dma_unmap_sg(priv->dev, dst, sreq->nr_dst,
+                                    DMA_FROM_DEVICE);
        }
 
        return ret;