X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_mempool%2Frte_mempool.c;h=cf7ed761ed44e3f0bf683a79095fb85a1d11aaa5;hb=9d8a92628f21c43c88f7be9654b3b7699b4c6d2a;hp=dbb4104369af12e5871519426fcd5221857d1a26;hpb=6f41fe75e2dd8dd38f7bea7b9501edd4f9b72fa5;p=dpdk.git diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index dbb4104369..cf7ed761ed 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -45,9 +45,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -60,7 +60,12 @@ #include "rte_mempool.h" -TAILQ_HEAD(rte_mempool_list, rte_mempool); +TAILQ_HEAD(rte_mempool_list, rte_tailq_entry); + +static struct rte_tailq_elem rte_mempool_tailq = { + .name = "RTE_MEMPOOL", +}; +EAL_REGISTER_TAILQ(rte_mempool_tailq) #define CACHE_FLUSHTHRESH_MULTIPLIER 1.5 @@ -113,10 +118,10 @@ static unsigned optimize_object_size(unsigned obj_size) nrank = 1; /* process new object size */ - new_obj_size = (obj_size + CACHE_LINE_MASK) / CACHE_LINE_SIZE; + new_obj_size = (obj_size + RTE_CACHE_LINE_MASK) / RTE_CACHE_LINE_SIZE; while (get_gcd(new_obj_size, nrank * nchan) != 1) new_obj_size++; - return new_obj_size * CACHE_LINE_SIZE; + return new_obj_size * RTE_CACHE_LINE_SIZE; } static void @@ -254,7 +259,7 @@ rte_mempool_calc_obj_size(uint32_t elt_size, uint32_t flags, #endif if ((flags & MEMPOOL_F_NO_CACHE_ALIGN) == 0) sz->header_size = RTE_ALIGN_CEIL(sz->header_size, - CACHE_LINE_SIZE); + RTE_CACHE_LINE_SIZE); /* trailer contains the cookie in debug mode */ sz->trailer_size = 0; @@ -268,9 +273,9 @@ rte_mempool_calc_obj_size(uint32_t elt_size, uint32_t flags, if ((flags & MEMPOOL_F_NO_CACHE_ALIGN) == 0) { sz->total_size = sz->header_size + sz->elt_size + sz->trailer_size; - sz->trailer_size += ((CACHE_LINE_SIZE - - (sz->total_size & CACHE_LINE_MASK)) & - CACHE_LINE_MASK); + sz->trailer_size += ((RTE_CACHE_LINE_SIZE - + (sz->total_size & RTE_CACHE_LINE_MASK)) & + RTE_CACHE_LINE_MASK); } /* @@ -403,7 +408,9 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, { char mz_name[RTE_MEMZONE_NAMESIZE]; char rg_name[RTE_RING_NAMESIZE]; + struct rte_mempool_list *mempool_list; struct rte_mempool *mp = NULL; + struct rte_tailq_entry *te; struct rte_ring *r; const struct rte_memzone *mz; size_t mempool_size; @@ -416,26 +423,21 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, /* compilation-time checks */ RTE_BUILD_BUG_ON((sizeof(struct rte_mempool) & - CACHE_LINE_MASK) != 0); + RTE_CACHE_LINE_MASK) != 0); #if RTE_MEMPOOL_CACHE_MAX_SIZE > 0 RTE_BUILD_BUG_ON((sizeof(struct rte_mempool_cache) & - CACHE_LINE_MASK) != 0); + RTE_CACHE_LINE_MASK) != 0); RTE_BUILD_BUG_ON((offsetof(struct rte_mempool, local_cache) & - CACHE_LINE_MASK) != 0); + RTE_CACHE_LINE_MASK) != 0); #endif #ifdef RTE_LIBRTE_MEMPOOL_DEBUG RTE_BUILD_BUG_ON((sizeof(struct rte_mempool_debug_stats) & - CACHE_LINE_MASK) != 0); + RTE_CACHE_LINE_MASK) != 0); RTE_BUILD_BUG_ON((offsetof(struct rte_mempool, stats) & - CACHE_LINE_MASK) != 0); + RTE_CACHE_LINE_MASK) != 0); #endif - /* check that we have an initialised tail queue */ - if (RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_MEMPOOL, - rte_mempool_list) == NULL) { - rte_errno = E_RTE_NO_TAILQ; - return NULL; - } + mempool_list = RTE_TAILQ_CAST(rte_mempool_tailq.head, rte_mempool_list); /* asked cache too big */ if (cache_size > RTE_MEMPOOL_CACHE_MAX_SIZE) { @@ -487,7 +489,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, * cache-aligned */ private_data_size = (private_data_size + - CACHE_LINE_MASK) & (~CACHE_LINE_MASK); + RTE_CACHE_LINE_MASK) & (~RTE_CACHE_LINE_MASK); if (! rte_eal_has_hugepages()) { /* @@ -501,6 +503,13 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, } } + /* try to allocate tailq entry */ + te = rte_zmalloc("MEMPOOL_TAILQ_ENTRY", sizeof(*te), 0); + if (te == NULL) { + RTE_LOG(ERR, MEMPOOL, "Cannot allocate tailq entry!\n"); + goto exit; + } + /* * If user provided an external memory buffer, then use it to * store mempool objects. Otherwise reserve memzone big enough to @@ -527,8 +536,10 @@ 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 */ - if (mz == NULL) + if (mz == NULL) { + rte_free(te); goto exit; + } if (rte_eal_has_hugepages()) { startaddr = (void*)mz->addr; @@ -587,7 +598,11 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, mempool_populate(mp, n, 1, obj_init, obj_init_arg); - RTE_EAL_TAILQ_INSERT_TAIL(RTE_TAILQ_MEMPOOL, rte_mempool_list, mp); + te->data = (void *) mp; + + rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); + TAILQ_INSERT_TAIL(mempool_list, te, next); + rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); exit: rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK); @@ -752,6 +767,9 @@ rte_mempool_dump(FILE *f, const struct rte_mempool *mp) unsigned common_count; unsigned cache_count; + RTE_VERIFY(f != NULL); + RTE_VERIFY(mp != NULL); + fprintf(f, "mempool <%s>@%p\n", mp->name, mp); fprintf(f, " flags=%x\n", mp->flags); fprintf(f, " ring=<%s>@%p\n", mp->ring->name, mp->ring); @@ -812,17 +830,15 @@ void rte_mempool_list_dump(FILE *f) { const struct rte_mempool *mp = NULL; + struct rte_tailq_entry *te; struct rte_mempool_list *mempool_list; - if ((mempool_list = - RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_MEMPOOL, rte_mempool_list)) == NULL) { - rte_errno = E_RTE_NO_TAILQ; - return; - } + mempool_list = RTE_TAILQ_CAST(rte_mempool_tailq.head, rte_mempool_list); rte_rwlock_read_lock(RTE_EAL_MEMPOOL_RWLOCK); - TAILQ_FOREACH(mp, mempool_list, next) { + TAILQ_FOREACH(te, mempool_list, next) { + mp = (struct rte_mempool *) te->data; rte_mempool_dump(f, mp); } @@ -834,25 +850,25 @@ struct rte_mempool * rte_mempool_lookup(const char *name) { struct rte_mempool *mp = NULL; + struct rte_tailq_entry *te; struct rte_mempool_list *mempool_list; - if ((mempool_list = - RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_MEMPOOL, rte_mempool_list)) == NULL) { - rte_errno = E_RTE_NO_TAILQ; - return NULL; - } + mempool_list = RTE_TAILQ_CAST(rte_mempool_tailq.head, rte_mempool_list); rte_rwlock_read_lock(RTE_EAL_MEMPOOL_RWLOCK); - TAILQ_FOREACH(mp, mempool_list, next) { + TAILQ_FOREACH(te, mempool_list, next) { + mp = (struct rte_mempool *) te->data; if (strncmp(name, mp->name, RTE_MEMPOOL_NAMESIZE) == 0) break; } rte_rwlock_read_unlock(RTE_EAL_MEMPOOL_RWLOCK); - if (mp == NULL) + if (te == NULL) { rte_errno = ENOENT; + return NULL; + } return mp; } @@ -860,19 +876,15 @@ rte_mempool_lookup(const char *name) void rte_mempool_walk(void (*func)(const struct rte_mempool *, void *), void *arg) { - struct rte_mempool *mp = NULL; + struct rte_tailq_entry *te = NULL; struct rte_mempool_list *mempool_list; - if ((mempool_list = - RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_MEMPOOL, rte_mempool_list)) == NULL) { - rte_errno = E_RTE_NO_TAILQ; - return; - } + mempool_list = RTE_TAILQ_CAST(rte_mempool_tailq.head, rte_mempool_list); rte_rwlock_read_lock(RTE_EAL_MEMPOOL_RWLOCK); - TAILQ_FOREACH(mp, mempool_list, next) { - (*func)(mp, arg); + TAILQ_FOREACH(te, mempool_list, next) { + (*func)((struct rte_mempool *) te->data, arg); } rte_rwlock_read_unlock(RTE_EAL_MEMPOOL_RWLOCK);