| 486 | } |
| 487 | |
| 488 | static int |
| 489 | vring_translate_split(struct virtio_net *dev, struct vhost_virtqueue *vq) |
| 490 | __rte_shared_locks_required(&vq->iotlb_lock) |
| 491 | { |
| 492 | uint64_t req_size, size; |
| 493 | |
| 494 | req_size = sizeof(struct vring_desc) * vq->size; |
| 495 | size = req_size; |
| 496 | vq->desc = (struct vring_desc *)(uintptr_t)vhost_iova_to_vva(dev, vq, |
| 497 | vq->ring_addrs.desc_user_addr, |
| 498 | &size, VHOST_ACCESS_RO); |
| 499 | if (!vq->desc || size != req_size) |
| 500 | return -1; |
| 501 | |
| 502 | req_size = sizeof(struct vring_avail); |
| 503 | req_size += sizeof(uint16_t) * vq->size; |
| 504 | if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) |
| 505 | req_size += sizeof(uint16_t); |
| 506 | size = req_size; |
| 507 | vq->avail = (struct vring_avail *)(uintptr_t)vhost_iova_to_vva(dev, vq, |
| 508 | vq->ring_addrs.avail_user_addr, |
| 509 | &size, VHOST_ACCESS_RO); |
| 510 | if (!vq->avail || size != req_size) |
| 511 | return -1; |
| 512 | |
| 513 | req_size = sizeof(struct vring_used); |
| 514 | req_size += sizeof(struct vring_used_elem) * vq->size; |
| 515 | if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) |
| 516 | req_size += sizeof(uint16_t); |
| 517 | size = req_size; |
| 518 | vq->used = (struct vring_used *)(uintptr_t)vhost_iova_to_vva(dev, vq, |
| 519 | vq->ring_addrs.used_user_addr, |
| 520 | &size, VHOST_ACCESS_RW); |
| 521 | if (!vq->used || size != req_size) |
| 522 | return -1; |
| 523 | |
| 524 | return 0; |
| 525 | } |
| 526 | |
| 527 | static int |
| 528 | vring_translate_packed(struct virtio_net *dev, struct vhost_virtqueue *vq) |