get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 60771,
    "url": "https://patches.dpdk.org/api/patches/60771/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20191009115432.14863-2-amorenoz@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": "<20191009115432.14863-2-amorenoz@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20191009115432.14863-2-amorenoz@redhat.com",
    "date": "2019-10-09T11:54:30",
    "name": "[v6,1/3] vhost: translate incoming log address to gpa",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "5a2150ca35f5b13a68aae8f1189efd62271c5bfb",
    "submitter": {
        "id": 1397,
        "url": "https://patches.dpdk.org/api/people/1397/?format=api",
        "name": "Adrian Moreno",
        "email": "amorenoz@redhat.com"
    },
    "delegate": {
        "id": 2642,
        "url": "https://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20191009115432.14863-2-amorenoz@redhat.com/mbox/",
    "series": [
        {
            "id": 6761,
            "url": "https://patches.dpdk.org/api/series/6761/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=6761",
            "date": "2019-10-09T11:54:29",
            "name": "vhost: add support for IOVA_VA mode",
            "version": 6,
            "mbox": "https://patches.dpdk.org/series/6761/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/60771/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/60771/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 76F3A1E862;\n\tWed,  9 Oct 2019 13:54:53 +0200 (CEST)",
            "from mx1.redhat.com (mx1.redhat.com [209.132.183.28])\n\tby dpdk.org (Postfix) with ESMTP id B6DED1E85F;\n\tWed,  9 Oct 2019 13:54:51 +0200 (CEST)",
            "from smtp.corp.redhat.com\n\t(int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14])\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 2E863307D989;\n\tWed,  9 Oct 2019 11:54:51 +0000 (UTC)",
            "from amorenoz.users.ipa.redhat.com (ovpn-117-37.ams2.redhat.com\n\t[10.36.117.37])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 058B95DA2C;\n\tWed,  9 Oct 2019 11:54:44 +0000 (UTC)"
        ],
        "From": "Adrian Moreno <amorenoz@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "tiwei.bie@intel.com, zhihong.wang@intel.com, maxime.coquelin@redhat.com, \n\tAdrian Moreno <amorenoz@redhat.com>, stable@dpdk.org",
        "Date": "Wed,  9 Oct 2019 13:54:30 +0200",
        "Message-Id": "<20191009115432.14863-2-amorenoz@redhat.com>",
        "In-Reply-To": "<20191009115432.14863-1-amorenoz@redhat.com>",
        "References": "<20191009115432.14863-1-amorenoz@redhat.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.14",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.48]); Wed, 09 Oct 2019 11:54:51 +0000 (UTC)",
        "Subject": "[dpdk-dev] [PATCH v6 1/3] vhost: translate incoming log address to\n\tgpa",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/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 incoming log address is in IOVA space. In that\ncase, look in IOTLB table and translate the resulting HVA to GPA.\n\nIf IOMMU is not enabled, the incoming log address is already a GPA so no\ntransformation is needed.\n\nFixes: 69c90e98f483 (\"vhost: enable IOMMU support\")\nCc: maxime.coquelin@redhat.com\nCc: stable@dpdk.org\nSigned-off-by: Adrian Moreno <amorenoz@redhat.com>\n\n---\nv6 changes: use PRIx64 macro to fix UB1604-32 build\nv5 changes: Rebase on top of dpdk-next-virtio\n---\n lib/librte_vhost/vhost.c      |  1 +\n lib/librte_vhost/vhost.h      | 20 +++++++++++++++++\n lib/librte_vhost/vhost_user.c | 42 ++++++++++++++++++++++++++++++++++-\n 3 files changed, 62 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c\nindex cea44df8c..76e753475 100644\n--- a/lib/librte_vhost/vhost.c\n+++ b/lib/librte_vhost/vhost.c\n@@ -382,6 +382,7 @@ vring_invalidate(struct virtio_net *dev, struct vhost_virtqueue *vq)\n \tvq->desc = NULL;\n \tvq->avail = NULL;\n \tvq->used = NULL;\n+\tvq->log_guest_addr = 0;\n \n \tif (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM))\n \t\tvhost_user_iotlb_wr_unlock(vq);\ndiff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h\nindex 5131a97a3..5e9e7f09d 100644\n--- a/lib/librte_vhost/vhost.h\n+++ b/lib/librte_vhost/vhost.h\n@@ -447,6 +447,26 @@ gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size)\n \treturn 0;\n }\n \n+static __rte_always_inline uint64_t\n+hva_to_gpa(struct virtio_net *dev, uint64_t vva, uint64_t len)\n+{\n+\tstruct rte_vhost_mem_region *r;\n+\tuint32_t i;\n+\n+\tif (unlikely(!dev || !dev->mem))\n+\t\treturn 0;\n+\n+\tfor (i = 0; i < dev->mem->nregions; i++) {\n+\t\tr = &dev->mem->regions[i];\n+\n+\t\tif (vva >= r->host_user_addr &&\n+\t\t    vva + len <  r->host_user_addr + r->size) {\n+\t\t\treturn r->guest_phys_addr + vva - r->host_user_addr;\n+\t\t}\n+\t}\n+\treturn 0;\n+}\n+\n static __rte_always_inline struct virtio_net *\n get_device(int vid)\n {\ndiff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c\nindex ce4e9fb32..5ae561e55 100644\n--- a/lib/librte_vhost/vhost_user.c\n+++ b/lib/librte_vhost/vhost_user.c\n@@ -575,6 +575,39 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq,\n \treturn qva_to_vva(dev, ra, size);\n }\n \n+/*\n+ * Converts vring log address to GPA\n+ * If IOMMU is enabled, the log address is IOVA\n+ * If IOMMU not enabled, the log address is already GPA\n+ */\n+static uint64_t\n+translate_log_addr(struct virtio_net *dev, struct vhost_virtqueue *vq,\n+\t\tuint64_t log_addr)\n+{\n+\tif (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) {\n+\t\tconst uint64_t exp_size = sizeof(struct vring_used) +\n+\t\t\tsizeof(struct vring_used_elem) * vq->size;\n+\t\tuint64_t hva, gpa;\n+\t\tuint64_t size = exp_size;\n+\n+\t\thva = vhost_iova_to_vva(dev, vq, log_addr,\n+\t\t\t\t\t&size, VHOST_ACCESS_RW);\n+\t\tif (size != exp_size)\n+\t\t\treturn 0;\n+\n+\t\tgpa = hva_to_gpa(dev, hva, exp_size);\n+\t\tif (!gpa) {\n+\t\t\tRTE_LOG(ERR, VHOST_CONFIG,\n+\t\t\t\t\"VQ: Failed to find GPA for log_addr: 0x%\" PRIx64 \" hva: 0x%\" PRIx64 \"\\n\",\n+\t\t\t\tlog_addr, hva);\n+\t\t\treturn 0;\n+\t\t}\n+\t\treturn gpa;\n+\n+\t} else\n+\t\treturn log_addr;\n+}\n+\n static struct virtio_net *\n translate_ring_addresses(struct virtio_net *dev, int vq_index)\n {\n@@ -682,7 +715,14 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index)\n \t\tvq->last_avail_idx = vq->used->idx;\n \t}\n \n-\tvq->log_guest_addr = addr->log_guest_addr;\n+\tvq->log_guest_addr =\n+\t\ttranslate_log_addr(dev, vq, addr->log_guest_addr);\n+\tif (vq->log_guest_addr == 0) {\n+\t\tRTE_LOG(DEBUG, VHOST_CONFIG,\n+\t\t\t\"(%d) failed to map log_guest_addr .\\n\",\n+\t\t\tdev->vid);\n+\t\treturn dev;\n+\t}\n \tvq->access_ok = 1;\n \n \tVHOST_LOG_DEBUG(VHOST_CONFIG, \"(%d) mapped address desc: %p\\n\",\n",
    "prefixes": [
        "v6",
        "1/3"
    ]
}