From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olivier Matz Subject: [PATCH v2 2/3] mempool: introduce objtlr structure for object trailers Date: Fri, 19 Jun 2015 18:16:38 +0200 Message-ID: <1434730599-24339-3-git-send-email-olivier.matz@6wind.com> References: <1433150143-5842-1-git-send-email-olivier.matz@6wind.com> <1434730599-24339-1-git-send-email-olivier.matz@6wind.com> To: dev@dpdk.org Return-path: Received: from mail-wi0-f179.google.com (mail-wi0-f179.google.com [209.85.212.179]) by dpdk.org (Postfix) with ESMTP id 96300C46C for ; Fri, 19 Jun 2015 18:16:54 +0200 (CEST) Received: by wicnd19 with SMTP id nd19so23693812wic.1 for ; Fri, 19 Jun 2015 09:16:54 -0700 (PDT) In-Reply-To: <1434730599-24339-1-git-send-email-olivier.matz@6wind.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Each object stored in mempools are suffixed by a trailer, storing a cookie in debug mode which help to detect memory corruptions. Like for headers, introduce a structure that materializes the content of this trailer. Signed-off-by: Olivier Matz --- lib/librte_mempool/rte_mempool.c | 4 +++- lib/librte_mempool/rte_mempool.h | 42 +++++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index b2d8700..60369cf 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -131,6 +131,7 @@ mempool_add_elem(struct rte_mempool *mp, void *obj, uint32_t obj_idx, rte_mempool_obj_ctor_t *obj_init, void *obj_init_arg) { struct rte_mempool_objhdr *hdr; + struct rte_mempool_objtlr *tlr __rte_unused; obj = (char *)obj + mp->header_size; @@ -140,7 +141,8 @@ mempool_add_elem(struct rte_mempool *mp, void *obj, uint32_t obj_idx, #ifdef RTE_LIBRTE_MEMPOOL_DEBUG hdr->cookie = RTE_MEMPOOL_HEADER_COOKIE2; - __mempool_write_trailer_cookie(obj); + tlr = __mempool_get_trailer(obj); + tlr->cookie = RTE_MEMPOOL_TRAILER_COOKIE; #endif /* call the initializer */ if (obj_init) diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h index b047810..ec1bb2e 100644 --- a/lib/librte_mempool/rte_mempool.h +++ b/lib/librte_mempool/rte_mempool.h @@ -155,6 +155,18 @@ struct rte_mempool_objhdr { }; /** + * Mempool object trailer structure + * + * In debug mode, each object stored in mempools are suffixed by this + * trailer structure containing a cookie preventing memory corruptions. + */ +struct rte_mempool_objtlr { +#ifdef RTE_LIBRTE_MEMPOOL_DEBUG + uint64_t cookie; /**< Debug cookie. */ +#endif +}; + +/** * The RTE mempool structure. */ struct rte_mempool { @@ -249,6 +261,13 @@ static inline struct rte_mempool_objhdr *__mempool_get_header(void *obj) sizeof(struct rte_mempool_objhdr)); } +/* return the trailer of a mempool object (internal) */ +static inline struct rte_mempool_objtlr *__mempool_get_trailer(void *obj) +{ + return (struct rte_mempool_objtlr *)((char *)obj - + sizeof(struct rte_mempool_objtlr)); +} + /** * Return a pointer to the mempool owning this object. * @@ -264,25 +283,6 @@ static inline struct rte_mempool *rte_mempool_from_obj(void *obj) return hdr->mp; } -#ifdef RTE_LIBRTE_MEMPOOL_DEBUG -/* get trailer cookie value */ -static inline uint64_t __mempool_read_trailer_cookie(void *obj) -{ - struct rte_mempool *mp = rte_mempool_from_obj(obj); - return *(uint64_t *)((char *)obj + mp->elt_size); - -} - -/* write trailer cookie value */ -static inline void __mempool_write_trailer_cookie(void *obj) -{ - uint64_t *cookie_p; - struct rte_mempool *mp = rte_mempool_from_obj(obj); - cookie_p = (uint64_t *)((char *)obj + mp->elt_size); - *cookie_p = RTE_MEMPOOL_TRAILER_COOKIE; -} -#endif /* RTE_LIBRTE_MEMPOOL_DEBUG */ - /** * @internal Check and update cookies or panic. * @@ -306,6 +306,7 @@ static inline void __mempool_check_cookies(const struct rte_mempool *mp, unsigned n, int free) { struct rte_mempool_objhdr *hdr; + struct rte_mempool_objtlr *tlr; uint64_t cookie; void *tmp; void *obj; @@ -356,7 +357,8 @@ static inline void __mempool_check_cookies(const struct rte_mempool *mp, rte_panic("MEMPOOL: bad header cookie (audit)\n"); } } - cookie = __mempool_read_trailer_cookie(obj); + tlr = __mempool_get_trailer(obj); + cookie = tlr->cookie; if (cookie != RTE_MEMPOOL_TRAILER_COOKIE) { rte_log_set_history(0); RTE_LOG(CRIT, MEMPOOL, -- 2.1.4