git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mempool: avoid division by zero
[dpdk.git]
/
lib
/
librte_mempool
/
rte_mempool.c
diff --git
a/lib/librte_mempool/rte_mempool.c
b/lib/librte_mempool/rte_mempool.c
index
a694a0b
..
b54de43
100644
(file)
--- a/
lib/librte_mempool/rte_mempool.c
+++ b/
lib/librte_mempool/rte_mempool.c
@@
-239,6
+239,9
@@
rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift)
{
size_t obj_per_page, pg_num, pg_sz;
{
size_t obj_per_page, pg_num, pg_sz;
+ if (total_elt_sz == 0)
+ return 0;
+
if (pg_shift == 0)
return total_elt_sz * elt_num;
if (pg_shift == 0)
return total_elt_sz * elt_num;
@@
-413,7
+416,11
@@
rte_mempool_populate_phys(struct rte_mempool *mp, char *vaddr,
while (off + total_elt_sz <= len && mp->populated_size < mp->size) {
off += mp->header_size;
while (off + total_elt_sz <= len && mp->populated_size < mp->size) {
off += mp->header_size;
- mempool_add_elem(mp, (char *)vaddr + off, paddr + off);
+ if (paddr == RTE_BAD_PHYS_ADDR)
+ mempool_add_elem(mp, (char *)vaddr + off,
+ RTE_BAD_PHYS_ADDR);
+ else
+ mempool_add_elem(mp, (char *)vaddr + off, paddr + off);
off += mp->elt_size + mp->trailer_size;
i++;
}
off += mp->elt_size + mp->trailer_size;
i++;
}
@@
-443,6
+450,10
@@
rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
if (mp->nb_mem_chunks != 0)
return -EEXIST;
if (mp->nb_mem_chunks != 0)
return -EEXIST;
+ if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
+ return rte_mempool_populate_phys(mp, vaddr, RTE_BAD_PHYS_ADDR,
+ pg_num * pg_sz, free_cb, opaque);
+
for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
/* populate with the largest group of contiguous pages */
for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
/* populate with the largest group of contiguous pages */
@@
-484,6
+495,10
@@
rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
if (RTE_ALIGN_CEIL(len, pg_sz) != len)
return -EINVAL;
if (RTE_ALIGN_CEIL(len, pg_sz) != len)
return -EINVAL;
+ if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
+ return rte_mempool_populate_phys(mp, addr, RTE_BAD_PHYS_ADDR,
+ len, free_cb, opaque);
+
for (off = 0; off + pg_sz <= len &&
mp->populated_size < mp->size; off += phys_len) {
for (off = 0; off + pg_sz <= len &&
mp->populated_size < mp->size; off += phys_len) {
@@
-534,6
+549,7
@@
rte_mempool_populate_default(struct rte_mempool *mp)
char mz_name[RTE_MEMZONE_NAMESIZE];
const struct rte_memzone *mz;
size_t size, total_elt_sz, align, pg_sz, pg_shift;
char mz_name[RTE_MEMZONE_NAMESIZE];
const struct rte_memzone *mz;
size_t size, total_elt_sz, align, pg_sz, pg_shift;
+ phys_addr_t paddr;
unsigned mz_id, n;
int ret;
unsigned mz_id, n;
int ret;
@@
-573,10
+589,14
@@
rte_mempool_populate_default(struct rte_mempool *mp)
goto fail;
}
goto fail;
}
- /* use memzone physical address if it is valid */
+ if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
+ paddr = RTE_BAD_PHYS_ADDR;
+ else
+ paddr = mz->phys_addr;
+
if (rte_eal_has_hugepages() && !rte_xen_dom0_supported())
ret = rte_mempool_populate_phys(mp, mz->addr,
if (rte_eal_has_hugepages() && !rte_xen_dom0_supported())
ret = rte_mempool_populate_phys(mp, mz->addr,
-
mz->phys_
addr, mz->len,
+
p
addr, mz->len,
rte_mempool_memchunk_mz_free,
(void *)(uintptr_t)mz);
else
rte_mempool_memchunk_mz_free,
(void *)(uintptr_t)mz);
else