On chunk buffer alloc failure, ENOMEM is returned. As per DMA spec
ENOSPC shall be returned on failure to allocate memory. This
changeset fixes the same.

Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
Cc: sta...@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitpraka...@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 0db74b454d..aa6f6c710c 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -257,8 +257,7 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int 
cmd_count)
 {
        uint64_t *ptr = dpi->chunk_base;
 
-       if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) ||
-           cmds == NULL)
+       if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) || 
cmds == NULL)
                return -EINVAL;
 
        /*
@@ -274,11 +273,15 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, 
int cmd_count)
                int count;
                uint64_t *new_buff = dpi->chunk_next;
 
-               dpi->chunk_next =
-                       (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
+               dpi->chunk_next = (void 
*)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
                if (!dpi->chunk_next) {
-                       plt_err("Failed to alloc next buffer from NPA");
-                       return -ENOMEM;
+                       plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+                       /* NPA failed to allocate a buffer. Restoring chunk_next
+                        * to its original address.
+                        */
+                       dpi->chunk_next = new_buff;
+                       return -ENOSPC;
                }
 
                /*
@@ -312,13 +315,17 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, 
int cmd_count)
                /* queue index may be greater than pool size */
                if (dpi->chunk_head >= dpi->pool_size_m1) {
                        new_buff = dpi->chunk_next;
-                       dpi->chunk_next =
-                               (void *)roc_npa_aura_op_alloc(dpi->aura_handle,
-                                                             0);
+                       dpi->chunk_next = (void 
*)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
                        if (!dpi->chunk_next) {
-                               plt_err("Failed to alloc next buffer from NPA");
-                               return -ENOMEM;
+                               plt_dp_dbg("Failed to alloc next buffer from 
NPA");
+
+                               /* NPA failed to allocate a buffer. Restoring 
chunk_next
+                                * to its original address.
+                                */
+                               dpi->chunk_next = new_buff;
+                               return -ENOSPC;
                        }
+
                        /* Write next buffer address */
                        *ptr = (uint64_t)new_buff;
                        dpi->chunk_base = new_buff;
-- 
2.25.1

Reply via email to