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

Function add_guest_pages

dpdk/lib/vhost/vhost_user.c:1025–1067  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1023}
1024
1025static int
1026add_guest_pages(struct virtio_net *dev, struct rte_vhost_mem_region *reg,
1027 uint64_t page_size)
1028{
1029 uint64_t reg_size = reg->size;
1030 uint64_t host_user_addr = reg->host_user_addr;
1031 uint64_t guest_phys_addr = reg->guest_phys_addr;
1032 uint64_t host_iova;
1033 uint64_t size;
1034
1035 host_iova = rte_mem_virt2iova((void *)(uintptr_t)host_user_addr);
1036 size = page_size - (guest_phys_addr & (page_size - 1));
1037 size = RTE_MIN(size, reg_size);
1038
1039 if (add_one_guest_page(dev, guest_phys_addr, host_iova,
1040 host_user_addr, size) < 0)
1041 return -1;
1042
1043 host_user_addr += size;
1044 guest_phys_addr += size;
1045 reg_size -= size;
1046
1047 while (reg_size > 0) {
1048 size = RTE_MIN(reg_size, page_size);
1049 host_iova = rte_mem_virt2iova((void *)(uintptr_t)
1050 host_user_addr);
1051 if (add_one_guest_page(dev, guest_phys_addr, host_iova,
1052 host_user_addr, size) < 0)
1053 return -1;
1054
1055 host_user_addr += size;
1056 guest_phys_addr += size;
1057 reg_size -= size;
1058 }
1059
1060 /* sort guest page array if over binary search threshold */
1061 if (dev->nr_guest_pages >= VHOST_BINARY_SEARCH_THRESH) {
1062 qsort((void *)dev->guest_pages, dev->nr_guest_pages,
1063 sizeof(struct guest_page), guest_page_addrcmp);
1064 }
1065
1066 return 0;
1067}
1068
1069#ifdef RTE_LIBRTE_VHOST_DEBUG
1070/* TODO: enable it only in debug mode? */

Callers 1

vhost_user_mmap_regionFunction · 0.85

Calls 3

add_one_guest_pageFunction · 0.85
qsortFunction · 0.85
rte_mem_virt2iovaFunction · 0.50

Tested by

no test coverage detected