get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/28137/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 28137,
    "url": "https://patches.dpdk.org/api/patches/28137/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20170831095023.21037-18-maxime.coquelin@redhat.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20170831095023.21037-18-maxime.coquelin@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20170831095023.21037-18-maxime.coquelin@redhat.com",
    "date": "2017-08-31T09:50:19",
    "name": "[dpdk-dev,17/21] vhost-user: translate ring addresses when IOMMU enabled",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c3d1d4a027ea7061689f11d57b28596853b0d79f",
    "submitter": {
        "id": 512,
        "url": "https://patches.dpdk.org/api/people/512/?format=api",
        "name": "Maxime Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "delegate": {
        "id": 355,
        "url": "https://patches.dpdk.org/api/users/355/?format=api",
        "username": "yliu",
        "first_name": "Yuanhan",
        "last_name": "Liu",
        "email": "yuanhan.liu@linux.intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20170831095023.21037-18-maxime.coquelin@redhat.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/28137/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/28137/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 935357CAF;\n\tThu, 31 Aug 2017 11:52:39 +0200 (CEST)",
            "from mx1.redhat.com (mx1.redhat.com [209.132.183.28])\n\tby dpdk.org (Postfix) with ESMTP id B62777CCD\n\tfor <dev@dpdk.org>; Thu, 31 Aug 2017 11:52:37 +0200 (CEST)",
            "from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 113FD5F7AD;\n\tThu, 31 Aug 2017 09:52:37 +0000 (UTC)",
            "from localhost.localdomain (ovpn-112-32.ams2.redhat.com\n\t[10.36.112.32])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id D70EF77DCE;\n\tThu, 31 Aug 2017 09:52:27 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 113FD5F7AD",
        "Authentication-Results": [
            "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=maxime.coquelin@redhat.com"
        ],
        "From": "Maxime Coquelin <maxime.coquelin@redhat.com>",
        "To": "dev@dpdk.org, yliu@fridaylinux.org, jfreiman@redhat.com,\n\ttiwei.bie@intel.com",
        "Cc": "mst@redhat.com, vkaplans@redhat.com, jasowang@redhat.com,\n\tMaxime Coquelin <maxime.coquelin@redhat.com>",
        "Date": "Thu, 31 Aug 2017 11:50:19 +0200",
        "Message-Id": "<20170831095023.21037-18-maxime.coquelin@redhat.com>",
        "In-Reply-To": "<20170831095023.21037-1-maxime.coquelin@redhat.com>",
        "References": "<20170831095023.21037-1-maxime.coquelin@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.12",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.39]); Thu, 31 Aug 2017 09:52:37 +0000 (UTC)",
        "Subject": "[dpdk-dev] [PATCH 17/21] vhost-user: translate ring addresses when\n\tIOMMU enabled",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "When IOMMU is enabled, the ring addresses set by the\nVHOST_USER_SET_VRING_ADDR requests are guest's IO virtual addresses,\nwhereas Qemu virtual addresses when IOMMU is disabled.\n\nWhen enabled and the required translation is not in the IOTLB cache,\nan IOTLB miss request is sent, but being called by the vhost-user\nsocket handling thread, the function does not wait for the requested\nIOTLB update.\n\nThe function will be called again on the next IOTLB update message\nreception if matching the vring addresses.\n\nSigned-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>\n---\n lib/librte_vhost/vhost_user.c | 44 +++++++++++++++++++++++++++++++++----------\n 1 file changed, 34 insertions(+), 10 deletions(-)",
    "diff": "diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c\nindex a2e030308..a81b338ad 100644\n--- a/lib/librte_vhost/vhost_user.c\n+++ b/lib/librte_vhost/vhost_user.c\n@@ -284,10 +284,7 @@ numa_realloc(struct virtio_net *dev, int index __rte_unused)\n }\n #endif\n \n-/*\n- * Converts QEMU virtual address to Vhost virtual address. This function is\n- * used to convert the ring addresses to our address space.\n- */\n+/* Converts QEMU virtual address to Vhost virtual address. */\n static uint64_t\n qva_to_vva(struct virtio_net *dev, uint64_t qva)\n {\n@@ -308,6 +305,30 @@ qva_to_vva(struct virtio_net *dev, uint64_t qva)\n \treturn 0;\n }\n \n+\n+/*\n+ * Converts ring address to Vhost virtual address.\n+ * If IOMMU is enabled, the ring address is a guest IO virtual address,\n+ * else it is a QEMU virtual address.\n+ */\n+static uint64_t\n+ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq,\n+\t\tuint64_t ra, uint64_t size)\n+{\n+\tif (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) {\n+\t\tuint64_t vva;\n+\n+\t\tvva = vhost_user_iotlb_cache_find(vq, ra,\n+\t\t\t\t\t&size, VHOST_ACCESS_RW);\n+\t\tif (!vva)\n+\t\t\tvhost_user_iotlb_miss(dev, ra, VHOST_ACCESS_RW);\n+\n+\t\treturn vva;\n+\t}\n+\n+\treturn qva_to_vva(dev, ra);\n+}\n+\n /*\n  * The virtio device sends us the desc, used and avail ring addresses.\n  * This function then converts these to our address space.\n@@ -340,8 +361,11 @@ static struct virtio_net *translate_ring_addresses(struct virtio_net *dev,\n \tstruct vhost_vring_addr *addr = &vq->ring_addrs;\n \n \t/* The addresses are converted from QEMU virtual to Vhost virtual. */\n-\tvq->desc = (struct vring_desc *)(uintptr_t)qva_to_vva(dev,\n-\t\t\taddr->desc_user_addr);\n+\tif (vq->desc && vq->avail && vq->used)\n+\t\treturn dev;\n+\n+\tvq->desc = (struct vring_desc *)(uintptr_t)ring_addr_to_vva(dev,\n+\t\t\tvq, addr->desc_user_addr, sizeof(struct vring_desc));\n \tif (vq->desc == 0) {\n \t\tRTE_LOG(ERR, VHOST_CONFIG,\n \t\t\t\"(%d) failed to find desc ring address.\\n\",\n@@ -352,8 +376,8 @@ static struct virtio_net *translate_ring_addresses(struct virtio_net *dev,\n \tdev = numa_realloc(dev, vq_index);\n \tvq = dev->virtqueue[vq_index];\n \n-\tvq->avail = (struct vring_avail *)(uintptr_t)qva_to_vva(dev,\n-\t\t\taddr->avail_user_addr);\n+\tvq->avail = (struct vring_avail *)(uintptr_t)ring_addr_to_vva(dev,\n+\t\t\tvq, addr->avail_user_addr, sizeof(struct vring_avail));\n \tif (vq->avail == 0) {\n \t\tRTE_LOG(ERR, VHOST_CONFIG,\n \t\t\t\"(%d) failed to find avail ring address.\\n\",\n@@ -361,8 +385,8 @@ static struct virtio_net *translate_ring_addresses(struct virtio_net *dev,\n \t\treturn NULL;\n \t}\n \n-\tvq->used = (struct vring_used *)(uintptr_t)qva_to_vva(dev,\n-\t\t\taddr->used_user_addr);\n+\tvq->used = (struct vring_used *)(uintptr_t)ring_addr_to_vva(dev,\n+\t\t\tvq, addr->used_user_addr, sizeof(struct vring_used));\n \tif (vq->used == 0) {\n \t\tRTE_LOG(ERR, VHOST_CONFIG,\n \t\t\t\"(%d) failed to find used ring address.\\n\",\n",
    "prefixes": [
        "dpdk-dev",
        "17/21"
    ]
}