vhost: add trace for IOTLB miss
PATCH 1/1 vhost: add trace for IOTLB miss
Add some trace points for IOTLB translation for vhost. After vhost-user is setup, the only IO path that QEMU will participate should be the IOMMU translation, so it'll be good we can track this with explicit timestamps when needed to see how long time we take to do the translation, and whether there's anything stuck inside. It might be useful for triaging vhost-user problems.
--- hw/virtio/trace-events | 1 + hw/virtio/vhost.c | 7 +++++++ 2 files changed, 8 insertions(+)
hw/virtio/trace-events +1 -0
@@ -5,6 +5,7 @@ vhost_commit(bool started, bool changed) "Started: %d Changed: %d" vhost_region_add_section(const char *name, uint64_t gpa, uint64_t size, uint64_t host) "%s: 0x%"PRIx64"+0x%"PRIx64" @ 0x%"PRIx64 vhost_region_add_section_abut(const char *name, uint64_t new_size) "%s: 0x%"PRIx64 vhost_section(const char *name, int r) "%s:%d" +vhost_iotlb_miss(void *dev, int step) "%p step %d" # hw/virtio/virtio.c virtqueue_alloc_element(void *elem, size_t sz, unsigned in_num, unsigned out_num) "elem %p size %zd in_num %u out_num %u"
hw/virtio/vhost.c +7 -0
@@ -839,12 +839,15 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)rcu_read_lock (); +trace_vhost_iotlb_miss (dev,1 ); + iotlb =address_space_get_iotlb_entry (dev->vdev->dma_as, iova, write);if (iotlb.target_as !=NULL ) { ret =vhost_memory_region_lookup (dev, iotlb.translated_addr, &uaddr, &len);if (ret) { +trace_vhost_iotlb_miss (dev,3 );error_report ("Fail to lookup the translated address " "%" PRIx64, iotlb.translated_addr); goto out;
@@ -856,10 +859,14 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write) ret =vhost_backend_update_device_iotlb (dev, iova, uaddr, len, iotlb.perm);if (ret) { +trace_vhost_iotlb_miss (dev,4 );error_report ("Fail to update device iotlb" ); goto out; } } + +trace_vhost_iotlb_miss (dev,2 ); + out:rcu_read_unlock ();
Signature · 1 line
2.14.3
Quoted 8 lines · Peter Xu
Add some trace points for IOTLB translation for vhost. After vhost-user is setup, the only IO path that QEMU will participate should be the IOMMU translation, so it'll be good we can track this with explicit timestamps when needed to see how long time we take to do the translation, and whether there's anything stuck inside. It might be useful for triaging vhost-user problems.
Signed-off-by Peter Xu <[email protected]>
Could you rebase pls?
Quoted 54 lines
--- hw/virtio/trace-events | 1 + hw/virtio/vhost.c | 7 +++++++ 2 files changed, 8 insertions(+)hw/virtio/trace-events +1
-0@@ -5,6 +5,7 @@ vhost_commit(bool started, bool changed) "Started: %d Changed: %d" vhost_region_add_section(const char *name, uint64_t gpa, uint64_t size, uint64_t host) "%s: 0x%"PRIx64"+0x%"PRIx64" @ 0x%"PRIx64 vhost_region_add_section_abut(const char *name, uint64_t new_size) "%s: 0x%"PRIx64 vhost_section(const char *name, int r) "%s:%d" +vhost_iotlb_miss(void *dev, int step) "%p step %d" # hw/virtio/virtio.c virtqueue_alloc_element(void *elem, size_t sz, unsigned in_num, unsigned out_num) "elem %p size %zd in_num %u out_num %u"hw/virtio/vhost.c +7
-0@@ -839,12 +839,15 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)rcu_read_lock (); +trace_vhost_iotlb_miss (dev,1 ); + iotlb =address_space_get_iotlb_entry (dev->vdev->dma_as, iova, write);if (iotlb.target_as !=NULL ) { ret =vhost_memory_region_lookup (dev, iotlb.translated_addr, &uaddr, &len);if (ret) { +trace_vhost_iotlb_miss (dev,3 );error_report ("Fail to lookup the translated address " "%" PRIx64, iotlb.translated_addr); goto out;@@ -856,10 +859,14 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write) ret =vhost_backend_update_device_iotlb (dev, iova, uaddr, len, iotlb.perm);if (ret) { +trace_vhost_iotlb_miss (dev,4 );error_report ("Fail to update device iotlb" ); goto out; } } + +trace_vhost_iotlb_miss (dev,2 ); + out:rcu_read_unlock ();Signature · 1 line
2.14.3