X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flibrte_mempool%2Frte_mempool.c;h=f592dc756422a4d518186a6f6713a3a9593e8d60;hb=408a082c4a4ef4dd9a5b37e3217c0edb9b7f6b20;hp=01972ba010d06f5c564f270fce78e2f094f6184e;hpb=462321b44a801493ce2eb67bd73564e509a82f45;p=dpdk.git diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index 01972ba010..f592dc7564 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -130,17 +130,19 @@ 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; + struct rte_mempool_objtlr *tlr __rte_unused; 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); - __mempool_write_trailer_cookie(obj); + hdr->cookie = RTE_MEMPOOL_HEADER_COOKIE2; + tlr = __mempool_get_trailer(obj); + tlr->cookie = RTE_MEMPOOL_TRAILER_COOKIE; #endif /* call the initializer */ if (obj_init) @@ -156,7 +158,7 @@ rte_mempool_obj_iter(void *vaddr, uint32_t elt_num, size_t elt_sz, size_t align, rte_mempool_obj_iter_t obj_iter, void *obj_iter_arg) { uint32_t i, j, k; - uint32_t pgn; + uint32_t pgn, pgf; uintptr_t end, start, va; uintptr_t pg_sz; @@ -171,10 +173,14 @@ rte_mempool_obj_iter(void *vaddr, uint32_t elt_num, size_t elt_sz, size_t align, start = RTE_ALIGN_CEIL(va, align); end = start + elt_sz; - pgn = (end >> pg_shift) - (start >> pg_shift); + /* index of the first page for the next element. */ + pgf = (end >> pg_shift) - (start >> pg_shift); + + /* index of the last page for the current element. */ + pgn = ((end - 1) >> pg_shift) - (start >> pg_shift); pgn += j; - /* do we have enough space left for the next element. */ + /* do we have enough space left for the element. */ if (pgn >= pg_num) break; @@ -194,7 +200,7 @@ rte_mempool_obj_iter(void *vaddr, uint32_t elt_num, size_t elt_sz, size_t align, obj_iter(obj_iter_arg, (void *)start, (void *)end, i); va = end; - j = pgn; + j += pgf; i++; } else { va = RTE_ALIGN_CEIL((va + 1), pg_sz); @@ -341,9 +347,9 @@ rte_mempool_xmem_size(uint32_t elt_num, size_t elt_sz, uint32_t pg_shift) */ static void mempool_lelem_iter(void *arg, __rte_unused void *start, void *end, - __rte_unused uint32_t idx) + __rte_unused uint32_t idx) { - *(uintptr_t *)arg = (uintptr_t)end; + *(uintptr_t *)arg = (uintptr_t)end; } ssize_t @@ -361,7 +367,7 @@ rte_mempool_xmem_usage(void *vaddr, uint32_t elt_num, size_t elt_sz, if ((n = rte_mempool_obj_iter(vaddr, elt_num, elt_sz, 1, paddr, pg_num, pg_shift, mempool_lelem_iter, &uv)) != elt_num) { - return (-n); + return (-(ssize_t)n); } uv = RTE_ALIGN_CEIL(uv, pg_sz); @@ -515,8 +521,8 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, /* * If user provided an external memory buffer, then use it to - * store mempool objects. Otherwise reserve memzone big enough to - * hold mempool header and metadata plus mempool objects. + * store mempool objects. Otherwise reserve a memzone that is large + * enough to hold mempool header and metadata plus mempool objects. */ mempool_size = MEMPOOL_HEADER_SIZE(mp, pg_num) + private_data_size; if (vaddr == NULL) @@ -537,7 +543,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, /* * no more memory: in this case we loose previously reserved - * space for the as we cannot free it + * space for the ring as we cannot free it */ if (mz == NULL) { rte_free(te);