From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f169.google.com (mail-wi0-f169.google.com [209.85.212.169]) by dpdk.org (Postfix) with ESMTP id 2F6745A97 for ; Mon, 1 Jun 2015 11:15:55 +0200 (CEST) Received: by wicmx19 with SMTP id mx19so69009785wic.0 for ; Mon, 01 Jun 2015 02:15:55 -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:subject:date:message-id:in-reply-to :references; bh=l1oLXSQU7m9ky+CmeTrAEYg2JutA1rb3yxig5D5whsc=; b=equWTq0dtdVXouQrpMEl5uYfP7Rf6NKiBrxsLSmP8qB1JHQyTPlpgmSpdfuhtlL1C1 cEO0oSIImcaxtoj3oHfbLULgR5Ss1Dx5nDekH7Hgod0aqb5M5y7p97CY6W1D3oNcDgas s22WVtwKdYYhrdcaxk/IBvak2SJ9zyFFi0mpIo5SmYV4mhcLPO101C7+P4gp+sxXNd1U zBjLTGeBVpDKZT5yKMacadfXdXK9F8fH1CnEeUkIZsXu0Op9j+vH5Rj1xgGyz4E57qPP ZCoSTvUjmYNkOBfI3yMWUUahQlSywB2MhtXdhqo34mbEBkjdi9oSWF91ELxgAeiMmbAA WQyQ== X-Gm-Message-State: ALoCoQliej/NJVGEpGgrCLIOSeQGr0QEXsrsATHulpO6zRJ6zaTx64dZwXrW7KftgpmaUdy6LTmr X-Received: by 10.181.13.198 with SMTP id fa6mr19123806wid.41.1433150155031; Mon, 01 Jun 2015 02:15:55 -0700 (PDT) Received: from glumotte.dev.6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by mx.google.com with ESMTPSA id k2sm15690031wix.4.2015.06.01.02.15.54 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 01 Jun 2015 02:15:54 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Mon, 1 Jun 2015 11:15:41 +0200 Message-Id: <1433150143-5842-2-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1433150143-5842-1-git-send-email-olivier.matz@6wind.com> References: <1433150143-5842-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH 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: Mon, 01 Jun 2015 09:15:55 -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 | 68 ++++++++++++++++------------------------ 2 files changed, 31 insertions(+), 45 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 a4a9610..5058940 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; } @@ -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