Added mempool test cases with zero-copy get and put API's

Signed-off-by: Kamalakshitha Aligeri <kamalakshitha.alig...@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.w...@arm.com>
Reviewed-by: Feifei Wang <feifei.wa...@arm.com>
---
Link: 
https://patchwork.dpdk.org/project/dpdk/patch/20221227151700.80887-1...@smartsharesystems.com/

 app/test/test_mempool.c | 81 ++++++++++++++++++++++++++++++-----------
 1 file changed, 60 insertions(+), 21 deletions(-)

diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index 8e493eda47..6d29f5bc7b 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -74,7 +74,7 @@ my_obj_init(struct rte_mempool *mp, __rte_unused void *arg,

 /* basic tests (done on one core) */
 static int
-test_mempool_basic(struct rte_mempool *mp, int use_external_cache)
+test_mempool_basic(struct rte_mempool *mp, int use_external_cache, int 
use_zc_api)
 {
        uint32_t *objnum;
        void **objtable;
@@ -84,6 +84,7 @@ test_mempool_basic(struct rte_mempool *mp, int 
use_external_cache)
        unsigned i, j;
        int offset;
        struct rte_mempool_cache *cache;
+       void **cache_objs;

        if (use_external_cache) {
                /* Create a user-owned mempool cache. */
@@ -100,8 +101,13 @@ test_mempool_basic(struct rte_mempool *mp, int 
use_external_cache)
        rte_mempool_dump(stdout, mp);

        printf("get an object\n");
-       if (rte_mempool_generic_get(mp, &obj, 1, cache) < 0)
-               GOTO_ERR(ret, out);
+       if (use_zc_api) {
+               cache_objs = rte_mempool_cache_zc_get_bulk(cache, mp, 1);
+               obj = *cache_objs;
+       } else {
+               if (rte_mempool_generic_get(mp, &obj, 1, cache) < 0)
+                       GOTO_ERR(ret, out);
+       }
        rte_mempool_dump(stdout, mp);

        /* tests that improve coverage */
@@ -123,21 +129,41 @@ test_mempool_basic(struct rte_mempool *mp, int 
use_external_cache)
 #endif

        printf("put the object back\n");
-       rte_mempool_generic_put(mp, &obj, 1, cache);
+       if (use_zc_api) {
+               cache_objs = rte_mempool_cache_zc_put_bulk(cache, mp, 1);
+               rte_memcpy(cache_objs, &obj, sizeof(void *));
+       } else {
+               rte_mempool_generic_put(mp, &obj, 1, cache);
+       }
        rte_mempool_dump(stdout, mp);

        printf("get 2 objects\n");
-       if (rte_mempool_generic_get(mp, &obj, 1, cache) < 0)
-               GOTO_ERR(ret, out);
-       if (rte_mempool_generic_get(mp, &obj2, 1, cache) < 0) {
-               rte_mempool_generic_put(mp, &obj, 1, cache);
-               GOTO_ERR(ret, out);
+       if (use_zc_api) {
+               cache_objs = rte_mempool_cache_zc_get_bulk(cache, mp, 1);
+               obj = *cache_objs;
+               cache_objs = rte_mempool_cache_zc_get_bulk(cache, mp, 1);
+               obj2 = *cache_objs;
+       } else {
+               if (rte_mempool_generic_get(mp, &obj, 1, cache) < 0)
+                       GOTO_ERR(ret, out);
+               if (rte_mempool_generic_get(mp, &obj2, 1, cache) < 0) {
+                       rte_mempool_generic_put(mp, &obj, 1, cache);
+                       GOTO_ERR(ret, out);
+               }
        }
        rte_mempool_dump(stdout, mp);

        printf("put the objects back\n");
-       rte_mempool_generic_put(mp, &obj, 1, cache);
-       rte_mempool_generic_put(mp, &obj2, 1, cache);
+       if (use_zc_api) {
+               cache_objs = rte_mempool_cache_zc_put_bulk(cache, mp, 1);
+               rte_memcpy(cache_objs, &obj, sizeof(void *));
+               cache_objs = rte_mempool_cache_zc_put_bulk(cache, mp, 1);
+               rte_memcpy(cache_objs, &obj2, sizeof(void *));
+
+       } else {
+               rte_mempool_generic_put(mp, &obj, 1, cache);
+               rte_mempool_generic_put(mp, &obj2, 1, cache);
+       }
        rte_mempool_dump(stdout, mp);

        /*
@@ -149,8 +175,13 @@ test_mempool_basic(struct rte_mempool *mp, int 
use_external_cache)
                GOTO_ERR(ret, out);

        for (i = 0; i < MEMPOOL_SIZE; i++) {
-               if (rte_mempool_generic_get(mp, &objtable[i], 1, cache) < 0)
-                       break;
+               if (use_zc_api) {
+                       cache_objs = rte_mempool_cache_zc_get_bulk(cache, mp, 
1);
+                       objtable[i] = *cache_objs;
+               } else {
+                       if (rte_mempool_generic_get(mp, &objtable[i], 1, cache) 
< 0)
+                               break;
+               }
        }

        /*
@@ -170,8 +201,12 @@ test_mempool_basic(struct rte_mempool *mp, int 
use_external_cache)
                        if (obj_data[j] != 0)
                                ret = -1;
                }
-
-               rte_mempool_generic_put(mp, &objtable[i], 1, cache);
+               if (use_zc_api) {
+                       cache_objs = rte_mempool_cache_zc_put_bulk(cache, mp, 
1);
+                       rte_memcpy(cache_objs, &objtable[i], sizeof(void *));
+               } else {
+                       rte_mempool_generic_put(mp, &objtable[i], 1, cache);
+               }
        }

        free(objtable);
@@ -979,15 +1014,19 @@ test_mempool(void)
        rte_mempool_list_dump(stdout);

        /* basic tests without cache */
-       if (test_mempool_basic(mp_nocache, 0) < 0)
+       if (test_mempool_basic(mp_nocache, 0, 0) < 0)
+               GOTO_ERR(ret, err);
+
+       /* basic tests with zero-copy API's */
+       if (test_mempool_basic(mp_cache, 0, 1) < 0)
                GOTO_ERR(ret, err);

-       /* basic tests with cache */
-       if (test_mempool_basic(mp_cache, 0) < 0)
+       /* basic tests with user-owned cache and zero-copy API's */
+       if (test_mempool_basic(mp_nocache, 1, 1) < 0)
                GOTO_ERR(ret, err);

        /* basic tests with user-owned cache */
-       if (test_mempool_basic(mp_nocache, 1) < 0)
+       if (test_mempool_basic(mp_nocache, 1, 0) < 0)
                GOTO_ERR(ret, err);

        /* more basic tests without cache */
@@ -1008,10 +1047,10 @@ test_mempool(void)
                GOTO_ERR(ret, err);

        /* test the stack handler */
-       if (test_mempool_basic(mp_stack, 1) < 0)
+       if (test_mempool_basic(mp_stack, 1, 0) < 0)
                GOTO_ERR(ret, err);

-       if (test_mempool_basic(default_pool, 1) < 0)
+       if (test_mempool_basic(default_pool, 1, 0) < 0)
                GOTO_ERR(ret, err);

        /* test mempool event callbacks */
--
2.25.1

Reply via email to