MCPcopy Create free account
hub / github.com/F-Stack/f-stack / rte_mempool_populate_virt

Function rte_mempool_populate_virt

dpdk/lib/mempool/rte_mempool.c:400–451  ·  view source on GitHub ↗

Populate the mempool with a virtual area. Return the number of * objects added, or a negative value on error. */

Source from the content-addressed store, hash-verified

398 * objects added, or a negative value on error.
399 */
400int
401rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
402 size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb,
403 void *opaque)
404{
405 rte_iova_t iova;
406 size_t off, phys_len;
407 int ret, cnt = 0;
408
409 if (mp->flags & RTE_MEMPOOL_F_NO_IOVA_CONTIG)
410 return rte_mempool_populate_iova(mp, addr, RTE_BAD_IOVA,
411 len, free_cb, opaque);
412
413 for (off = 0; off < len &&
414 mp->populated_size < mp->size; off += phys_len) {
415
416 iova = get_iova(addr + off);
417
418 /* populate with the largest group of contiguous pages */
419 for (phys_len = RTE_MIN(
420 (size_t)(RTE_PTR_ALIGN_CEIL(addr + off + 1, pg_sz) -
421 (addr + off)),
422 len - off);
423 off + phys_len < len;
424 phys_len = RTE_MIN(phys_len + pg_sz, len - off)) {
425 rte_iova_t iova_tmp;
426
427 iova_tmp = get_iova(addr + off + phys_len);
428
429 if (iova_tmp == RTE_BAD_IOVA ||
430 iova_tmp != iova + phys_len)
431 break;
432 }
433
434 ret = rte_mempool_populate_iova(mp, addr + off, iova,
435 phys_len, free_cb, opaque);
436 if (ret == 0)
437 continue;
438 if (ret < 0)
439 goto fail;
440 /* no need to call the free callback for next chunks */
441 free_cb = NULL;
442 cnt += ret;
443 }
444
445 rte_mempool_trace_populate_virt(mp, addr, len, pg_sz, free_cb, opaque);
446 return cnt;
447
448 fail:
449 rte_mempool_free_memchunks(mp);
450 return ret;
451}
452
453/* Get the minimal page size used in a mempool before populating it. */
454int

Callers 2

Calls 3

get_iovaFunction · 0.85

Tested by

no test coverage detected