crypto: ccp - Clean up and exit correctly on allocation failure
authorGary R Hook <gary.hook@amd.com>
Wed, 31 Jul 2019 00:03:25 +0000 (00:03 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 9 Aug 2019 05:11:39 +0000 (15:11 +1000)
Return and fail driver initialization if a DMA pool or coherent memory
can't be allocated. Be sure to clean up allocated memory.

Fixes: 4b394a232df7 ("crypto: ccp - Let a v5 CCP provide the same function as v3")
Signed-off-by: Gary R Hook <gary.hook@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/ccp/ccp-dev-v5.c

index f146b51a23a5086146ac42cc9f940b924f2f5351..9ee72cf46a0f529b4b156ae59d13103a91c1a15e 100644 (file)
@@ -803,6 +803,7 @@ static int ccp5_init(struct ccp_device *ccp)
                if (!dma_pool) {
                        dev_err(dev, "unable to allocate dma pool\n");
                        ret = -ENOMEM;
+                       goto e_pool;
                }
 
                cmd_q = &ccp->cmd_q[ccp->cmd_q_count];
@@ -816,9 +817,9 @@ static int ccp5_init(struct ccp_device *ccp)
                /* Page alignment satisfies our needs for N <= 128 */
                BUILD_BUG_ON(COMMANDS_PER_QUEUE > 128);
                cmd_q->qsize = Q_SIZE(Q_DESC_SIZE);
-               cmd_q->qbase = dma_alloc_coherent(dev, cmd_q->qsize,
-                                                 &cmd_q->qbase_dma,
-                                                 GFP_KERNEL);
+               cmd_q->qbase = dmam_alloc_coherent(dev, cmd_q->qsize,
+                                                  &cmd_q->qbase_dma,
+                                                  GFP_KERNEL);
                if (!cmd_q->qbase) {
                        dev_err(dev, "unable to allocate command queue\n");
                        ret = -ENOMEM;
@@ -994,7 +995,6 @@ e_pool:
 
 static void ccp5_destroy(struct ccp_device *ccp)
 {
-       struct device *dev = ccp->dev;
        struct ccp_cmd_queue *cmd_q;
        struct ccp_cmd *cmd;
        unsigned int i;
@@ -1037,12 +1037,6 @@ static void ccp5_destroy(struct ccp_device *ccp)
 
        sp_free_ccp_irq(ccp->sp, ccp);
 
-       for (i = 0; i < ccp->cmd_q_count; i++) {
-               cmd_q = &ccp->cmd_q[i];
-               dma_free_coherent(dev, cmd_q->qsize, cmd_q->qbase,
-                                 cmd_q->qbase_dma);
-       }
-
        /* Flush the cmd and backlog queue */
        while (!list_empty(&ccp->cmd)) {
                /* Invoke the callback directly with an error code */