X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_mempool%2Frte_mempool.c;h=ff95f4185a40ac7e6ae1c099be05ad867319414b;hb=b6197a7beb511f273aeca829c59355d993353261;hp=78d8eb941e301eb1df20375e5d65bab6954f0f13;hpb=9160d6386472b70503e504df765440ecdb604d7d;p=dpdk.git diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index 78d8eb941e..ff95f4185a 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "rte_mempool.h" @@ -293,12 +294,17 @@ mempool_ops_alloc_once(struct rte_mempool *mp) return 0; } +int +rte_mempool_populate_iova_v20_0_1(struct rte_mempool *mp, char *vaddr, + rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, + void *opaque); + /* Add objects in the pool, using a physically contiguous memory * zone. Return the number of objects added, or a negative value * on error. */ int -rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, +rte_mempool_populate_iova_v20_0_1(struct rte_mempool *mp, char *vaddr, rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, void *opaque) { @@ -332,7 +338,7 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, off = RTE_PTR_ALIGN_CEIL(vaddr, RTE_MEMPOOL_ALIGN) - vaddr; if (off > len) { - ret = -EINVAL; + ret = -ENOBUFS; goto fail; } @@ -343,7 +349,7 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, /* not enough room to store one object */ if (i == 0) { - ret = -EINVAL; + ret = -ENOBUFS; goto fail; } @@ -355,6 +361,33 @@ fail: rte_free(memhdr); return ret; } +BIND_DEFAULT_SYMBOL(rte_mempool_populate_iova, _v20_0_1, 20.0.1); +MAP_STATIC_SYMBOL( + int rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, + rte_iova_t iova, size_t len, + rte_mempool_memchunk_free_cb_t *free_cb, + void *opaque), + rte_mempool_populate_iova_v20_0_1); + +int +rte_mempool_populate_iova_v20_0(struct rte_mempool *mp, char *vaddr, + rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, + void *opaque); +int +rte_mempool_populate_iova_v20_0(struct rte_mempool *mp, char *vaddr, + rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, + void *opaque) +{ + int ret; + + ret = rte_mempool_populate_iova_v20_0_1(mp, vaddr, iova, len, free_cb, + opaque); + if (ret == -ENOBUFS) + ret = -EINVAL; + + return ret; +} +VERSION_SYMBOL(rte_mempool_populate_iova, _v20_0, 20.0); static rte_iova_t get_iova(void *addr) @@ -381,6 +414,13 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, size_t off, phys_len; int ret, cnt = 0; + /* call alloc_once() in advance, it avoids a misinterpretation + * of -ENOBUFS when delegated to rte_mempool_populate_iova(). + */ + ret = mempool_ops_alloc_once(mp); + if (ret != 0) + return ret; + if (mp->flags & MEMPOOL_F_NO_IOVA_CONTIG) return rte_mempool_populate_iova(mp, addr, RTE_BAD_IOVA, len, free_cb, opaque); @@ -406,8 +446,10 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, break; } - ret = rte_mempool_populate_iova(mp, addr + off, iova, + ret = rte_mempool_populate_iova_v20_0_1(mp, addr + off, iova, phys_len, free_cb, opaque); + if (ret == -ENOBUFS) + continue; if (ret < 0) goto fail; /* no need to call the free callback for next chunks */