From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 78C87A04F0 for ; Tue, 10 Dec 2019 16:00:08 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 719A31BC25; Tue, 10 Dec 2019 16:00:08 +0100 (CET) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by dpdk.org (Postfix) with ESMTP id 582171BC25 for ; Tue, 10 Dec 2019 16:00:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1575990006; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a1TryeNpsGFiyVUU+b7CZtvSKf7UoI7q1KxXqtSMgWQ=; b=MJqjLQ4iurod9fQ6ggske8pKr7USBVeD+RwrZfBQ6nSZ/knY7faa1KXDK63X1gqmEaWFA1 Hjj4hwFwB+QnXjp6pXM1Cexu7wl8pC6rZuckP8xlNGQ3oXvNlehywYI/fPPFBwTeaCmghX Hd2yKnsEBwpD3EXVxPSzWhg93BSBCWk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-237-aLPFN_i-O_K8pr2uOfwdow-1; Tue, 10 Dec 2019 10:00:04 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B383A107ACC5 for ; Tue, 10 Dec 2019 15:00:03 +0000 (UTC) Received: from rh.redhat.com (ovpn-116-64.ams2.redhat.com [10.36.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1992C5D9C5; Tue, 10 Dec 2019 14:59:59 +0000 (UTC) From: Kevin Traynor To: Adrian Moreno Cc: Maxime Coquelin , dpdk stable Date: Tue, 10 Dec 2019 14:58:37 +0000 Message-Id: <20191210145937.32755-3-ktraynor@redhat.com> In-Reply-To: <20191210145937.32755-1-ktraynor@redhat.com> References: <20191210145937.32755-1-ktraynor@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-MC-Unique: aLPFN_i-O_K8pr2uOfwdow-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Subject: [dpdk-stable] patch 'vhost: translate incoming log address to GPA' has been queued to LTS release 18.11.6 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to LTS release 18.11.6 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 12/16/19. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasi= ng (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable-queue This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable-queue/commit/124653b939870843c0= 2ff11ef39ea84547a7cab3 Thanks. Kevin. --- >From 124653b939870843c02ff11ef39ea84547a7cab3 Mon Sep 17 00:00:00 2001 From: Adrian Moreno Date: Wed, 9 Oct 2019 13:54:30 +0200 Subject: [PATCH] vhost: translate incoming log address to GPA [ upstream commit fbda9f1459271435df3ea2575ca5845d04733466 ] When IOMMU is enabled the incoming log address is in IOVA space. In that case, look in IOTLB table and translate the resulting HVA to GPA. If IOMMU is not enabled, the incoming log address is already a GPA so no transformation is needed. Fixes: 69c90e98f483 ("vhost: enable IOMMU support") Signed-off-by: Adrian Moreno Reviewed-by: Maxime Coquelin --- lib/librte_vhost/vhost.c | 1 + lib/librte_vhost/vhost.h | 20 +++++++++++++++++ lib/librte_vhost/vhost_user.c | 42 ++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index f7d132cd4..5dc82197b 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -219,4 +219,5 @@ vring_invalidate(struct virtio_net *dev, struct vhost_v= irtqueue *vq) =09vq->avail =3D NULL; =09vq->used =3D NULL; +=09vq->log_guest_addr =3D 0; =20 =09if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index bb9cff9f7..daccf5c65 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -605,4 +605,24 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint6= 4_t size) } =20 +static __rte_always_inline uint64_t +hva_to_gpa(struct virtio_net *dev, uint64_t vva, uint64_t len) +{ +=09struct rte_vhost_mem_region *r; +=09uint32_t i; + +=09if (unlikely(!dev || !dev->mem)) +=09=09return 0; + +=09for (i =3D 0; i < dev->mem->nregions; i++) { +=09=09r =3D &dev->mem->regions[i]; + +=09=09if (vva >=3D r->host_user_addr && +=09=09 vva + len < r->host_user_addr + r->size) { +=09=09=09return r->guest_phys_addr + vva - r->host_user_addr; +=09=09} +=09} +=09return 0; +} + static __rte_always_inline struct virtio_net * get_device(int vid) diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 0d318cd93..6cc842447 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -631,4 +631,37 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_= virtqueue *vq, } =20 +/* + * Converts vring log address to GPA + * If IOMMU is enabled, the log address is IOVA + * If IOMMU not enabled, the log address is already GPA + */ +static uint64_t +translate_log_addr(struct virtio_net *dev, struct vhost_virtqueue *vq, +=09=09uint64_t log_addr) +{ +=09if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { +=09=09const uint64_t exp_size =3D sizeof(struct vring_used) + +=09=09=09sizeof(struct vring_used_elem) * vq->size; +=09=09uint64_t hva, gpa; +=09=09uint64_t size =3D exp_size; + +=09=09hva =3D vhost_iova_to_vva(dev, vq, log_addr, +=09=09=09=09=09&size, VHOST_ACCESS_RW); +=09=09if (size !=3D exp_size) +=09=09=09return 0; + +=09=09gpa =3D hva_to_gpa(dev, hva, exp_size); +=09=09if (!gpa) { +=09=09=09RTE_LOG(ERR, VHOST_CONFIG, +=09=09=09=09"VQ: Failed to find GPA for log_addr: 0x%" PRIx64 " hva: 0x%" = PRIx64 "\n", +=09=09=09=09log_addr, hva); +=09=09=09return 0; +=09=09} +=09=09return gpa; + +=09} else +=09=09return log_addr; +} + static struct virtio_net * translate_ring_addresses(struct virtio_net *dev, int vq_index) @@ -738,5 +771,12 @@ translate_ring_addresses(struct virtio_net *dev, int v= q_index) =09} =20 -=09vq->log_guest_addr =3D addr->log_guest_addr; +=09vq->log_guest_addr =3D +=09=09translate_log_addr(dev, vq, addr->log_guest_addr); +=09if (vq->log_guest_addr =3D=3D 0) { +=09=09RTE_LOG(DEBUG, VHOST_CONFIG, +=09=09=09"(%d) failed to map log_guest_addr .\n", +=09=09=09dev->vid); +=09=09return dev; +=09} =09vq->access_ok =3D 1; =20 --=20 2.21.0 --- Diff of the applied patch vs upstream commit (please double-check if non-= empty: --- --- -=092019-12-10 14:49:39.309102335 +0000 +++ 0003-vhost-translate-incoming-log-address-to-GPA.patch=092019-12-10 14:= 49:38.983459054 +0000 @@ -1 +1 @@ -From fbda9f1459271435df3ea2575ca5845d04733466 Mon Sep 17 00:00:00 2001 +From 124653b939870843c02ff11ef39ea84547a7cab3 Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit fbda9f1459271435df3ea2575ca5845d04733466 ] + @@ -13 +14,0 @@ -Cc: stable@dpdk.org @@ -24 +25 @@ -index cea44df8c..76e753475 100644 +index f7d132cd4..5dc82197b 100644 @@ -27 +28 @@ -@@ -383,4 +383,5 @@ vring_invalidate(struct virtio_net *dev, struct vhost_= virtqueue *vq) +@@ -219,4 +219,5 @@ vring_invalidate(struct virtio_net *dev, struct vhost_= virtqueue *vq) @@ -34 +35 @@ -index 099a0d3f6..7a314717d 100644 +index bb9cff9f7..daccf5c65 100644 @@ -37 +38 @@ -@@ -448,4 +448,24 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint= 64_t size) +@@ -605,4 +605,24 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint= 64_t size) @@ -63 +64 @@ -index ce4e9fb32..5ae561e55 100644 +index 0d318cd93..6cc842447 100644 @@ -66 +67 @@ -@@ -576,4 +576,37 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost= _virtqueue *vq, +@@ -631,4 +631,37 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost= _virtqueue *vq, @@ -104 +105 @@ -@@ -683,5 +716,12 @@ translate_ring_addresses(struct virtio_net *dev, int = vq_index) +@@ -738,5 +771,12 @@ translate_ring_addresses(struct virtio_net *dev, int = vq_index)