[5/6] common/cpt: fix fill_sg_comp api for zero datalen
Checks
Commit Message
From: Archana Muniganti <marchana@marvell.com>
fill_sg_comp_from_iov() prepares gather components for i/p IOV
buffers and extra buf. This API is failing to create a gather component
for extra_buf when IOV buf len is zero. Though there is enough space
to accommodate extra_buf, because of pre-decrementing of extra_buf
length from aggregate size, this issue is seen.
Fixes: b74652f3a91f ("common/cpt: add microcode interface for encryption")
Signed-off-by: Archana Muniganti <marchana@marvell.com>
Signed-off-by: Anoob Joseph <anoobj@marvell.com>
---
drivers/common/cpt/cpt_ucode.h | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
@@ -373,7 +373,7 @@ fill_sg_comp_from_iov(sg_comp_t *list,
{
int32_t j;
uint32_t extra_len = extra_buf ? extra_buf->size : 0;
- uint32_t size = *psize - extra_len;
+ uint32_t size = *psize;
buf_ptr_t *bufs;
bufs = from->bufs;
@@ -382,9 +382,6 @@ fill_sg_comp_from_iov(sg_comp_t *list,
uint32_t e_len;
sg_comp_t *to = &list[i >> 2];
- if (!bufs[j].size)
- continue;
-
if (unlikely(from_offset)) {
if (from_offset >= bufs[j].size) {
from_offset -= bufs[j].size;
@@ -416,18 +413,19 @@ fill_sg_comp_from_iov(sg_comp_t *list,
to->u.s.len[i % 4] = rte_cpu_to_be_16(e_len);
}
+ extra_len = RTE_MIN(extra_len, size);
/* Insert extra data ptr */
if (extra_len) {
i++;
to = &list[i >> 2];
to->u.s.len[i % 4] =
- rte_cpu_to_be_16(extra_buf->size);
+ rte_cpu_to_be_16(extra_len);
to->ptr[i % 4] =
rte_cpu_to_be_64(extra_buf->dma_addr);
-
- /* size already decremented by extra len */
+ size -= extra_len;
}
+ next_len = RTE_MIN(next_len, size);
/* insert the rest of the data */
if (next_len) {
i++;