From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olivier Matz Subject: [PATCH v3 4/5] test/mbuf: enhance mbuf refcnt test Date: Tue, 31 Mar 2015 21:23:03 +0200 Message-ID: <1427829784-12323-5-git-send-email-zer0@droids-corp.org> References: <1427385595-15011-1-git-send-email-olivier.matz@6wind.com> <1427829784-12323-1-git-send-email-zer0@droids-corp.org> To: dev-VfR2kkLFssw@public.gmane.org Return-path: In-Reply-To: <1427829784-12323-1-git-send-email-zer0-RqaWXwjnwG4BE+pwOMkbTQ@public.gmane.org> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-VfR2kkLFssw@public.gmane.org Sender: "dev" From: Olivier Matz Check that the data in the cloned mbuf is the same than in the reference mbuf. Check that the reference counter is incremented for each segment. Signed-off-by: Olivier Matz --- app/test/test_mbuf.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c index 9a3cf8f..9d8ee4e 100644 --- a/app/test/test_mbuf.c +++ b/app/test/test_mbuf.c @@ -76,6 +76,8 @@ #define REFCNT_MBUF_SIZE (sizeof (struct rte_mbuf) + RTE_PKTMBUF_HEADROOM) #define REFCNT_RING_SIZE (REFCNT_MBUF_NUM * REFCNT_MAX_REF) +#define MAGIC_DATA 0x42424242 + #define MAKE_STRING(x) # x static struct rte_mempool *pktmbuf_pool = NULL; @@ -323,6 +325,7 @@ testclone_testupdate_testdetach(void) { struct rte_mbuf *m = NULL; struct rte_mbuf *clone = NULL; + uint32_t *data; /* alloc a mbuf */ m = rte_pktmbuf_alloc(pktmbuf_pool); @@ -332,21 +335,53 @@ testclone_testupdate_testdetach(void) if (rte_pktmbuf_pkt_len(m) != 0) GOTO_FAIL("Bad length"); + rte_pktmbuf_append(m, sizeof(uint32_t)); + data = rte_pktmbuf_mtod(m, uint32_t *); + *data = MAGIC_DATA; /* clone the allocated mbuf */ clone = rte_pktmbuf_clone(m, pktmbuf_pool); if (clone == NULL) GOTO_FAIL("cannot clone data\n"); + + data = rte_pktmbuf_mtod(clone, uint32_t *); + if (*data != MAGIC_DATA) + GOTO_FAIL("invalid data in clone\n"); + + if (rte_mbuf_refcnt_read(m) != 2) + GOTO_FAIL("invalid refcnt in m\n"); + + /* free the clone */ rte_pktmbuf_free(clone); + clone = NULL; + /* same test with a chained mbuf */ m->next = rte_pktmbuf_alloc(pktmbuf_pool); if (m->next == NULL) GOTO_FAIL("Next Pkt Null\n"); + rte_pktmbuf_append(m->next, sizeof(uint32_t)); + data = rte_pktmbuf_mtod(m->next, uint32_t *); + *data = MAGIC_DATA; + clone = rte_pktmbuf_clone(m, pktmbuf_pool); if (clone == NULL) GOTO_FAIL("cannot clone data\n"); + data = rte_pktmbuf_mtod(clone, uint32_t *); + if (*data != MAGIC_DATA) + GOTO_FAIL("invalid data in clone\n"); + + data = rte_pktmbuf_mtod(clone->next, uint32_t *); + if (*data != MAGIC_DATA) + GOTO_FAIL("invalid data in clone->next\n"); + + if (rte_mbuf_refcnt_read(m) != 2) + GOTO_FAIL("invalid refcnt in m\n"); + + if (rte_mbuf_refcnt_read(m->next) != 2) + GOTO_FAIL("invalid refcnt in m->next\n"); + /* free mbuf */ rte_pktmbuf_free(m); rte_pktmbuf_free(clone); @@ -357,6 +392,8 @@ testclone_testupdate_testdetach(void) fail: if (m) rte_pktmbuf_free(m); + if (clone) + rte_pktmbuf_free(clone); return -1; } #undef GOTO_FAIL -- 2.1.4