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 D104FA04F3 for ; Thu, 19 Dec 2019 15:37:39 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C17891BF9F; Thu, 19 Dec 2019 15:37:39 +0100 (CET) Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by dpdk.org (Postfix) with ESMTP id 317801BF96 for ; Thu, 19 Dec 2019 15:37:39 +0100 (CET) Received: by mail-wr1-f54.google.com with SMTP id z3so6234822wru.3 for ; Thu, 19 Dec 2019 06:37:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WyEUuKD3Vx65MlDcooLHVut/Gbdwdim29iJESyI9b2E=; b=cf8wy8ccw+aieaGngEDpPB8lQKWyG0FXpZJt/ZG7hBOXmhM19UN8YnUOX3UbQLRHf3 7RxYMBr9jin0jW0PXgEQdCdXhbGD9rLbbhTpUXEBqCjkzZ5XvWCINluWLInEELGTtUbV N9HovYAD/oq8zLdozSj2Ks8uxKVt1FMxqcISoIcXAEYfiEpsY1UlfF5CVz8nzrEZOxMC +6tPNBf2ceIbUQjOjfeumR8KSuJbI82dsPQoXbmTuMoIUT3738XaVuwogHuRcr4LYfQO ceFWB3Div0SslqoYz/oBlrQg2+ee7AdDmaDI74gtdxFzAwnsbD0dl0NbL72jtcwlyRAP qmnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WyEUuKD3Vx65MlDcooLHVut/Gbdwdim29iJESyI9b2E=; b=Z1o14yLTEMcBz4riEmJdyVqgIL5Z03PlECXILjZBHXQnNzQJfvkviIdYWJeULLVaU8 8OWMKK3ZErWiG0YkjfDPywMm9vSfLbAHY/NAbznyXKUJAMpIXSJzIEeY9TXN7SniZ85X nzVX6x+Xb0M+KAo4r6632IRoACbyy93aJ9mSpGtjTIlUOEFRfh4fcFKPiphieJ1JHcgd Osf4hGx6oG+T09HXkTxX+VvAoLl6KvoaTePMRIbzi3biCtXN6ndsJsN9z2LpLZ06lsO+ s1hxVydCFYY7jKnJxJSnSIKC7srwsY2HDY2NeBLVCUCNBMpgdlutfsRK8lhs/6zKZvic 8xHw== X-Gm-Message-State: APjAAAX5zbEWYirrcPmlu0DZlzC/VBXfDMq6GxcMoYHe1rD62rh/IlQ2 uoVftcHMCSywYAdHlIIJrvSrKt+RpWc= X-Google-Smtp-Source: APXvYqz9WjEHtX6jxNudKzuZCDpaI4FcAvP3Xb/1eG7gSxWs681/F7HNiLb2Z3RokAX8F/X2AwT9hg== X-Received: by 2002:adf:bc87:: with SMTP id g7mr10170404wrh.121.1576766258833; Thu, 19 Dec 2019 06:37:38 -0800 (PST) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id n1sm6469081wrw.52.2019.12.19.06.37.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2019 06:37:38 -0800 (PST) From: luca.boccassi@gmail.com To: Adrian Moreno Cc: Maxime Coquelin , dpdk stable Date: Thu, 19 Dec 2019 14:33:37 +0000 Message-Id: <20191219143447.21506-70-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191219143447.21506-1-luca.boccassi@gmail.com> References: <20191219143447.21506-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'vhost: translate incoming log address to GPA' has been queued to LTS release 17.11.10 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 17.11.10 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/21/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 rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Thanks. Luca Boccassi --- >From 0797241df9cafe74469e784bf18a50fb6cd9230e 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 08ab6eab35..ec584695c2 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -208,6 +208,7 @@ vring_invalidate(struct virtio_net *dev, struct vhost_virtqueue *vq) vq->desc = NULL; vq->avail = NULL; vq->used = NULL; + vq->log_guest_addr = 0; if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) vhost_user_iotlb_wr_unlock(vq); diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 55bfb0b25f..f8b587a9d5 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -477,6 +477,26 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size) return 0; } +static __rte_always_inline uint64_t +hva_to_gpa(struct virtio_net *dev, uint64_t vva, uint64_t len) +{ + struct rte_vhost_mem_region *r; + uint32_t i; + + if (unlikely(!dev || !dev->mem)) + return 0; + + for (i = 0; i < dev->mem->nregions; i++) { + r = &dev->mem->regions[i]; + + if (vva >= r->host_user_addr && + vva + len < r->host_user_addr + r->size) { + return r->guest_phys_addr + vva - r->host_user_addr; + } + } + return 0; +} + struct virtio_net *get_device(int vid); int vhost_new_device(void); diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 635b6f3ddd..f039ce8706 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -462,6 +462,39 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq, return qva_to_vva(dev, ra, size); } +/* + * 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, + uint64_t log_addr) +{ + if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { + const uint64_t exp_size = sizeof(struct vring_used) + + sizeof(struct vring_used_elem) * vq->size; + uint64_t hva, gpa; + uint64_t size = exp_size; + + hva = vhost_iova_to_vva(dev, vq, log_addr, + &size, VHOST_ACCESS_RW); + if (size != exp_size) + return 0; + + gpa = hva_to_gpa(dev, hva, exp_size); + if (!gpa) { + RTE_LOG(ERR, VHOST_CONFIG, + "VQ: Failed to find GPA for log_addr: 0x%" PRIx64 " hva: 0x%" PRIx64 "\n", + log_addr, hva); + return 0; + } + return gpa; + + } else + return log_addr; +} + static struct virtio_net * translate_ring_addresses(struct virtio_net *dev, int vq_index) { @@ -520,7 +553,14 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index) vq->last_avail_idx = vq->used->idx; } - vq->log_guest_addr = addr->log_guest_addr; + vq->log_guest_addr = + translate_log_addr(dev, vq, addr->log_guest_addr); + if (vq->log_guest_addr == 0) { + RTE_LOG(DEBUG, VHOST_CONFIG, + "(%d) failed to map log_guest_addr .\n", + dev->vid); + return dev; + } vq->access_ok = 1; LOG_DEBUG(VHOST_CONFIG, "(%d) mapped address desc: %p\n", -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-12-19 14:32:29.103902354 +0000 +++ 0070-vhost-translate-incoming-log-address-to-GPA.patch 2019-12-19 14:32:26.161298936 +0000 @@ -1,8 +1,10 @@ -From fbda9f1459271435df3ea2575ca5845d04733466 Mon Sep 17 00:00:00 2001 +From 0797241df9cafe74469e784bf18a50fb6cd9230e 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. @@ -10,7 +12,6 @@ transformation is needed. Fixes: 69c90e98f483 ("vhost: enable IOMMU support") -Cc: stable@dpdk.org Signed-off-by: Adrian Moreno Reviewed-by: Maxime Coquelin @@ -21,10 +22,10 @@ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c -index cea44df8cb..76e753475b 100644 +index 08ab6eab35..ec584695c2 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c -@@ -382,6 +382,7 @@ vring_invalidate(struct virtio_net *dev, struct vhost_virtqueue *vq) +@@ -208,6 +208,7 @@ vring_invalidate(struct virtio_net *dev, struct vhost_virtqueue *vq) vq->desc = NULL; vq->avail = NULL; vq->used = NULL; @@ -33,10 +34,10 @@ if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) vhost_user_iotlb_wr_unlock(vq); diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h -index 099a0d3f6b..7a314717df 100644 +index 55bfb0b25f..f8b587a9d5 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h -@@ -447,6 +447,26 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size) +@@ -477,6 +477,26 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size) return 0; } @@ -60,14 +61,14 @@ + return 0; +} + - static __rte_always_inline struct virtio_net * - get_device(int vid) - { + struct virtio_net *get_device(int vid); + + int vhost_new_device(void); diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c -index ce4e9fb32f..5ae561e55a 100644 +index 635b6f3ddd..f039ce8706 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c -@@ -575,6 +575,39 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq, +@@ -462,6 +462,39 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq, return qva_to_vva(dev, ra, size); } @@ -107,7 +108,7 @@ static struct virtio_net * translate_ring_addresses(struct virtio_net *dev, int vq_index) { -@@ -682,7 +715,14 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index) +@@ -520,7 +553,14 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index) vq->last_avail_idx = vq->used->idx; } @@ -122,7 +123,7 @@ + } vq->access_ok = 1; - VHOST_LOG_DEBUG(VHOST_CONFIG, "(%d) mapped address desc: %p\n", + LOG_DEBUG(VHOST_CONFIG, "(%d) mapped address desc: %p\n", -- 2.20.1