qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

vhost-vdpa.c (38614B)


      1 /*
      2  * vhost-vdpa
      3  *
      4  *  Copyright(c) 2017-2018 Intel Corporation.
      5  *  Copyright(c) 2020 Red Hat, Inc.
      6  *
      7  * This work is licensed under the terms of the GNU GPL, version 2 or later.
      8  * See the COPYING file in the top-level directory.
      9  *
     10  */
     11 
     12 #include "qemu/osdep.h"
     13 #include <linux/vhost.h>
     14 #include <linux/vfio.h>
     15 #include <sys/eventfd.h>
     16 #include <sys/ioctl.h>
     17 #include "hw/virtio/vhost.h"
     18 #include "hw/virtio/vhost-backend.h"
     19 #include "hw/virtio/virtio-net.h"
     20 #include "hw/virtio/vhost-shadow-virtqueue.h"
     21 #include "hw/virtio/vhost-vdpa.h"
     22 #include "exec/address-spaces.h"
     23 #include "migration/blocker.h"
     24 #include "qemu/cutils.h"
     25 #include "qemu/main-loop.h"
     26 #include "cpu.h"
     27 #include "trace.h"
     28 #include "qapi/error.h"
     29 
     30 /*
     31  * Return one past the end of the end of section. Be careful with uint64_t
     32  * conversions!
     33  */
     34 static Int128 vhost_vdpa_section_end(const MemoryRegionSection *section)
     35 {
     36     Int128 llend = int128_make64(section->offset_within_address_space);
     37     llend = int128_add(llend, section->size);
     38     llend = int128_and(llend, int128_exts64(TARGET_PAGE_MASK));
     39 
     40     return llend;
     41 }
     42 
     43 static bool vhost_vdpa_listener_skipped_section(MemoryRegionSection *section,
     44                                                 uint64_t iova_min,
     45                                                 uint64_t iova_max)
     46 {
     47     Int128 llend;
     48 
     49     if ((!memory_region_is_ram(section->mr) &&
     50          !memory_region_is_iommu(section->mr)) ||
     51         memory_region_is_protected(section->mr) ||
     52         /* vhost-vDPA doesn't allow MMIO to be mapped  */
     53         memory_region_is_ram_device(section->mr)) {
     54         return true;
     55     }
     56 
     57     if (section->offset_within_address_space < iova_min) {
     58         error_report("RAM section out of device range (min=0x%" PRIx64
     59                      ", addr=0x%" HWADDR_PRIx ")",
     60                      iova_min, section->offset_within_address_space);
     61         return true;
     62     }
     63 
     64     llend = vhost_vdpa_section_end(section);
     65     if (int128_gt(llend, int128_make64(iova_max))) {
     66         error_report("RAM section out of device range (max=0x%" PRIx64
     67                      ", end addr=0x%" PRIx64 ")",
     68                      iova_max, int128_get64(llend));
     69         return true;
     70     }
     71 
     72     return false;
     73 }
     74 
     75 int vhost_vdpa_dma_map(struct vhost_vdpa *v, hwaddr iova, hwaddr size,
     76                        void *vaddr, bool readonly)
     77 {
     78     struct vhost_msg_v2 msg = {};
     79     int fd = v->device_fd;
     80     int ret = 0;
     81 
     82     msg.type = v->msg_type;
     83     msg.iotlb.iova = iova;
     84     msg.iotlb.size = size;
     85     msg.iotlb.uaddr = (uint64_t)(uintptr_t)vaddr;
     86     msg.iotlb.perm = readonly ? VHOST_ACCESS_RO : VHOST_ACCESS_RW;
     87     msg.iotlb.type = VHOST_IOTLB_UPDATE;
     88 
     89    trace_vhost_vdpa_dma_map(v, fd, msg.type, msg.iotlb.iova, msg.iotlb.size,
     90                             msg.iotlb.uaddr, msg.iotlb.perm, msg.iotlb.type);
     91 
     92     if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
     93         error_report("failed to write, fd=%d, errno=%d (%s)",
     94             fd, errno, strerror(errno));
     95         return -EIO ;
     96     }
     97 
     98     return ret;
     99 }
    100 
    101 int vhost_vdpa_dma_unmap(struct vhost_vdpa *v, hwaddr iova, hwaddr size)
    102 {
    103     struct vhost_msg_v2 msg = {};
    104     int fd = v->device_fd;
    105     int ret = 0;
    106 
    107     msg.type = v->msg_type;
    108     msg.iotlb.iova = iova;
    109     msg.iotlb.size = size;
    110     msg.iotlb.type = VHOST_IOTLB_INVALIDATE;
    111 
    112     trace_vhost_vdpa_dma_unmap(v, fd, msg.type, msg.iotlb.iova,
    113                                msg.iotlb.size, msg.iotlb.type);
    114 
    115     if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
    116         error_report("failed to write, fd=%d, errno=%d (%s)",
    117             fd, errno, strerror(errno));
    118         return -EIO ;
    119     }
    120 
    121     return ret;
    122 }
    123 
    124 static void vhost_vdpa_listener_begin_batch(struct vhost_vdpa *v)
    125 {
    126     int fd = v->device_fd;
    127     struct vhost_msg_v2 msg = {
    128         .type = v->msg_type,
    129         .iotlb.type = VHOST_IOTLB_BATCH_BEGIN,
    130     };
    131 
    132     trace_vhost_vdpa_listener_begin_batch(v, fd, msg.type, msg.iotlb.type);
    133     if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
    134         error_report("failed to write, fd=%d, errno=%d (%s)",
    135                      fd, errno, strerror(errno));
    136     }
    137 }
    138 
    139 static void vhost_vdpa_iotlb_batch_begin_once(struct vhost_vdpa *v)
    140 {
    141     if (v->dev->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH) &&
    142         !v->iotlb_batch_begin_sent) {
    143         vhost_vdpa_listener_begin_batch(v);
    144     }
    145 
    146     v->iotlb_batch_begin_sent = true;
    147 }
    148 
    149 static void vhost_vdpa_listener_commit(MemoryListener *listener)
    150 {
    151     struct vhost_vdpa *v = container_of(listener, struct vhost_vdpa, listener);
    152     struct vhost_dev *dev = v->dev;
    153     struct vhost_msg_v2 msg = {};
    154     int fd = v->device_fd;
    155 
    156     if (!(dev->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
    157         return;
    158     }
    159 
    160     if (!v->iotlb_batch_begin_sent) {
    161         return;
    162     }
    163 
    164     msg.type = v->msg_type;
    165     msg.iotlb.type = VHOST_IOTLB_BATCH_END;
    166 
    167     trace_vhost_vdpa_listener_commit(v, fd, msg.type, msg.iotlb.type);
    168     if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
    169         error_report("failed to write, fd=%d, errno=%d (%s)",
    170                      fd, errno, strerror(errno));
    171     }
    172 
    173     v->iotlb_batch_begin_sent = false;
    174 }
    175 
    176 static void vhost_vdpa_listener_region_add(MemoryListener *listener,
    177                                            MemoryRegionSection *section)
    178 {
    179     DMAMap mem_region = {};
    180     struct vhost_vdpa *v = container_of(listener, struct vhost_vdpa, listener);
    181     hwaddr iova;
    182     Int128 llend, llsize;
    183     void *vaddr;
    184     int ret;
    185 
    186     if (vhost_vdpa_listener_skipped_section(section, v->iova_range.first,
    187                                             v->iova_range.last)) {
    188         return;
    189     }
    190 
    191     if (unlikely((section->offset_within_address_space & ~TARGET_PAGE_MASK) !=
    192                  (section->offset_within_region & ~TARGET_PAGE_MASK))) {
    193         error_report("%s received unaligned region", __func__);
    194         return;
    195     }
    196 
    197     iova = TARGET_PAGE_ALIGN(section->offset_within_address_space);
    198     llend = vhost_vdpa_section_end(section);
    199     if (int128_ge(int128_make64(iova), llend)) {
    200         return;
    201     }
    202 
    203     memory_region_ref(section->mr);
    204 
    205     /* Here we assume that memory_region_is_ram(section->mr)==true */
    206 
    207     vaddr = memory_region_get_ram_ptr(section->mr) +
    208             section->offset_within_region +
    209             (iova - section->offset_within_address_space);
    210 
    211     trace_vhost_vdpa_listener_region_add(v, iova, int128_get64(llend),
    212                                          vaddr, section->readonly);
    213 
    214     llsize = int128_sub(llend, int128_make64(iova));
    215     if (v->shadow_vqs_enabled) {
    216         int r;
    217 
    218         mem_region.translated_addr = (hwaddr)(uintptr_t)vaddr,
    219         mem_region.size = int128_get64(llsize) - 1,
    220         mem_region.perm = IOMMU_ACCESS_FLAG(true, section->readonly),
    221 
    222         r = vhost_iova_tree_map_alloc(v->iova_tree, &mem_region);
    223         if (unlikely(r != IOVA_OK)) {
    224             error_report("Can't allocate a mapping (%d)", r);
    225             goto fail;
    226         }
    227 
    228         iova = mem_region.iova;
    229     }
    230 
    231     vhost_vdpa_iotlb_batch_begin_once(v);
    232     ret = vhost_vdpa_dma_map(v, iova, int128_get64(llsize),
    233                              vaddr, section->readonly);
    234     if (ret) {
    235         error_report("vhost vdpa map fail!");
    236         goto fail_map;
    237     }
    238 
    239     return;
    240 
    241 fail_map:
    242     if (v->shadow_vqs_enabled) {
    243         vhost_iova_tree_remove(v->iova_tree, mem_region);
    244     }
    245 
    246 fail:
    247     /*
    248      * On the initfn path, store the first error in the container so we
    249      * can gracefully fail.  Runtime, there's not much we can do other
    250      * than throw a hardware error.
    251      */
    252     error_report("vhost-vdpa: DMA mapping failed, unable to continue");
    253     return;
    254 
    255 }
    256 
    257 static void vhost_vdpa_listener_region_del(MemoryListener *listener,
    258                                            MemoryRegionSection *section)
    259 {
    260     struct vhost_vdpa *v = container_of(listener, struct vhost_vdpa, listener);
    261     hwaddr iova;
    262     Int128 llend, llsize;
    263     int ret;
    264 
    265     if (vhost_vdpa_listener_skipped_section(section, v->iova_range.first,
    266                                             v->iova_range.last)) {
    267         return;
    268     }
    269 
    270     if (unlikely((section->offset_within_address_space & ~TARGET_PAGE_MASK) !=
    271                  (section->offset_within_region & ~TARGET_PAGE_MASK))) {
    272         error_report("%s received unaligned region", __func__);
    273         return;
    274     }
    275 
    276     iova = TARGET_PAGE_ALIGN(section->offset_within_address_space);
    277     llend = vhost_vdpa_section_end(section);
    278 
    279     trace_vhost_vdpa_listener_region_del(v, iova, int128_get64(llend));
    280 
    281     if (int128_ge(int128_make64(iova), llend)) {
    282         return;
    283     }
    284 
    285     llsize = int128_sub(llend, int128_make64(iova));
    286 
    287     if (v->shadow_vqs_enabled) {
    288         const DMAMap *result;
    289         const void *vaddr = memory_region_get_ram_ptr(section->mr) +
    290             section->offset_within_region +
    291             (iova - section->offset_within_address_space);
    292         DMAMap mem_region = {
    293             .translated_addr = (hwaddr)(uintptr_t)vaddr,
    294             .size = int128_get64(llsize) - 1,
    295         };
    296 
    297         result = vhost_iova_tree_find_iova(v->iova_tree, &mem_region);
    298         if (!result) {
    299             /* The memory listener map wasn't mapped */
    300             return;
    301         }
    302         iova = result->iova;
    303         vhost_iova_tree_remove(v->iova_tree, *result);
    304     }
    305     vhost_vdpa_iotlb_batch_begin_once(v);
    306     ret = vhost_vdpa_dma_unmap(v, iova, int128_get64(llsize));
    307     if (ret) {
    308         error_report("vhost_vdpa dma unmap error!");
    309     }
    310 
    311     memory_region_unref(section->mr);
    312 }
    313 /*
    314  * IOTLB API is used by vhost-vdpa which requires incremental updating
    315  * of the mapping. So we can not use generic vhost memory listener which
    316  * depends on the addnop().
    317  */
    318 static const MemoryListener vhost_vdpa_memory_listener = {
    319     .name = "vhost-vdpa",
    320     .commit = vhost_vdpa_listener_commit,
    321     .region_add = vhost_vdpa_listener_region_add,
    322     .region_del = vhost_vdpa_listener_region_del,
    323 };
    324 
    325 static int vhost_vdpa_call(struct vhost_dev *dev, unsigned long int request,
    326                              void *arg)
    327 {
    328     struct vhost_vdpa *v = dev->opaque;
    329     int fd = v->device_fd;
    330     int ret;
    331 
    332     assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
    333 
    334     ret = ioctl(fd, request, arg);
    335     return ret < 0 ? -errno : ret;
    336 }
    337 
    338 static int vhost_vdpa_add_status(struct vhost_dev *dev, uint8_t status)
    339 {
    340     uint8_t s;
    341     int ret;
    342 
    343     trace_vhost_vdpa_add_status(dev, status);
    344     ret = vhost_vdpa_call(dev, VHOST_VDPA_GET_STATUS, &s);
    345     if (ret < 0) {
    346         return ret;
    347     }
    348 
    349     s |= status;
    350 
    351     ret = vhost_vdpa_call(dev, VHOST_VDPA_SET_STATUS, &s);
    352     if (ret < 0) {
    353         return ret;
    354     }
    355 
    356     ret = vhost_vdpa_call(dev, VHOST_VDPA_GET_STATUS, &s);
    357     if (ret < 0) {
    358         return ret;
    359     }
    360 
    361     if (!(s & status)) {
    362         return -EIO;
    363     }
    364 
    365     return 0;
    366 }
    367 
    368 static void vhost_vdpa_get_iova_range(struct vhost_vdpa *v)
    369 {
    370     int ret = vhost_vdpa_call(v->dev, VHOST_VDPA_GET_IOVA_RANGE,
    371                               &v->iova_range);
    372     if (ret != 0) {
    373         v->iova_range.first = 0;
    374         v->iova_range.last = UINT64_MAX;
    375     }
    376 
    377     trace_vhost_vdpa_get_iova_range(v->dev, v->iova_range.first,
    378                                     v->iova_range.last);
    379 }
    380 
    381 /*
    382  * The use of this function is for requests that only need to be
    383  * applied once. Typically such request occurs at the beginning
    384  * of operation, and before setting up queues. It should not be
    385  * used for request that performs operation until all queues are
    386  * set, which would need to check dev->vq_index_end instead.
    387  */
    388 static bool vhost_vdpa_first_dev(struct vhost_dev *dev)
    389 {
    390     struct vhost_vdpa *v = dev->opaque;
    391 
    392     return v->index == 0;
    393 }
    394 
    395 static int vhost_vdpa_get_dev_features(struct vhost_dev *dev,
    396                                        uint64_t *features)
    397 {
    398     int ret;
    399 
    400     ret = vhost_vdpa_call(dev, VHOST_GET_FEATURES, features);
    401     trace_vhost_vdpa_get_features(dev, *features);
    402     return ret;
    403 }
    404 
    405 static int vhost_vdpa_init_svq(struct vhost_dev *hdev, struct vhost_vdpa *v,
    406                                Error **errp)
    407 {
    408     g_autoptr(GPtrArray) shadow_vqs = NULL;
    409     uint64_t dev_features, svq_features;
    410     int r;
    411     bool ok;
    412 
    413     if (!v->shadow_vqs_enabled) {
    414         return 0;
    415     }
    416 
    417     r = vhost_vdpa_get_dev_features(hdev, &dev_features);
    418     if (r != 0) {
    419         error_setg_errno(errp, -r, "Can't get vdpa device features");
    420         return r;
    421     }
    422 
    423     svq_features = dev_features;
    424     ok = vhost_svq_valid_features(svq_features, errp);
    425     if (unlikely(!ok)) {
    426         return -1;
    427     }
    428 
    429     shadow_vqs = g_ptr_array_new_full(hdev->nvqs, vhost_svq_free);
    430     for (unsigned n = 0; n < hdev->nvqs; ++n) {
    431         g_autoptr(VhostShadowVirtqueue) svq;
    432 
    433         svq = vhost_svq_new(v->iova_tree, v->shadow_vq_ops,
    434                             v->shadow_vq_ops_opaque);
    435         if (unlikely(!svq)) {
    436             error_setg(errp, "Cannot create svq %u", n);
    437             return -1;
    438         }
    439         g_ptr_array_add(shadow_vqs, g_steal_pointer(&svq));
    440     }
    441 
    442     v->shadow_vqs = g_steal_pointer(&shadow_vqs);
    443     return 0;
    444 }
    445 
    446 static int vhost_vdpa_init(struct vhost_dev *dev, void *opaque, Error **errp)
    447 {
    448     struct vhost_vdpa *v;
    449     assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
    450     trace_vhost_vdpa_init(dev, opaque);
    451     int ret;
    452 
    453     /*
    454      * Similar to VFIO, we end up pinning all guest memory and have to
    455      * disable discarding of RAM.
    456      */
    457     ret = ram_block_discard_disable(true);
    458     if (ret) {
    459         error_report("Cannot set discarding of RAM broken");
    460         return ret;
    461     }
    462 
    463     v = opaque;
    464     v->dev = dev;
    465     dev->opaque =  opaque ;
    466     v->listener = vhost_vdpa_memory_listener;
    467     v->msg_type = VHOST_IOTLB_MSG_V2;
    468     ret = vhost_vdpa_init_svq(dev, v, errp);
    469     if (ret) {
    470         goto err;
    471     }
    472 
    473     vhost_vdpa_get_iova_range(v);
    474 
    475     if (!vhost_vdpa_first_dev(dev)) {
    476         return 0;
    477     }
    478 
    479     vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
    480                                VIRTIO_CONFIG_S_DRIVER);
    481 
    482     return 0;
    483 
    484 err:
    485     ram_block_discard_disable(false);
    486     return ret;
    487 }
    488 
    489 static void vhost_vdpa_host_notifier_uninit(struct vhost_dev *dev,
    490                                             int queue_index)
    491 {
    492     size_t page_size = qemu_real_host_page_size();
    493     struct vhost_vdpa *v = dev->opaque;
    494     VirtIODevice *vdev = dev->vdev;
    495     VhostVDPAHostNotifier *n;
    496 
    497     n = &v->notifier[queue_index];
    498 
    499     if (n->addr) {
    500         virtio_queue_set_host_notifier_mr(vdev, queue_index, &n->mr, false);
    501         object_unparent(OBJECT(&n->mr));
    502         munmap(n->addr, page_size);
    503         n->addr = NULL;
    504     }
    505 }
    506 
    507 static int vhost_vdpa_host_notifier_init(struct vhost_dev *dev, int queue_index)
    508 {
    509     size_t page_size = qemu_real_host_page_size();
    510     struct vhost_vdpa *v = dev->opaque;
    511     VirtIODevice *vdev = dev->vdev;
    512     VhostVDPAHostNotifier *n;
    513     int fd = v->device_fd;
    514     void *addr;
    515     char *name;
    516 
    517     vhost_vdpa_host_notifier_uninit(dev, queue_index);
    518 
    519     n = &v->notifier[queue_index];
    520 
    521     addr = mmap(NULL, page_size, PROT_WRITE, MAP_SHARED, fd,
    522                 queue_index * page_size);
    523     if (addr == MAP_FAILED) {
    524         goto err;
    525     }
    526 
    527     name = g_strdup_printf("vhost-vdpa/host-notifier@%p mmaps[%d]",
    528                            v, queue_index);
    529     memory_region_init_ram_device_ptr(&n->mr, OBJECT(vdev), name,
    530                                       page_size, addr);
    531     g_free(name);
    532 
    533     if (virtio_queue_set_host_notifier_mr(vdev, queue_index, &n->mr, true)) {
    534         object_unparent(OBJECT(&n->mr));
    535         munmap(addr, page_size);
    536         goto err;
    537     }
    538     n->addr = addr;
    539 
    540     return 0;
    541 
    542 err:
    543     return -1;
    544 }
    545 
    546 static void vhost_vdpa_host_notifiers_uninit(struct vhost_dev *dev, int n)
    547 {
    548     int i;
    549 
    550     for (i = dev->vq_index; i < dev->vq_index + n; i++) {
    551         vhost_vdpa_host_notifier_uninit(dev, i);
    552     }
    553 }
    554 
    555 static void vhost_vdpa_host_notifiers_init(struct vhost_dev *dev)
    556 {
    557     struct vhost_vdpa *v = dev->opaque;
    558     int i;
    559 
    560     if (v->shadow_vqs_enabled) {
    561         /* FIXME SVQ is not compatible with host notifiers mr */
    562         return;
    563     }
    564 
    565     for (i = dev->vq_index; i < dev->vq_index + dev->nvqs; i++) {
    566         if (vhost_vdpa_host_notifier_init(dev, i)) {
    567             goto err;
    568         }
    569     }
    570 
    571     return;
    572 
    573 err:
    574     vhost_vdpa_host_notifiers_uninit(dev, i - dev->vq_index);
    575     return;
    576 }
    577 
    578 static void vhost_vdpa_svq_cleanup(struct vhost_dev *dev)
    579 {
    580     struct vhost_vdpa *v = dev->opaque;
    581     size_t idx;
    582 
    583     if (!v->shadow_vqs) {
    584         return;
    585     }
    586 
    587     for (idx = 0; idx < v->shadow_vqs->len; ++idx) {
    588         vhost_svq_stop(g_ptr_array_index(v->shadow_vqs, idx));
    589     }
    590     g_ptr_array_free(v->shadow_vqs, true);
    591 }
    592 
    593 static int vhost_vdpa_cleanup(struct vhost_dev *dev)
    594 {
    595     struct vhost_vdpa *v;
    596     assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
    597     v = dev->opaque;
    598     trace_vhost_vdpa_cleanup(dev, v);
    599     vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs);
    600     memory_listener_unregister(&v->listener);
    601     vhost_vdpa_svq_cleanup(dev);
    602 
    603     dev->opaque = NULL;
    604     ram_block_discard_disable(false);
    605 
    606     return 0;
    607 }
    608 
    609 static int vhost_vdpa_memslots_limit(struct vhost_dev *dev)
    610 {
    611     trace_vhost_vdpa_memslots_limit(dev, INT_MAX);
    612     return INT_MAX;
    613 }
    614 
    615 static int vhost_vdpa_set_mem_table(struct vhost_dev *dev,
    616                                     struct vhost_memory *mem)
    617 {
    618     if (!vhost_vdpa_first_dev(dev)) {
    619         return 0;
    620     }
    621 
    622     trace_vhost_vdpa_set_mem_table(dev, mem->nregions, mem->padding);
    623     if (trace_event_get_state_backends(TRACE_VHOST_VDPA_SET_MEM_TABLE) &&
    624         trace_event_get_state_backends(TRACE_VHOST_VDPA_DUMP_REGIONS)) {
    625         int i;
    626         for (i = 0; i < mem->nregions; i++) {
    627             trace_vhost_vdpa_dump_regions(dev, i,
    628                                           mem->regions[i].guest_phys_addr,
    629                                           mem->regions[i].memory_size,
    630                                           mem->regions[i].userspace_addr,
    631                                           mem->regions[i].flags_padding);
    632         }
    633     }
    634     if (mem->padding) {
    635         return -EINVAL;
    636     }
    637 
    638     return 0;
    639 }
    640 
    641 static int vhost_vdpa_set_features(struct vhost_dev *dev,
    642                                    uint64_t features)
    643 {
    644     struct vhost_vdpa *v = dev->opaque;
    645     int ret;
    646 
    647     if (!vhost_vdpa_first_dev(dev)) {
    648         return 0;
    649     }
    650 
    651     if (v->shadow_vqs_enabled) {
    652         if ((v->acked_features ^ features) == BIT_ULL(VHOST_F_LOG_ALL)) {
    653             /*
    654              * QEMU is just trying to enable or disable logging. SVQ handles
    655              * this sepparately, so no need to forward this.
    656              */
    657             v->acked_features = features;
    658             return 0;
    659         }
    660 
    661         v->acked_features = features;
    662 
    663         /* We must not ack _F_LOG if SVQ is enabled */
    664         features &= ~BIT_ULL(VHOST_F_LOG_ALL);
    665     }
    666 
    667     trace_vhost_vdpa_set_features(dev, features);
    668     ret = vhost_vdpa_call(dev, VHOST_SET_FEATURES, &features);
    669     if (ret) {
    670         return ret;
    671     }
    672 
    673     return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_FEATURES_OK);
    674 }
    675 
    676 static int vhost_vdpa_set_backend_cap(struct vhost_dev *dev)
    677 {
    678     uint64_t features;
    679     uint64_t f = 0x1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2 |
    680         0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH;
    681     int r;
    682 
    683     if (vhost_vdpa_call(dev, VHOST_GET_BACKEND_FEATURES, &features)) {
    684         return -EFAULT;
    685     }
    686 
    687     features &= f;
    688 
    689     if (vhost_vdpa_first_dev(dev)) {
    690         r = vhost_vdpa_call(dev, VHOST_SET_BACKEND_FEATURES, &features);
    691         if (r) {
    692             return -EFAULT;
    693         }
    694     }
    695 
    696     dev->backend_cap = features;
    697 
    698     return 0;
    699 }
    700 
    701 static int vhost_vdpa_get_device_id(struct vhost_dev *dev,
    702                                     uint32_t *device_id)
    703 {
    704     int ret;
    705     ret = vhost_vdpa_call(dev, VHOST_VDPA_GET_DEVICE_ID, device_id);
    706     trace_vhost_vdpa_get_device_id(dev, *device_id);
    707     return ret;
    708 }
    709 
    710 static void vhost_vdpa_reset_svq(struct vhost_vdpa *v)
    711 {
    712     if (!v->shadow_vqs_enabled) {
    713         return;
    714     }
    715 
    716     for (unsigned i = 0; i < v->shadow_vqs->len; ++i) {
    717         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, i);
    718         vhost_svq_stop(svq);
    719     }
    720 }
    721 
    722 static int vhost_vdpa_reset_device(struct vhost_dev *dev)
    723 {
    724     struct vhost_vdpa *v = dev->opaque;
    725     int ret;
    726     uint8_t status = 0;
    727 
    728     vhost_vdpa_reset_svq(v);
    729 
    730     ret = vhost_vdpa_call(dev, VHOST_VDPA_SET_STATUS, &status);
    731     trace_vhost_vdpa_reset_device(dev, status);
    732     return ret;
    733 }
    734 
    735 static int vhost_vdpa_get_vq_index(struct vhost_dev *dev, int idx)
    736 {
    737     assert(idx >= dev->vq_index && idx < dev->vq_index + dev->nvqs);
    738 
    739     trace_vhost_vdpa_get_vq_index(dev, idx, idx);
    740     return idx;
    741 }
    742 
    743 static int vhost_vdpa_set_vring_ready(struct vhost_dev *dev)
    744 {
    745     int i;
    746     trace_vhost_vdpa_set_vring_ready(dev);
    747     for (i = 0; i < dev->nvqs; ++i) {
    748         struct vhost_vring_state state = {
    749             .index = dev->vq_index + i,
    750             .num = 1,
    751         };
    752         vhost_vdpa_call(dev, VHOST_VDPA_SET_VRING_ENABLE, &state);
    753     }
    754     return 0;
    755 }
    756 
    757 static void vhost_vdpa_dump_config(struct vhost_dev *dev, const uint8_t *config,
    758                                    uint32_t config_len)
    759 {
    760     int b, len;
    761     char line[QEMU_HEXDUMP_LINE_LEN];
    762 
    763     for (b = 0; b < config_len; b += 16) {
    764         len = config_len - b;
    765         qemu_hexdump_line(line, b, config, len, false);
    766         trace_vhost_vdpa_dump_config(dev, line);
    767     }
    768 }
    769 
    770 static int vhost_vdpa_set_config(struct vhost_dev *dev, const uint8_t *data,
    771                                    uint32_t offset, uint32_t size,
    772                                    uint32_t flags)
    773 {
    774     struct vhost_vdpa_config *config;
    775     int ret;
    776     unsigned long config_size = offsetof(struct vhost_vdpa_config, buf);
    777 
    778     trace_vhost_vdpa_set_config(dev, offset, size, flags);
    779     config = g_malloc(size + config_size);
    780     config->off = offset;
    781     config->len = size;
    782     memcpy(config->buf, data, size);
    783     if (trace_event_get_state_backends(TRACE_VHOST_VDPA_SET_CONFIG) &&
    784         trace_event_get_state_backends(TRACE_VHOST_VDPA_DUMP_CONFIG)) {
    785         vhost_vdpa_dump_config(dev, data, size);
    786     }
    787     ret = vhost_vdpa_call(dev, VHOST_VDPA_SET_CONFIG, config);
    788     g_free(config);
    789     return ret;
    790 }
    791 
    792 static int vhost_vdpa_get_config(struct vhost_dev *dev, uint8_t *config,
    793                                    uint32_t config_len, Error **errp)
    794 {
    795     struct vhost_vdpa_config *v_config;
    796     unsigned long config_size = offsetof(struct vhost_vdpa_config, buf);
    797     int ret;
    798 
    799     trace_vhost_vdpa_get_config(dev, config, config_len);
    800     v_config = g_malloc(config_len + config_size);
    801     v_config->len = config_len;
    802     v_config->off = 0;
    803     ret = vhost_vdpa_call(dev, VHOST_VDPA_GET_CONFIG, v_config);
    804     memcpy(config, v_config->buf, config_len);
    805     g_free(v_config);
    806     if (trace_event_get_state_backends(TRACE_VHOST_VDPA_GET_CONFIG) &&
    807         trace_event_get_state_backends(TRACE_VHOST_VDPA_DUMP_CONFIG)) {
    808         vhost_vdpa_dump_config(dev, config, config_len);
    809     }
    810     return ret;
    811  }
    812 
    813 static int vhost_vdpa_set_dev_vring_base(struct vhost_dev *dev,
    814                                          struct vhost_vring_state *ring)
    815 {
    816     trace_vhost_vdpa_set_vring_base(dev, ring->index, ring->num);
    817     return vhost_vdpa_call(dev, VHOST_SET_VRING_BASE, ring);
    818 }
    819 
    820 static int vhost_vdpa_set_vring_dev_kick(struct vhost_dev *dev,
    821                                          struct vhost_vring_file *file)
    822 {
    823     trace_vhost_vdpa_set_vring_kick(dev, file->index, file->fd);
    824     return vhost_vdpa_call(dev, VHOST_SET_VRING_KICK, file);
    825 }
    826 
    827 static int vhost_vdpa_set_vring_dev_call(struct vhost_dev *dev,
    828                                          struct vhost_vring_file *file)
    829 {
    830     trace_vhost_vdpa_set_vring_call(dev, file->index, file->fd);
    831     return vhost_vdpa_call(dev, VHOST_SET_VRING_CALL, file);
    832 }
    833 
    834 static int vhost_vdpa_set_vring_dev_addr(struct vhost_dev *dev,
    835                                          struct vhost_vring_addr *addr)
    836 {
    837     trace_vhost_vdpa_set_vring_addr(dev, addr->index, addr->flags,
    838                                 addr->desc_user_addr, addr->used_user_addr,
    839                                 addr->avail_user_addr,
    840                                 addr->log_guest_addr);
    841 
    842     return vhost_vdpa_call(dev, VHOST_SET_VRING_ADDR, addr);
    843 
    844 }
    845 
    846 /**
    847  * Set the shadow virtqueue descriptors to the device
    848  *
    849  * @dev: The vhost device model
    850  * @svq: The shadow virtqueue
    851  * @idx: The index of the virtqueue in the vhost device
    852  * @errp: Error
    853  *
    854  * Note that this function does not rewind kick file descriptor if cannot set
    855  * call one.
    856  */
    857 static int vhost_vdpa_svq_set_fds(struct vhost_dev *dev,
    858                                   VhostShadowVirtqueue *svq, unsigned idx,
    859                                   Error **errp)
    860 {
    861     struct vhost_vring_file file = {
    862         .index = dev->vq_index + idx,
    863     };
    864     const EventNotifier *event_notifier = &svq->hdev_kick;
    865     int r;
    866 
    867     file.fd = event_notifier_get_fd(event_notifier);
    868     r = vhost_vdpa_set_vring_dev_kick(dev, &file);
    869     if (unlikely(r != 0)) {
    870         error_setg_errno(errp, -r, "Can't set device kick fd");
    871         return r;
    872     }
    873 
    874     event_notifier = &svq->hdev_call;
    875     file.fd = event_notifier_get_fd(event_notifier);
    876     r = vhost_vdpa_set_vring_dev_call(dev, &file);
    877     if (unlikely(r != 0)) {
    878         error_setg_errno(errp, -r, "Can't set device call fd");
    879     }
    880 
    881     return r;
    882 }
    883 
    884 /**
    885  * Unmap a SVQ area in the device
    886  */
    887 static void vhost_vdpa_svq_unmap_ring(struct vhost_vdpa *v, hwaddr addr)
    888 {
    889     const DMAMap needle = {
    890         .translated_addr = addr,
    891     };
    892     const DMAMap *result = vhost_iova_tree_find_iova(v->iova_tree, &needle);
    893     hwaddr size;
    894     int r;
    895 
    896     if (unlikely(!result)) {
    897         error_report("Unable to find SVQ address to unmap");
    898         return;
    899     }
    900 
    901     size = ROUND_UP(result->size, qemu_real_host_page_size());
    902     r = vhost_vdpa_dma_unmap(v, result->iova, size);
    903     if (unlikely(r < 0)) {
    904         error_report("Unable to unmap SVQ vring: %s (%d)", g_strerror(-r), -r);
    905         return;
    906     }
    907 
    908     vhost_iova_tree_remove(v->iova_tree, *result);
    909 }
    910 
    911 static void vhost_vdpa_svq_unmap_rings(struct vhost_dev *dev,
    912                                        const VhostShadowVirtqueue *svq)
    913 {
    914     struct vhost_vdpa *v = dev->opaque;
    915     struct vhost_vring_addr svq_addr;
    916 
    917     vhost_svq_get_vring_addr(svq, &svq_addr);
    918 
    919     vhost_vdpa_svq_unmap_ring(v, svq_addr.desc_user_addr);
    920 
    921     vhost_vdpa_svq_unmap_ring(v, svq_addr.used_user_addr);
    922 }
    923 
    924 /**
    925  * Map the SVQ area in the device
    926  *
    927  * @v: Vhost-vdpa device
    928  * @needle: The area to search iova
    929  * @errorp: Error pointer
    930  */
    931 static bool vhost_vdpa_svq_map_ring(struct vhost_vdpa *v, DMAMap *needle,
    932                                     Error **errp)
    933 {
    934     int r;
    935 
    936     r = vhost_iova_tree_map_alloc(v->iova_tree, needle);
    937     if (unlikely(r != IOVA_OK)) {
    938         error_setg(errp, "Cannot allocate iova (%d)", r);
    939         return false;
    940     }
    941 
    942     r = vhost_vdpa_dma_map(v, needle->iova, needle->size + 1,
    943                            (void *)(uintptr_t)needle->translated_addr,
    944                            needle->perm == IOMMU_RO);
    945     if (unlikely(r != 0)) {
    946         error_setg_errno(errp, -r, "Cannot map region to device");
    947         vhost_iova_tree_remove(v->iova_tree, *needle);
    948     }
    949 
    950     return r == 0;
    951 }
    952 
    953 /**
    954  * Map the shadow virtqueue rings in the device
    955  *
    956  * @dev: The vhost device
    957  * @svq: The shadow virtqueue
    958  * @addr: Assigned IOVA addresses
    959  * @errp: Error pointer
    960  */
    961 static bool vhost_vdpa_svq_map_rings(struct vhost_dev *dev,
    962                                      const VhostShadowVirtqueue *svq,
    963                                      struct vhost_vring_addr *addr,
    964                                      Error **errp)
    965 {
    966     DMAMap device_region, driver_region;
    967     struct vhost_vring_addr svq_addr;
    968     struct vhost_vdpa *v = dev->opaque;
    969     size_t device_size = vhost_svq_device_area_size(svq);
    970     size_t driver_size = vhost_svq_driver_area_size(svq);
    971     size_t avail_offset;
    972     bool ok;
    973 
    974     ERRP_GUARD();
    975     vhost_svq_get_vring_addr(svq, &svq_addr);
    976 
    977     driver_region = (DMAMap) {
    978         .translated_addr = svq_addr.desc_user_addr,
    979         .size = driver_size - 1,
    980         .perm = IOMMU_RO,
    981     };
    982     ok = vhost_vdpa_svq_map_ring(v, &driver_region, errp);
    983     if (unlikely(!ok)) {
    984         error_prepend(errp, "Cannot create vq driver region: ");
    985         return false;
    986     }
    987     addr->desc_user_addr = driver_region.iova;
    988     avail_offset = svq_addr.avail_user_addr - svq_addr.desc_user_addr;
    989     addr->avail_user_addr = driver_region.iova + avail_offset;
    990 
    991     device_region = (DMAMap) {
    992         .translated_addr = svq_addr.used_user_addr,
    993         .size = device_size - 1,
    994         .perm = IOMMU_RW,
    995     };
    996     ok = vhost_vdpa_svq_map_ring(v, &device_region, errp);
    997     if (unlikely(!ok)) {
    998         error_prepend(errp, "Cannot create vq device region: ");
    999         vhost_vdpa_svq_unmap_ring(v, driver_region.translated_addr);
   1000     }
   1001     addr->used_user_addr = device_region.iova;
   1002 
   1003     return ok;
   1004 }
   1005 
   1006 static bool vhost_vdpa_svq_setup(struct vhost_dev *dev,
   1007                                  VhostShadowVirtqueue *svq, unsigned idx,
   1008                                  Error **errp)
   1009 {
   1010     uint16_t vq_index = dev->vq_index + idx;
   1011     struct vhost_vring_state s = {
   1012         .index = vq_index,
   1013     };
   1014     int r;
   1015 
   1016     r = vhost_vdpa_set_dev_vring_base(dev, &s);
   1017     if (unlikely(r)) {
   1018         error_setg_errno(errp, -r, "Cannot set vring base");
   1019         return false;
   1020     }
   1021 
   1022     r = vhost_vdpa_svq_set_fds(dev, svq, idx, errp);
   1023     return r == 0;
   1024 }
   1025 
   1026 static bool vhost_vdpa_svqs_start(struct vhost_dev *dev)
   1027 {
   1028     struct vhost_vdpa *v = dev->opaque;
   1029     Error *err = NULL;
   1030     unsigned i;
   1031 
   1032     if (!v->shadow_vqs) {
   1033         return true;
   1034     }
   1035 
   1036     for (i = 0; i < v->shadow_vqs->len; ++i) {
   1037         VirtQueue *vq = virtio_get_queue(dev->vdev, dev->vq_index + i);
   1038         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, i);
   1039         struct vhost_vring_addr addr = {
   1040             .index = dev->vq_index + i,
   1041         };
   1042         int r;
   1043         bool ok = vhost_vdpa_svq_setup(dev, svq, i, &err);
   1044         if (unlikely(!ok)) {
   1045             goto err;
   1046         }
   1047 
   1048         vhost_svq_start(svq, dev->vdev, vq);
   1049         ok = vhost_vdpa_svq_map_rings(dev, svq, &addr, &err);
   1050         if (unlikely(!ok)) {
   1051             goto err_map;
   1052         }
   1053 
   1054         /* Override vring GPA set by vhost subsystem */
   1055         r = vhost_vdpa_set_vring_dev_addr(dev, &addr);
   1056         if (unlikely(r != 0)) {
   1057             error_setg_errno(&err, -r, "Cannot set device address");
   1058             goto err_set_addr;
   1059         }
   1060     }
   1061 
   1062     return true;
   1063 
   1064 err_set_addr:
   1065     vhost_vdpa_svq_unmap_rings(dev, g_ptr_array_index(v->shadow_vqs, i));
   1066 
   1067 err_map:
   1068     vhost_svq_stop(g_ptr_array_index(v->shadow_vqs, i));
   1069 
   1070 err:
   1071     error_reportf_err(err, "Cannot setup SVQ %u: ", i);
   1072     for (unsigned j = 0; j < i; ++j) {
   1073         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, j);
   1074         vhost_vdpa_svq_unmap_rings(dev, svq);
   1075         vhost_svq_stop(svq);
   1076     }
   1077 
   1078     return false;
   1079 }
   1080 
   1081 static void vhost_vdpa_svqs_stop(struct vhost_dev *dev)
   1082 {
   1083     struct vhost_vdpa *v = dev->opaque;
   1084 
   1085     if (!v->shadow_vqs) {
   1086         return;
   1087     }
   1088 
   1089     for (unsigned i = 0; i < v->shadow_vqs->len; ++i) {
   1090         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, i);
   1091         vhost_vdpa_svq_unmap_rings(dev, svq);
   1092     }
   1093 }
   1094 
   1095 static int vhost_vdpa_dev_start(struct vhost_dev *dev, bool started)
   1096 {
   1097     struct vhost_vdpa *v = dev->opaque;
   1098     bool ok;
   1099     trace_vhost_vdpa_dev_start(dev, started);
   1100 
   1101     if (started) {
   1102         vhost_vdpa_host_notifiers_init(dev);
   1103         ok = vhost_vdpa_svqs_start(dev);
   1104         if (unlikely(!ok)) {
   1105             return -1;
   1106         }
   1107         vhost_vdpa_set_vring_ready(dev);
   1108     } else {
   1109         vhost_vdpa_svqs_stop(dev);
   1110         vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs);
   1111     }
   1112 
   1113     if (dev->vq_index + dev->nvqs != dev->vq_index_end) {
   1114         return 0;
   1115     }
   1116 
   1117     if (started) {
   1118         memory_listener_register(&v->listener, &address_space_memory);
   1119         return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
   1120     } else {
   1121         vhost_vdpa_reset_device(dev);
   1122         vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
   1123                                    VIRTIO_CONFIG_S_DRIVER);
   1124         memory_listener_unregister(&v->listener);
   1125 
   1126         return 0;
   1127     }
   1128 }
   1129 
   1130 static int vhost_vdpa_set_log_base(struct vhost_dev *dev, uint64_t base,
   1131                                      struct vhost_log *log)
   1132 {
   1133     struct vhost_vdpa *v = dev->opaque;
   1134     if (v->shadow_vqs_enabled || !vhost_vdpa_first_dev(dev)) {
   1135         return 0;
   1136     }
   1137 
   1138     trace_vhost_vdpa_set_log_base(dev, base, log->size, log->refcnt, log->fd,
   1139                                   log->log);
   1140     return vhost_vdpa_call(dev, VHOST_SET_LOG_BASE, &base);
   1141 }
   1142 
   1143 static int vhost_vdpa_set_vring_addr(struct vhost_dev *dev,
   1144                                        struct vhost_vring_addr *addr)
   1145 {
   1146     struct vhost_vdpa *v = dev->opaque;
   1147 
   1148     if (v->shadow_vqs_enabled) {
   1149         /*
   1150          * Device vring addr was set at device start. SVQ base is handled by
   1151          * VirtQueue code.
   1152          */
   1153         return 0;
   1154     }
   1155 
   1156     return vhost_vdpa_set_vring_dev_addr(dev, addr);
   1157 }
   1158 
   1159 static int vhost_vdpa_set_vring_num(struct vhost_dev *dev,
   1160                                       struct vhost_vring_state *ring)
   1161 {
   1162     trace_vhost_vdpa_set_vring_num(dev, ring->index, ring->num);
   1163     return vhost_vdpa_call(dev, VHOST_SET_VRING_NUM, ring);
   1164 }
   1165 
   1166 static int vhost_vdpa_set_vring_base(struct vhost_dev *dev,
   1167                                        struct vhost_vring_state *ring)
   1168 {
   1169     struct vhost_vdpa *v = dev->opaque;
   1170     VirtQueue *vq = virtio_get_queue(dev->vdev, ring->index);
   1171 
   1172     /*
   1173      * vhost-vdpa devices does not support in-flight requests. Set all of them
   1174      * as available.
   1175      *
   1176      * TODO: This is ok for networking, but other kinds of devices might
   1177      * have problems with these retransmissions.
   1178      */
   1179     while (virtqueue_rewind(vq, 1)) {
   1180         continue;
   1181     }
   1182     if (v->shadow_vqs_enabled) {
   1183         /*
   1184          * Device vring base was set at device start. SVQ base is handled by
   1185          * VirtQueue code.
   1186          */
   1187         return 0;
   1188     }
   1189 
   1190     return vhost_vdpa_set_dev_vring_base(dev, ring);
   1191 }
   1192 
   1193 static int vhost_vdpa_get_vring_base(struct vhost_dev *dev,
   1194                                        struct vhost_vring_state *ring)
   1195 {
   1196     struct vhost_vdpa *v = dev->opaque;
   1197     int ret;
   1198 
   1199     if (v->shadow_vqs_enabled) {
   1200         ring->num = virtio_queue_get_last_avail_idx(dev->vdev, ring->index);
   1201         return 0;
   1202     }
   1203 
   1204     ret = vhost_vdpa_call(dev, VHOST_GET_VRING_BASE, ring);
   1205     trace_vhost_vdpa_get_vring_base(dev, ring->index, ring->num);
   1206     return ret;
   1207 }
   1208 
   1209 static int vhost_vdpa_set_vring_kick(struct vhost_dev *dev,
   1210                                        struct vhost_vring_file *file)
   1211 {
   1212     struct vhost_vdpa *v = dev->opaque;
   1213     int vdpa_idx = file->index - dev->vq_index;
   1214 
   1215     if (v->shadow_vqs_enabled) {
   1216         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, vdpa_idx);
   1217         vhost_svq_set_svq_kick_fd(svq, file->fd);
   1218         return 0;
   1219     } else {
   1220         return vhost_vdpa_set_vring_dev_kick(dev, file);
   1221     }
   1222 }
   1223 
   1224 static int vhost_vdpa_set_vring_call(struct vhost_dev *dev,
   1225                                        struct vhost_vring_file *file)
   1226 {
   1227     struct vhost_vdpa *v = dev->opaque;
   1228 
   1229     if (v->shadow_vqs_enabled) {
   1230         int vdpa_idx = file->index - dev->vq_index;
   1231         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, vdpa_idx);
   1232 
   1233         vhost_svq_set_svq_call_fd(svq, file->fd);
   1234         return 0;
   1235     } else {
   1236         return vhost_vdpa_set_vring_dev_call(dev, file);
   1237     }
   1238 }
   1239 
   1240 static int vhost_vdpa_get_features(struct vhost_dev *dev,
   1241                                      uint64_t *features)
   1242 {
   1243     struct vhost_vdpa *v = dev->opaque;
   1244     int ret = vhost_vdpa_get_dev_features(dev, features);
   1245 
   1246     if (ret == 0 && v->shadow_vqs_enabled) {
   1247         /* Add SVQ logging capabilities */
   1248         *features |= BIT_ULL(VHOST_F_LOG_ALL);
   1249     }
   1250 
   1251     return ret;
   1252 }
   1253 
   1254 static int vhost_vdpa_set_owner(struct vhost_dev *dev)
   1255 {
   1256     if (!vhost_vdpa_first_dev(dev)) {
   1257         return 0;
   1258     }
   1259 
   1260     trace_vhost_vdpa_set_owner(dev);
   1261     return vhost_vdpa_call(dev, VHOST_SET_OWNER, NULL);
   1262 }
   1263 
   1264 static int vhost_vdpa_vq_get_addr(struct vhost_dev *dev,
   1265                     struct vhost_vring_addr *addr, struct vhost_virtqueue *vq)
   1266 {
   1267     assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
   1268     addr->desc_user_addr = (uint64_t)(unsigned long)vq->desc_phys;
   1269     addr->avail_user_addr = (uint64_t)(unsigned long)vq->avail_phys;
   1270     addr->used_user_addr = (uint64_t)(unsigned long)vq->used_phys;
   1271     trace_vhost_vdpa_vq_get_addr(dev, vq, addr->desc_user_addr,
   1272                                  addr->avail_user_addr, addr->used_user_addr);
   1273     return 0;
   1274 }
   1275 
   1276 static bool  vhost_vdpa_force_iommu(struct vhost_dev *dev)
   1277 {
   1278     return true;
   1279 }
   1280 
   1281 const VhostOps vdpa_ops = {
   1282         .backend_type = VHOST_BACKEND_TYPE_VDPA,
   1283         .vhost_backend_init = vhost_vdpa_init,
   1284         .vhost_backend_cleanup = vhost_vdpa_cleanup,
   1285         .vhost_set_log_base = vhost_vdpa_set_log_base,
   1286         .vhost_set_vring_addr = vhost_vdpa_set_vring_addr,
   1287         .vhost_set_vring_num = vhost_vdpa_set_vring_num,
   1288         .vhost_set_vring_base = vhost_vdpa_set_vring_base,
   1289         .vhost_get_vring_base = vhost_vdpa_get_vring_base,
   1290         .vhost_set_vring_kick = vhost_vdpa_set_vring_kick,
   1291         .vhost_set_vring_call = vhost_vdpa_set_vring_call,
   1292         .vhost_get_features = vhost_vdpa_get_features,
   1293         .vhost_set_backend_cap = vhost_vdpa_set_backend_cap,
   1294         .vhost_set_owner = vhost_vdpa_set_owner,
   1295         .vhost_set_vring_endian = NULL,
   1296         .vhost_backend_memslots_limit = vhost_vdpa_memslots_limit,
   1297         .vhost_set_mem_table = vhost_vdpa_set_mem_table,
   1298         .vhost_set_features = vhost_vdpa_set_features,
   1299         .vhost_reset_device = vhost_vdpa_reset_device,
   1300         .vhost_get_vq_index = vhost_vdpa_get_vq_index,
   1301         .vhost_get_config  = vhost_vdpa_get_config,
   1302         .vhost_set_config = vhost_vdpa_set_config,
   1303         .vhost_requires_shm_log = NULL,
   1304         .vhost_migration_done = NULL,
   1305         .vhost_backend_can_merge = NULL,
   1306         .vhost_net_set_mtu = NULL,
   1307         .vhost_set_iotlb_callback = NULL,
   1308         .vhost_send_device_iotlb_msg = NULL,
   1309         .vhost_dev_start = vhost_vdpa_dev_start,
   1310         .vhost_get_device_id = vhost_vdpa_get_device_id,
   1311         .vhost_vq_get_addr = vhost_vdpa_vq_get_addr,
   1312         .vhost_force_iommu = vhost_vdpa_force_iommu,
   1313 };