| 304 | } |
| 305 | |
| 306 | void * |
| 307 | vhost_alloc_copy_ind_table(struct virtio_net *dev, struct vhost_virtqueue *vq, |
| 308 | uint64_t desc_addr, uint64_t desc_len) |
| 309 | { |
| 310 | void *idesc; |
| 311 | uint64_t src, dst; |
| 312 | uint64_t len, remain = desc_len; |
| 313 | |
| 314 | idesc = rte_malloc_socket(__func__, desc_len, 0, vq->numa_node); |
| 315 | if (unlikely(!idesc)) |
| 316 | return NULL; |
| 317 | |
| 318 | dst = (uint64_t)(uintptr_t)idesc; |
| 319 | |
| 320 | while (remain) { |
| 321 | len = remain; |
| 322 | src = vhost_iova_to_vva(dev, vq, desc_addr, &len, |
| 323 | VHOST_ACCESS_RO); |
| 324 | if (unlikely(!src || !len)) { |
| 325 | rte_free(idesc); |
| 326 | return NULL; |
| 327 | } |
| 328 | |
| 329 | rte_memcpy((void *)(uintptr_t)dst, (void *)(uintptr_t)src, len); |
| 330 | |
| 331 | remain -= len; |
| 332 | dst += len; |
| 333 | desc_addr += len; |
| 334 | } |
| 335 | |
| 336 | return idesc; |
| 337 | } |
| 338 | |
| 339 | void |
| 340 | cleanup_vq(struct vhost_virtqueue *vq, int destroy) |
no test coverage detected