{
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;
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++;
}
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 */
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) {
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;
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,
- mz->phys_addr, mz->len,
+ paddr, mz->len,
rte_mempool_memchunk_mz_free,
(void *)(uintptr_t)mz);
else