* [PATCH v1 1/2] test/dma: update the sg test to verify wrap around case @ 2024-04-16 12:37 Vidya Sagar Velumuri 2024-04-16 12:37 ` [PATCH v1 2/2] test/dma: add functions to verify zero and one fill Vidya Sagar Velumuri 2024-04-19 9:07 ` [PATCH v2 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri 0 siblings, 2 replies; 4+ messages in thread From: Vidya Sagar Velumuri @ 2024-04-16 12:37 UTC (permalink / raw) To: Chengwen Feng, Kevin Laatz, Bruce Richardson Cc: jerinj, anoobj, vvelumuri, asasidharan, ktejasree, gmuthukrishn, dev Run the sg test in a loop to verify wrap around case. Total number commands submitted to be more than the number descriptors allocated to verify the scenario. Signed-off-by: Vidya Sagar Velumuri <vvelumuri@marvell.com> diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index 143e1bcd68..7462e90831 100644 --- a/app/test/test_dmadev.c +++ b/app/test/test_dmadev.c @@ -393,34 +393,26 @@ test_stop_start(int16_t dev_id, uint16_t vchan) } static int -test_enqueue_sg_copies(int16_t dev_id, uint16_t vchan) +test_enqueue_sg(int16_t dev_id, uint16_t vchan, unsigned int n_sge, unsigned int test_len) { - unsigned int src_len, dst_len, n_sge, len, i, j, k; char orig_src[COPY_LEN], orig_dst[COPY_LEN]; - struct rte_dma_info info = { 0 }; + unsigned int src_len, dst_len, i, j, k; enum rte_dma_status_code status; uint16_t id, n_src, n_dst; - if (rte_dma_info_get(dev_id, &info) < 0) - ERR_RETURN("Failed to get dev info"); - - if (info.max_sges < 2) - ERR_RETURN("Test needs minimum 2 SG pointers"); - - n_sge = info.max_sges; - for (n_src = 1; n_src <= n_sge; n_src++) { for (n_dst = 1; n_dst <= n_sge; n_dst++) { /* Normalize SG buffer lengths */ - len = COPY_LEN; - len -= (len % (n_src * n_dst)); - dst_len = len / n_dst; - src_len = len / n_src; - + unsigned int len = test_len - (test_len % (n_src * n_dst)); struct rte_dma_sge sg_src[n_sge], sg_dst[n_sge]; struct rte_mbuf *src[n_sge], *dst[n_sge]; char *src_data[n_sge], *dst_data[n_sge]; + dst_len = len / n_dst; + src_len = len / n_src; + if (dst_len == 0 || src_len == 0) + continue; + for (i = 0 ; i < len; i++) orig_src[i] = rte_rand() & 0xFF; @@ -511,6 +503,27 @@ test_enqueue_sg_copies(int16_t dev_id, uint16_t vchan) return 0; } +static int +test_enqueue_sg_copies(int16_t dev_id, uint16_t vchan) +{ + struct rte_dma_info info = { 0 }; + unsigned int n_sge, len; + int loop_count = 0; + + if (rte_dma_info_get(dev_id, &info) < 0) + ERR_RETURN("Failed to get dev info"); + + n_sge = RTE_MIN(info.max_sges, TEST_SG_MAX); + len = COPY_LEN; + + do { + test_enqueue_sg(dev_id, vchan, n_sge, len); + loop_count++; + } while (loop_count * n_sge * n_sge < TEST_RINGSIZE * 3); + + return 0; +} + /* Failure handling test cases - global macros and variables for those tests*/ #define COMP_BURST_SZ 16 #define OPT_FENCE(idx) ((fence && idx == 8) ? RTE_DMA_OP_FLAG_FENCE : 0) diff --git a/app/test/test_dmadev_api.c b/app/test/test_dmadev_api.c index d40c05cfbf..6a07ed593b 100644 --- a/app/test/test_dmadev_api.c +++ b/app/test/test_dmadev_api.c @@ -16,7 +16,6 @@ extern int test_dma_api(uint16_t dev_id); #define TEST_MEMCPY_SIZE 1024 #define TEST_WAIT_US_VAL 50000 -#define TEST_SG_MAX 64 static int16_t test_dev_id; static int16_t invalid_dev_id; diff --git a/app/test/test_dmadev_api.h b/app/test/test_dmadev_api.h index 33fbc5bd41..a03f7acd4f 100644 --- a/app/test/test_dmadev_api.h +++ b/app/test/test_dmadev_api.h @@ -2,4 +2,6 @@ * Copyright(c) 2021 HiSilicon Limited */ +#define TEST_SG_MAX 64 + int test_dma_api(uint16_t dev_id); -- 2.25.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v1 2/2] test/dma: add functions to verify zero and one fill 2024-04-16 12:37 [PATCH v1 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri @ 2024-04-16 12:37 ` Vidya Sagar Velumuri 2024-04-19 9:07 ` [PATCH v2 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri 1 sibling, 0 replies; 4+ messages in thread From: Vidya Sagar Velumuri @ 2024-04-16 12:37 UTC (permalink / raw) To: Chengwen Feng, Kevin Laatz, Bruce Richardson Cc: jerinj, anoobj, vvelumuri, asasidharan, ktejasree, gmuthukrishn, dev Add test cases to verify zero fill and one fill Signed-off-by: Vidya Sagar Velumuri <vvelumuri@marvell.com> diff --git a/app/test/test.h b/app/test/test.h index 15e23d297f..0ca6519f6e 100644 --- a/app/test/test.h +++ b/app/test/test.h @@ -27,6 +27,10 @@ #include <rte_test.h> +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + #define TEST_ASSERT RTE_TEST_ASSERT #define TEST_ASSERT_EQUAL RTE_TEST_ASSERT_EQUAL diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index 7462e90831..b21994d592 100644 --- a/app/test/test_dmadev.c +++ b/app/test/test_dmadev.c @@ -869,42 +869,52 @@ test_completion_handling(int16_t dev_id, uint16_t vchan) static int test_enqueue_fill(int16_t dev_id, uint16_t vchan) { + uint64_t pattern[3] = {0x0, 0xfedcba9876543210, 0xffffffffffffffff}; const unsigned int lengths[] = {8, 64, 1024, 50, 100, 89}; + unsigned int i, j, k; struct rte_mbuf *dst; char *dst_data; - uint64_t pattern = 0xfedcba9876543210; - unsigned int i, j; dst = rte_pktmbuf_alloc(pool); if (dst == NULL) ERR_RETURN("Failed to allocate mbuf\n"); dst_data = rte_pktmbuf_mtod(dst, char *); - for (i = 0; i < RTE_DIM(lengths); i++) { - /* reset dst_data */ - memset(dst_data, 0, rte_pktmbuf_data_len(dst)); + for (k = 0; k < ARRAY_SIZE(pattern); k++) { + printf("Test fill pattern: 0x%016lx\n", pattern[k]); + for (i = 0; i < RTE_DIM(lengths); i++) { + /* reset dst_data */ + memset(dst_data, 0, rte_pktmbuf_data_len(dst)); + + /* perform the fill operation */ + int id = rte_dma_fill(dev_id, vchan, pattern[k], + rte_pktmbuf_iova(dst), lengths[i], RTE_DMA_OP_FLAG_SUBMIT); + if (id < 0) { + if (id == -ENOTSUP) { + rte_pktmbuf_free(dst); + break; + } + ERR_RETURN("Error with rte_dma_fill\n"); + } + await_hw(dev_id, vchan); - /* perform the fill operation */ - int id = rte_dma_fill(dev_id, vchan, pattern, - rte_pktmbuf_iova(dst), lengths[i], RTE_DMA_OP_FLAG_SUBMIT); - if (id < 0) - ERR_RETURN("Error with rte_dma_fill\n"); - await_hw(dev_id, vchan); + if (rte_dma_completed(dev_id, vchan, 1, NULL, NULL) != 1) + ERR_RETURN("Error: fill operation failed (length: %u)\n", + lengths[i]); + /* check the data from the fill operation is correct */ + for (j = 0; j < lengths[i]; j++) { + char pat_byte = ((char *)&pattern[k])[j % 8]; - if (rte_dma_completed(dev_id, vchan, 1, NULL, NULL) != 1) - ERR_RETURN("Error: fill operation failed (length: %u)\n", lengths[i]); - /* check the data from the fill operation is correct */ - for (j = 0; j < lengths[i]; j++) { - char pat_byte = ((char *)&pattern)[j % 8]; - if (dst_data[j] != pat_byte) - ERR_RETURN("Error with fill operation (lengths = %u): got (%x), not (%x)\n", - lengths[i], dst_data[j], pat_byte); + if (dst_data[j] != pat_byte) + ERR_RETURN("Error with fill operation (lengths = %u): got (%x), not (%x)\n", + lengths[i], dst_data[j], pat_byte); + } + /* check that the data after the fill operation was not written to */ + for (; j < rte_pktmbuf_data_len(dst); j++) + if (dst_data[j] != 0) + ERR_RETURN("Error, fill operation wrote too far (lengths = %u): got (%x), not (%x)\n", + lengths[i], dst_data[j], 0); } - /* check that the data after the fill operation was not written to */ - for (; j < rte_pktmbuf_data_len(dst); j++) - if (dst_data[j] != 0) - ERR_RETURN("Error, fill operation wrote too far (lengths = %u): got (%x), not (%x)\n", - lengths[i], dst_data[j], 0); } rte_pktmbuf_free(dst); -- 2.25.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/2] test/dma: update the sg test to verify wrap around case 2024-04-16 12:37 [PATCH v1 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri 2024-04-16 12:37 ` [PATCH v1 2/2] test/dma: add functions to verify zero and one fill Vidya Sagar Velumuri @ 2024-04-19 9:07 ` Vidya Sagar Velumuri 2024-04-19 9:07 ` [PATCH v2 2/2] test/dma: add functions to verify zero and one fill Vidya Sagar Velumuri 1 sibling, 1 reply; 4+ messages in thread From: Vidya Sagar Velumuri @ 2024-04-19 9:07 UTC (permalink / raw) To: fengchengwen, kevin.laatz, bruce.richardson Cc: jerinj, anoobj, vvelumuri, asasidharan, ktejasree, gmuthukrishn, dev Run the sg test in a loop to verify wrap around case. Total number commands submitted to be more than the number descriptors allocated to verify the scenario. Signed-off-by: Vidya Sagar Velumuri <vvelumuri@marvell.com> diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index 143e1bcd68..7462e90831 100644 --- a/app/test/test_dmadev.c +++ b/app/test/test_dmadev.c @@ -393,34 +393,26 @@ test_stop_start(int16_t dev_id, uint16_t vchan) } static int -test_enqueue_sg_copies(int16_t dev_id, uint16_t vchan) +test_enqueue_sg(int16_t dev_id, uint16_t vchan, unsigned int n_sge, unsigned int test_len) { - unsigned int src_len, dst_len, n_sge, len, i, j, k; char orig_src[COPY_LEN], orig_dst[COPY_LEN]; - struct rte_dma_info info = { 0 }; + unsigned int src_len, dst_len, i, j, k; enum rte_dma_status_code status; uint16_t id, n_src, n_dst; - if (rte_dma_info_get(dev_id, &info) < 0) - ERR_RETURN("Failed to get dev info"); - - if (info.max_sges < 2) - ERR_RETURN("Test needs minimum 2 SG pointers"); - - n_sge = info.max_sges; - for (n_src = 1; n_src <= n_sge; n_src++) { for (n_dst = 1; n_dst <= n_sge; n_dst++) { /* Normalize SG buffer lengths */ - len = COPY_LEN; - len -= (len % (n_src * n_dst)); - dst_len = len / n_dst; - src_len = len / n_src; - + unsigned int len = test_len - (test_len % (n_src * n_dst)); struct rte_dma_sge sg_src[n_sge], sg_dst[n_sge]; struct rte_mbuf *src[n_sge], *dst[n_sge]; char *src_data[n_sge], *dst_data[n_sge]; + dst_len = len / n_dst; + src_len = len / n_src; + if (dst_len == 0 || src_len == 0) + continue; + for (i = 0 ; i < len; i++) orig_src[i] = rte_rand() & 0xFF; @@ -511,6 +503,27 @@ test_enqueue_sg_copies(int16_t dev_id, uint16_t vchan) return 0; } +static int +test_enqueue_sg_copies(int16_t dev_id, uint16_t vchan) +{ + struct rte_dma_info info = { 0 }; + unsigned int n_sge, len; + int loop_count = 0; + + if (rte_dma_info_get(dev_id, &info) < 0) + ERR_RETURN("Failed to get dev info"); + + n_sge = RTE_MIN(info.max_sges, TEST_SG_MAX); + len = COPY_LEN; + + do { + test_enqueue_sg(dev_id, vchan, n_sge, len); + loop_count++; + } while (loop_count * n_sge * n_sge < TEST_RINGSIZE * 3); + + return 0; +} + /* Failure handling test cases - global macros and variables for those tests*/ #define COMP_BURST_SZ 16 #define OPT_FENCE(idx) ((fence && idx == 8) ? RTE_DMA_OP_FLAG_FENCE : 0) diff --git a/app/test/test_dmadev_api.c b/app/test/test_dmadev_api.c index d40c05cfbf..6a07ed593b 100644 --- a/app/test/test_dmadev_api.c +++ b/app/test/test_dmadev_api.c @@ -16,7 +16,6 @@ extern int test_dma_api(uint16_t dev_id); #define TEST_MEMCPY_SIZE 1024 #define TEST_WAIT_US_VAL 50000 -#define TEST_SG_MAX 64 static int16_t test_dev_id; static int16_t invalid_dev_id; diff --git a/app/test/test_dmadev_api.h b/app/test/test_dmadev_api.h index 33fbc5bd41..a03f7acd4f 100644 --- a/app/test/test_dmadev_api.h +++ b/app/test/test_dmadev_api.h @@ -2,4 +2,6 @@ * Copyright(c) 2021 HiSilicon Limited */ +#define TEST_SG_MAX 64 + int test_dma_api(uint16_t dev_id); -- 2.25.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] test/dma: add functions to verify zero and one fill 2024-04-19 9:07 ` [PATCH v2 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri @ 2024-04-19 9:07 ` Vidya Sagar Velumuri 0 siblings, 0 replies; 4+ messages in thread From: Vidya Sagar Velumuri @ 2024-04-19 9:07 UTC (permalink / raw) To: fengchengwen, kevin.laatz, bruce.richardson Cc: jerinj, anoobj, vvelumuri, asasidharan, ktejasree, gmuthukrishn, dev Add test cases to verify zero fill and one fill Signed-off-by: Vidya Sagar Velumuri <vvelumuri@marvell.com> diff --git a/app/test/test.h b/app/test/test.h index 15e23d297f..0ca6519f6e 100644 --- a/app/test/test.h +++ b/app/test/test.h @@ -27,6 +27,10 @@ #include <rte_test.h> +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + #define TEST_ASSERT RTE_TEST_ASSERT #define TEST_ASSERT_EQUAL RTE_TEST_ASSERT_EQUAL diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index 7462e90831..ec896a4905 100644 --- a/app/test/test_dmadev.c +++ b/app/test/test_dmadev.c @@ -869,42 +869,51 @@ test_completion_handling(int16_t dev_id, uint16_t vchan) static int test_enqueue_fill(int16_t dev_id, uint16_t vchan) { + uint64_t pattern[3] = {0x0, 0xfedcba9876543210, 0xffffffffffffffff}; const unsigned int lengths[] = {8, 64, 1024, 50, 100, 89}; + unsigned int i, j, k; struct rte_mbuf *dst; char *dst_data; - uint64_t pattern = 0xfedcba9876543210; - unsigned int i, j; dst = rte_pktmbuf_alloc(pool); if (dst == NULL) ERR_RETURN("Failed to allocate mbuf\n"); dst_data = rte_pktmbuf_mtod(dst, char *); - for (i = 0; i < RTE_DIM(lengths); i++) { - /* reset dst_data */ - memset(dst_data, 0, rte_pktmbuf_data_len(dst)); + for (k = 0; k < ARRAY_SIZE(pattern); k++) { + for (i = 0; i < RTE_DIM(lengths); i++) { + /* reset dst_data */ + memset(dst_data, 0, rte_pktmbuf_data_len(dst)); + + /* perform the fill operation */ + int id = rte_dma_fill(dev_id, vchan, pattern[k], + rte_pktmbuf_iova(dst), lengths[i], RTE_DMA_OP_FLAG_SUBMIT); + if (id < 0) { + if (id == -ENOTSUP) { + rte_pktmbuf_free(dst); + break; + } + ERR_RETURN("Error with rte_dma_fill\n"); + } + await_hw(dev_id, vchan); - /* perform the fill operation */ - int id = rte_dma_fill(dev_id, vchan, pattern, - rte_pktmbuf_iova(dst), lengths[i], RTE_DMA_OP_FLAG_SUBMIT); - if (id < 0) - ERR_RETURN("Error with rte_dma_fill\n"); - await_hw(dev_id, vchan); + if (rte_dma_completed(dev_id, vchan, 1, NULL, NULL) != 1) + ERR_RETURN("Error: fill operation failed (length: %u)\n", + lengths[i]); + /* check the data from the fill operation is correct */ + for (j = 0; j < lengths[i]; j++) { + char pat_byte = ((char *)&pattern[k])[j % 8]; - if (rte_dma_completed(dev_id, vchan, 1, NULL, NULL) != 1) - ERR_RETURN("Error: fill operation failed (length: %u)\n", lengths[i]); - /* check the data from the fill operation is correct */ - for (j = 0; j < lengths[i]; j++) { - char pat_byte = ((char *)&pattern)[j % 8]; - if (dst_data[j] != pat_byte) - ERR_RETURN("Error with fill operation (lengths = %u): got (%x), not (%x)\n", - lengths[i], dst_data[j], pat_byte); + if (dst_data[j] != pat_byte) + ERR_RETURN("Error with fill operation (lengths = %u): got (%x), not (%x)\n", + lengths[i], dst_data[j], pat_byte); + } + /* check that the data after the fill operation was not written to */ + for (; j < rte_pktmbuf_data_len(dst); j++) + if (dst_data[j] != 0) + ERR_RETURN("Error, fill operation wrote too far (lengths = %u): got (%x), not (%x)\n", + lengths[i], dst_data[j], 0); } - /* check that the data after the fill operation was not written to */ - for (; j < rte_pktmbuf_data_len(dst); j++) - if (dst_data[j] != 0) - ERR_RETURN("Error, fill operation wrote too far (lengths = %u): got (%x), not (%x)\n", - lengths[i], dst_data[j], 0); } rte_pktmbuf_free(dst); -- 2.25.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-04-19 9:08 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-04-16 12:37 [PATCH v1 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri 2024-04-16 12:37 ` [PATCH v1 2/2] test/dma: add functions to verify zero and one fill Vidya Sagar Velumuri 2024-04-19 9:07 ` [PATCH v2 1/2] test/dma: update the sg test to verify wrap around case Vidya Sagar Velumuri 2024-04-19 9:07 ` [PATCH v2 2/2] test/dma: add functions to verify zero and one fill Vidya Sagar Velumuri
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).