| 1023 | } |
| 1024 | |
| 1025 | static int |
| 1026 | add_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? */ |
no test coverage detected