X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_mempool%2Frte_mempool.c;h=a54f62e10f767b9678bf9c2b6092c9cda3d0dff3;hb=7431041062b9fd0555bac7ca4abebc99e3379fa5;hp=b0a3c9907b3bdc6be1ce14fd985c027143628648;hpb=af75078fece3615088e561357c1e97603e43a5fe;p=dpdk.git diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index b0a3c9907b..a54f62e10f 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -30,7 +30,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * version: DPDK.L.1.2.3-3 */ #include @@ -50,19 +49,20 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include "rte_mempool.h" TAILQ_HEAD(rte_mempool_list, rte_mempool); -/* global list of mempool (used for debug/dump) */ -static struct rte_mempool_list *mempool_list; +#define CACHE_FLUSHTHRESH_MULTIPLIER 1.5 /* * return the greatest common divisor between a and b (fast algorithm) @@ -130,7 +130,7 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, { char mz_name[RTE_MEMZONE_NAMESIZE]; char rg_name[RTE_RING_NAMESIZE]; - struct rte_mempool *mp; + struct rte_mempool *mp = NULL; struct rte_ring *r; const struct rte_memzone *mz; size_t mempool_size; @@ -158,13 +158,11 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, #endif /* check that we have an initialised tail queue */ - if (mempool_list == NULL) - if ((mempool_list = RTE_TAILQ_RESERVE("RTE_MEMPOOL", \ - rte_mempool_list)) == NULL){ - rte_errno = E_RTE_NO_TAILQ; - return NULL; - } - + if (RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_MEMPOOL, rte_mempool_list) == NULL) { + rte_errno = E_RTE_NO_TAILQ; + return NULL; + } + /* asked cache too big */ if (cache_size > RTE_MEMPOOL_CACHE_MAX_SIZE){ rte_errno = EINVAL; @@ -181,6 +179,8 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, if (flags & MEMPOOL_F_SC_GET) rg_flags |= RING_F_SC_DEQ; + rte_rwlock_write_lock(RTE_EAL_MEMPOOL_RWLOCK); + /* allocate the ring that will be used to store objects */ /* Ring functions will return appropriate errors if we are * running as a secondary process etc., so no checks made @@ -188,7 +188,7 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, rte_snprintf(rg_name, sizeof(rg_name), "MP_%s", name); r = rte_ring_create(rg_name, rte_align32pow2(n+1), socket_id, rg_flags); if (r == NULL) - return NULL; + goto exit; /* * In header, we have at least the pointer to the pool, and @@ -239,6 +239,7 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, mempool_size = total_elt_size * n + sizeof(struct rte_mempool) + private_data_size; rte_snprintf(mz_name, sizeof(mz_name), "MP_%s", name); + mz = rte_memzone_reserve(mz_name, mempool_size, socket_id, mz_flags); /* @@ -246,7 +247,7 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, * space for the as we cannot free it */ if (mz == NULL) - return NULL; + goto exit; /* init the mempool structure */ mp = mz->addr; @@ -256,11 +257,11 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, mp->ring = r; mp->size = n; mp->flags = flags; - mp->bulk_default = 1; mp->elt_size = elt_size; mp->header_size = header_size; mp->trailer_size = trailer_size; mp->cache_size = cache_size; + mp->cache_flushthresh = (uint32_t)(cache_size * CACHE_FLUSHTHRESH_MULTIPLIER); mp->private_data_size = private_data_size; /* call the initializer */ @@ -290,7 +291,11 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, obj = (char *)obj + elt_size + trailer_size; } - TAILQ_INSERT_TAIL(mempool_list, mp, next); + RTE_EAL_TAILQ_INSERT_TAIL(RTE_TAILQ_MEMPOOL, rte_mempool_list, mp); + +exit: + rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK); + return mp; } @@ -382,7 +387,7 @@ mempool_audit_cache(const struct rte_mempool *mp) /* check cache size consistency */ unsigned lcore_id; for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { - if (mp->local_cache[lcore_id].len > mp->cache_size) { + if (mp->local_cache[lcore_id].len > mp->cache_flushthresh) { RTE_LOG(CRIT, MEMPOOL, "badness on cache[%u]\n", lcore_id); rte_panic("MEMPOOL: invalid cache len\n"); @@ -400,6 +405,9 @@ rte_mempool_audit(const struct rte_mempool *mp) { mempool_audit_cache(mp); mempool_audit_cookies(mp); + + /* For case where mempool DEBUG is not set, and cache size is 0 */ + RTE_SET_USED(mp); } /* dump the status of the mempool on the console */ @@ -417,7 +425,6 @@ rte_mempool_dump(const struct rte_mempool *mp) printf(" flags=%x\n", mp->flags); printf(" ring=<%s>@%p\n", mp->ring->name, mp->ring); printf(" size=%"PRIu32"\n", mp->size); - printf(" bulk_default=%"PRIu32"\n", mp->bulk_default); printf(" header_size=%"PRIu32"\n", mp->header_size); printf(" elt_size=%"PRIu32"\n", mp->elt_size); printf(" trailer_size=%"PRIu32"\n", mp->trailer_size); @@ -460,10 +467,21 @@ void rte_mempool_list_dump(void) { const struct rte_mempool *mp = 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; + } + + rte_rwlock_read_lock(RTE_EAL_MEMPOOL_RWLOCK); TAILQ_FOREACH(mp, mempool_list, next) { rte_mempool_dump(mp); } + + rte_rwlock_read_unlock(RTE_EAL_MEMPOOL_RWLOCK); } /* search a mempool from its name */ @@ -471,19 +489,23 @@ struct rte_mempool * rte_mempool_lookup(const char *name) { struct rte_mempool *mp = NULL; + struct rte_mempool_list *mempool_list; - /* check that we have an initialised tail queue */ - if (mempool_list == NULL) - if ((mempool_list = RTE_TAILQ_RESERVE("RTE_MEMPOOL", \ - rte_mempool_list)) == NULL){ - rte_errno = E_RTE_NO_TAILQ; - return NULL; - } + if ((mempool_list = + RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_MEMPOOL, rte_mempool_list)) == NULL) { + rte_errno = E_RTE_NO_TAILQ; + return NULL; + } + + rte_rwlock_read_lock(RTE_EAL_MEMPOOL_RWLOCK); TAILQ_FOREACH(mp, mempool_list, next) { if (strncmp(name, mp->name, RTE_MEMPOOL_NAMESIZE) == 0) break; } + + rte_rwlock_read_unlock(RTE_EAL_MEMPOOL_RWLOCK); + if (mp == NULL) rte_errno = ENOENT;