Hi Maxime, > -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Friday, March 31, 2023 11:43 PM > To: dev@dpdk.org; david.march...@redhat.com; Xia, Chenbo > <chenbo....@intel.com>; m...@redhat.com; f...@redhat.com; > jasow...@redhat.com; Liang, Cunming <cunming.li...@intel.com>; Xie, Yongji > <xieyon...@bytedance.com>; echau...@redhat.com; epere...@redhat.com; > amore...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [RFC 07/27] vhost: change to single IOTLB cache per device > > This patch simplifies IOTLB implementation and improves > IOTLB memory consumption by having a single IOTLB cache > per device, instead of having one per queue. > > In order to not impact performance, it keeps an IOTLB lock > per virtqueue, so that there is no contention between > multiple queue trying to acquire it. > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > lib/vhost/iotlb.c | 212 +++++++++++++++++++---------------------- > lib/vhost/iotlb.h | 43 ++++++--- > lib/vhost/vhost.c | 18 ++-- > lib/vhost/vhost.h | 16 ++-- > lib/vhost/vhost_user.c | 25 +++-- > 5 files changed, 160 insertions(+), 154 deletions(-) >
[...] > diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c > index d60e39b6bc..81ebef0137 100644 > --- a/lib/vhost/vhost_user.c > +++ b/lib/vhost/vhost_user.c > @@ -7,7 +7,7 @@ > * The vhost-user protocol connection is an external interface, so it > must be > * robust against invalid inputs. > * > - * This is important because the vhost-user frontend is only one step > removed > +* This is important because the vhost-user frontend is only one step > removed This is changed by accident? Thanks, Chenbo > * from the guest. Malicious guests that have escaped will then launch > further > * attacks from the vhost-user frontend. > * > @@ -237,6 +237,8 @@ vhost_backend_cleanup(struct virtio_net *dev) > } > > dev->postcopy_listening = 0; > + > + vhost_user_iotlb_destroy(dev); > } > > static void > @@ -539,7 +541,6 @@ numa_realloc(struct virtio_net **pdev, struct > vhost_virtqueue **pvq) > if (vq != dev->virtqueue[vq->index]) { > VHOST_LOG_CONFIG(dev->ifname, INFO, "reallocated virtqueue on > node %d\n", node); > dev->virtqueue[vq->index] = vq; > - vhost_user_iotlb_init(dev, vq); > } > > if (vq_is_packed(dev)) { > @@ -664,6 +665,8 @@ numa_realloc(struct virtio_net **pdev, struct > vhost_virtqueue **pvq) > return; > } > dev->guest_pages = gp; > + > + vhost_user_iotlb_init(dev); > } > #else > static void > @@ -1360,8 +1363,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev, > > /* Flush IOTLB cache as previous HVAs are now invalid */ > if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) > - for (i = 0; i < dev->nr_vring; i++) > - vhost_user_iotlb_flush_all(dev, > dev->virtqueue[i]); > + vhost_user_iotlb_flush_all(dev); > > free_mem_region(dev); > rte_free(dev->mem); > @@ -2194,7 +2196,7 @@ vhost_user_get_vring_base(struct virtio_net **pdev, > ctx->msg.size = sizeof(ctx->msg.payload.state); > ctx->fd_num = 0; > > - vhost_user_iotlb_flush_all(dev, vq); > + vhost_user_iotlb_flush_all(dev); > > vring_invalidate(dev, vq); > > @@ -2639,15 +2641,14 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, > if (!vva) > return RTE_VHOST_MSG_RESULT_ERR; > > + vhost_user_iotlb_cache_insert(dev, imsg->iova, vva, len, imsg- > >perm); > + > for (i = 0; i < dev->nr_vring; i++) { > struct vhost_virtqueue *vq = dev->virtqueue[i]; > > if (!vq) > continue; > > - vhost_user_iotlb_cache_insert(dev, vq, imsg->iova, vva, > - len, imsg->perm); > - > if (is_vring_iotlb(dev, vq, imsg)) { > rte_spinlock_lock(&vq->access_lock); > translate_ring_addresses(&dev, &vq); > @@ -2657,15 +2658,14 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, > } > break; > case VHOST_IOTLB_INVALIDATE: > + vhost_user_iotlb_cache_remove(dev, imsg->iova, imsg->size); > + > for (i = 0; i < dev->nr_vring; i++) { > struct vhost_virtqueue *vq = dev->virtqueue[i]; > > if (!vq) > continue; > > - vhost_user_iotlb_cache_remove(dev, vq, imsg->iova, > - imsg->size); > - > if (is_vring_iotlb(dev, vq, imsg)) { > rte_spinlock_lock(&vq->access_lock); > vring_invalidate(dev, vq); > @@ -2674,8 +2674,7 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, > } > break; > default: > - VHOST_LOG_CONFIG(dev->ifname, ERR, > - "invalid IOTLB message type (%d)\n", > + VHOST_LOG_CONFIG(dev->ifname, ERR, "invalid IOTLB message type > (%d)\n", > imsg->type); > return RTE_VHOST_MSG_RESULT_ERR; > } > -- > 2.39.2