From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by dpdk.org (Postfix) with ESMTP id 6D805C424 for ; Fri, 19 Jun 2015 18:16:53 +0200 (CEST) Received: by wicnd19 with SMTP id nd19so23693332wic.1 for ; Fri, 19 Jun 2015 09:16:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=yRkcGcTixxo9VQvCp/tJZX58KvQUL7Zp372CdUVmfmI=; b=h993KsvPaNugrTD804pQ5FkAlp8QTtOu2L4i5EZuCRqmBnoNmLLvunP179l0JyPmP6 WJhZ4hY0lxZlWxw1NeAdaiRzRG6k5tGwN+eXh5S1iOJMkkezFoAaeacwxg673krh2SBx M/VNTI8RZtp4JGCdOHypEKS9XhA7sIVHYOgyJnL/JZ2cIyxjt6BsomBkGMQc8cgmopyh chlpTj0XtF7uCDOZ3tP7kIXYGLBbpKKGejWqNAqYPg0aeKof+Ea1a4J93c5g69VaMHjS e1yfKy1Kn2QI6XirR2sU7WgTpBW9lzEbmjOmhLfb+OerKTTGaHHhOYZazUcIhrdTGXax B83Q== X-Gm-Message-State: ALoCoQn+NVqC5xnoqYCs+dT5Yp7FE+OVy1kRz5d+uYOLXR4b4bHw2Tujtfdy77GY6uOpHV124lTP X-Received: by 10.180.8.41 with SMTP id o9mr8168993wia.83.1434730613310; Fri, 19 Jun 2015 09:16:53 -0700 (PDT) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.151.210]) by mx.google.com with ESMTPSA id ef10sm17739604wjd.49.2015.06.19.09.16.52 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 19 Jun 2015 09:16:52 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Fri, 19 Jun 2015 18:16:37 +0200 Message-Id: <1434730599-24339-2-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1434730599-24339-1-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> Subject: [dpdk-dev] [PATCH v2 1/3] mempool: introduce objhdr structure for object headers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jun 2015 16:16:53 -0000 Each object stored in mempools are prefixed by a header, allowing for instance to retrieve the mempool pointer from the object. When debug is enabled, a cookie is also added in this header that helps to detect corruptions and double-frees. Introduce a structure that materializes the content of this header, and will simplify future patches adding things in this header. Signed-off-by: Olivier Matz --- lib/librte_mempool/rte_mempool.c | 8 ++--- lib/librte_mempool/rte_mempool.h | 76 ++++++++++++++++------------------------ 2 files changed, 35 insertions(+), 49 deletions(-) diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index 190cfd9..b2d8700 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -130,16 +130,16 @@ static void 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 **mpp; + struct rte_mempool_objhdr *hdr; obj = (char *)obj + mp->header_size; /* set mempool ptr in header */ - mpp = __mempool_from_obj(obj); - *mpp = mp; + hdr = (struct rte_mempool_objhdr *)((char *)obj - sizeof(*hdr)); + hdr->mp = mp; #ifdef RTE_LIBRTE_MEMPOOL_DEBUG - __mempool_write_header_cookie(obj, 1); + hdr->cookie = RTE_MEMPOOL_HEADER_COOKIE2; __mempool_write_trailer_cookie(obj); #endif /* call the initializer */ diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h index bc2bae0..b047810 100644 --- a/lib/librte_mempool/rte_mempool.h +++ b/lib/librte_mempool/rte_mempool.h @@ -140,6 +140,21 @@ struct rte_mempool_objsz { #define MEMPOOL_PG_NUM_DEFAULT 1 /** + * Mempool object header structure + * + * Each object stored in mempools are prefixed by this header structure, + * it allows to retrieve the mempool pointer from the object. When debug + * is enabled, a cookie is also added in this structure preventing + * corruptions and double-frees. + */ +struct rte_mempool_objhdr { + struct rte_mempool *mp; /**< The mempool owning the object. */ +#ifdef RTE_LIBRTE_MEMPOOL_DEBUG + uint64_t cookie; /**< Debug cookie. */ +#endif +}; + +/** * The RTE mempool structure. */ struct rte_mempool { @@ -227,24 +242,11 @@ struct rte_mempool { ((mp)->pg_num == MEMPOOL_PG_NUM_DEFAULT && \ (mp)->phys_addr == (mp)->elt_pa[0]) -/** - * @internal Get a pointer to a mempool pointer in the object header. - * @param obj - * Pointer to object. - * @return - * The pointer to the mempool from which the object was allocated. - */ -static inline struct rte_mempool **__mempool_from_obj(void *obj) +/* return the header of a mempool object (internal) */ +static inline struct rte_mempool_objhdr *__mempool_get_header(void *obj) { - struct rte_mempool **mpp; - unsigned off; - - off = sizeof(struct rte_mempool *); -#ifdef RTE_LIBRTE_MEMPOOL_DEBUG - off += sizeof(uint64_t); -#endif - mpp = (struct rte_mempool **)((char *)obj - off); - return mpp; + return (struct rte_mempool_objhdr *)((char *)obj - + sizeof(struct rte_mempool_objhdr)); } /** @@ -256,36 +258,18 @@ static inline struct rte_mempool **__mempool_from_obj(void *obj) * @return * A pointer to the mempool structure. */ -static inline const struct rte_mempool *rte_mempool_from_obj(void *obj) +static inline struct rte_mempool *rte_mempool_from_obj(void *obj) { - struct rte_mempool * const *mpp; - mpp = __mempool_from_obj(obj); - return *mpp; + struct rte_mempool_objhdr *hdr = __mempool_get_header(obj); + return hdr->mp; } #ifdef RTE_LIBRTE_MEMPOOL_DEBUG -/* get header cookie value */ -static inline uint64_t __mempool_read_header_cookie(const void *obj) -{ - return *(const uint64_t *)((const char *)obj - sizeof(uint64_t)); -} - /* get trailer cookie value */ static inline uint64_t __mempool_read_trailer_cookie(void *obj) { - struct rte_mempool **mpp = __mempool_from_obj(obj); - return *(uint64_t *)((char *)obj + (*mpp)->elt_size); -} - -/* write header cookie value */ -static inline void __mempool_write_header_cookie(void *obj, int free) -{ - uint64_t *cookie_p; - cookie_p = (uint64_t *)((char *)obj - sizeof(uint64_t)); - if (free == 0) - *cookie_p = RTE_MEMPOOL_HEADER_COOKIE1; - else - *cookie_p = RTE_MEMPOOL_HEADER_COOKIE2; + struct rte_mempool *mp = rte_mempool_from_obj(obj); + return *(uint64_t *)((char *)obj + mp->elt_size); } @@ -293,8 +277,8 @@ static inline void __mempool_write_header_cookie(void *obj, int free) static inline void __mempool_write_trailer_cookie(void *obj) { uint64_t *cookie_p; - struct rte_mempool **mpp = __mempool_from_obj(obj); - cookie_p = (uint64_t *)((char *)obj + (*mpp)->elt_size); + 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 */ @@ -321,6 +305,7 @@ static inline void __mempool_check_cookies(const struct rte_mempool *mp, void * const *obj_table_const, unsigned n, int free) { + struct rte_mempool_objhdr *hdr; uint64_t cookie; void *tmp; void *obj; @@ -338,7 +323,8 @@ static inline void __mempool_check_cookies(const struct rte_mempool *mp, rte_panic("MEMPOOL: object is owned by another " "mempool\n"); - cookie = __mempool_read_header_cookie(obj); + hdr = __mempool_get_header(obj); + cookie = hdr->cookie; if (free == 0) { if (cookie != RTE_MEMPOOL_HEADER_COOKIE1) { @@ -348,7 +334,7 @@ static inline void __mempool_check_cookies(const struct rte_mempool *mp, obj, (const void *) mp, cookie); rte_panic("MEMPOOL: bad header cookie (put)\n"); } - __mempool_write_header_cookie(obj, 1); + hdr->cookie = RTE_MEMPOOL_HEADER_COOKIE2; } else if (free == 1) { if (cookie != RTE_MEMPOOL_HEADER_COOKIE2) { @@ -358,7 +344,7 @@ static inline void __mempool_check_cookies(const struct rte_mempool *mp, obj, (const void *) mp, cookie); rte_panic("MEMPOOL: bad header cookie (get)\n"); } - __mempool_write_header_cookie(obj, 0); + hdr->cookie = RTE_MEMPOOL_HEADER_COOKIE1; } else if (free == 2) { if (cookie != RTE_MEMPOOL_HEADER_COOKIE1 && -- 2.1.4