populate the mempool with an anonymous mapping */
| 659 | |
| 660 | /* populate the mempool with an anonymous mapping */ |
| 661 | int |
| 662 | rte_mempool_populate_anon(struct rte_mempool *mp) |
| 663 | { |
| 664 | ssize_t size; |
| 665 | int ret; |
| 666 | char *addr; |
| 667 | |
| 668 | /* mempool is already populated, error */ |
| 669 | if ((!STAILQ_EMPTY(&mp->mem_list)) || mp->nb_mem_chunks != 0) { |
| 670 | rte_errno = EINVAL; |
| 671 | return 0; |
| 672 | } |
| 673 | |
| 674 | ret = mempool_ops_alloc_once(mp); |
| 675 | if (ret < 0) { |
| 676 | rte_errno = -ret; |
| 677 | return 0; |
| 678 | } |
| 679 | |
| 680 | size = get_anon_size(mp); |
| 681 | if (size < 0) { |
| 682 | rte_errno = -size; |
| 683 | return 0; |
| 684 | } |
| 685 | |
| 686 | /* get chunk of virtually continuous memory */ |
| 687 | addr = rte_mem_map(NULL, size, RTE_PROT_READ | RTE_PROT_WRITE, |
| 688 | RTE_MAP_SHARED | RTE_MAP_ANONYMOUS, -1, 0); |
| 689 | if (addr == NULL) |
| 690 | return 0; |
| 691 | /* can't use MMAP_LOCKED, it does not exist on BSD */ |
| 692 | if (rte_mem_lock(addr, size) < 0) { |
| 693 | rte_mem_unmap(addr, size); |
| 694 | return 0; |
| 695 | } |
| 696 | |
| 697 | ret = rte_mempool_populate_virt(mp, addr, size, rte_mem_page_size(), |
| 698 | rte_mempool_memchunk_anon_free, addr); |
| 699 | if (ret == 0) /* should not happen */ |
| 700 | ret = -ENOBUFS; |
| 701 | if (ret < 0) { |
| 702 | rte_errno = -ret; |
| 703 | goto fail; |
| 704 | } |
| 705 | |
| 706 | rte_mempool_trace_populate_anon(mp); |
| 707 | return mp->populated_size; |
| 708 | |
| 709 | fail: |
| 710 | rte_mempool_free_memchunks(mp); |
| 711 | return 0; |
| 712 | } |
| 713 | |
| 714 | /* free a mempool */ |
| 715 | void |