yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-vhost-propagate-errors-in-vhost_device_iotlb_miss.patch

76daa3
From 8c404f6379951c3a9d3023d4c82ceae168cb0305 Mon Sep 17 00:00:00 2001
76daa3
From: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Date: Tue, 6 Jun 2017 12:05:20 +0200
76daa3
Subject: [PATCH 09/17] vhost: propagate errors in vhost_device_iotlb_miss()
76daa3
76daa3
RH-Author: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Message-id: <20170606120524.3050-2-maxime.coquelin@redhat.com>
76daa3
Patchwork-id: 75496
76daa3
O-Subject: [RHV-7.4 qemu-kvm-rhev PATCH 1/5] vhost: propagate errors in vhost_device_iotlb_miss()
76daa3
Bugzilla: 1451862
76daa3
RH-Acked-by: Peter Xu <peterx@redhat.com>
76daa3
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
76daa3
RH-Acked-by: Jens Freimann <jfreiman@redhat.com>
76daa3
76daa3
Some backends might want to know when things went wrong.
76daa3
76daa3
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
(cherry picked from commit fc58bd0d97c41dc3257001c86b2f802ae7255dff)
76daa3
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 hw/virtio/vhost.c         | 15 ++++++++++-----
76daa3
 include/hw/virtio/vhost.h |  2 +-
76daa3
 2 files changed, 11 insertions(+), 6 deletions(-)
76daa3
76daa3
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
76daa3
index 0001e60..369373a 100644
76daa3
--- a/hw/virtio/vhost.c
76daa3
+++ b/hw/virtio/vhost.c
76daa3
@@ -971,18 +971,20 @@ static int vhost_memory_region_lookup(struct vhost_dev *hdev,
76daa3
     return -EFAULT;
76daa3
 }
76daa3
 
76daa3
-void vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
76daa3
+int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
76daa3
 {
76daa3
     IOMMUTLBEntry iotlb;
76daa3
     uint64_t uaddr, len;
76daa3
+    int ret = -EFAULT;
76daa3
 
76daa3
     rcu_read_lock();
76daa3
 
76daa3
     iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
76daa3
                                           iova, write);
76daa3
     if (iotlb.target_as != NULL) {
76daa3
-        if (vhost_memory_region_lookup(dev, iotlb.translated_addr,
76daa3
-                                       &uaddr, &len)) {
76daa3
+        ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
76daa3
+                                         &uaddr, &len;;
76daa3
+        if (ret) {
76daa3
             error_report("Fail to lookup the translated address "
76daa3
                          "%"PRIx64, iotlb.translated_addr);
76daa3
             goto out;
76daa3
@@ -991,14 +993,17 @@ void vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
76daa3
         len = MIN(iotlb.addr_mask + 1, len);
76daa3
         iova = iova & ~iotlb.addr_mask;
76daa3
 
76daa3
-        if (dev->vhost_ops->vhost_update_device_iotlb(dev, iova, uaddr,
76daa3
-                                                      len, iotlb.perm)) {
76daa3
+        ret = dev->vhost_ops->vhost_update_device_iotlb(dev, iova, uaddr,
76daa3
+                                                      len, iotlb.perm);
76daa3
+        if (ret) {
76daa3
             error_report("Fail to update device iotlb");
76daa3
             goto out;
76daa3
         }
76daa3
     }
76daa3
 out:
76daa3
     rcu_read_unlock();
76daa3
+
76daa3
+    return ret;
76daa3
 }
76daa3
 
76daa3
 static int vhost_virtqueue_start(struct vhost_dev *dev,
76daa3
diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
76daa3
index a450321..467dc77 100644
76daa3
--- a/include/hw/virtio/vhost.h
76daa3
+++ b/include/hw/virtio/vhost.h
76daa3
@@ -105,5 +105,5 @@ bool vhost_has_free_slot(void);
76daa3
 int vhost_net_set_backend(struct vhost_dev *hdev,
76daa3
                           struct vhost_vring_file *file);
76daa3
 
76daa3
-void vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write);
76daa3
+int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write);
76daa3
 #endif
76daa3
-- 
76daa3
1.8.3.1
76daa3