get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 59328,
    "url": "https://patches.dpdk.org/api/patches/59328/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20190917144900.14407-1-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": "<20190917144900.14407-1-amorenoz@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190917144900.14407-1-amorenoz@redhat.com",
    "date": "2019-09-17T14:49:00",
    "name": "vhost: translate incoming log address to gpa",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f4c24c540a10a2e797752058214b80890192ad2f",
    "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/20190917144900.14407-1-amorenoz@redhat.com/mbox/",
    "series": [
        {
            "id": 6427,
            "url": "https://patches.dpdk.org/api/series/6427/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=6427",
            "date": "2019-09-17T14:49:00",
            "name": "vhost: translate incoming log address to gpa",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/6427/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/59328/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/59328/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 3E1E81C028;\n\tTue, 17 Sep 2019 16:49:46 +0200 (CEST)",
            "from mx1.redhat.com (mx1.redhat.com [209.132.183.28])\n\tby dpdk.org (Postfix) with ESMTP id A6BB31C022\n\tfor <dev@dpdk.org>; Tue, 17 Sep 2019 16:49:44 +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 1294720260;\n\tTue, 17 Sep 2019 14:49:44 +0000 (UTC)",
            "from amorenoz.users.ipa.redhat.com (ovpn-117-92.ams2.redhat.com\n\t[10.36.117.92])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id F1B405DA8C;\n\tTue, 17 Sep 2019 14:49:33 +0000 (UTC)"
        ],
        "From": "Adrian Moreno <amorenoz@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "tiwei.bie@intel.com, zhihong.wang@intel.com,\n\tAdrian Moreno <amorenoz@redhat.com>,\n\tMaxime Coquelin <maxime.coquelin@redhat.com>,\n\tPei Zhang <pezhang@redhat.com>",
        "Date": "Tue, 17 Sep 2019 16:49:00 +0200",
        "Message-Id": "<20190917144900.14407-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.29]); Tue, 17 Sep 2019 14:49:44 +0000 (UTC)",
        "Subject": "[dpdk-dev] [PATCH] vhost: translate incoming log address to gpa",
        "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\nThis change makes page logging work when IOVA_VA is selected in the guest.\nFurther information: https://bugs.dpdk.org/show_bug.cgi?id=337\n\nCc: Maxime Coquelin <maxime.coquelin@redhat.com>\nReported-by: Pei Zhang <pezhang@redhat.com>\n\nSigned-off-by: Adrian Moreno <amorenoz@redhat.com>\n---\n lib/librte_vhost/vhost.c      |  1 +\n lib/librte_vhost/vhost_user.c | 78 ++++++++++++++++++++++++++++++++++-\n 2 files changed, 78 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c\nindex 981837b5d..e57dda22f 100644\n--- a/lib/librte_vhost/vhost.c\n+++ b/lib/librte_vhost/vhost.c\n@@ -383,6 +383,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_user.c b/lib/librte_vhost/vhost_user.c\nindex 0b72648a5..35fca00fe 100644\n--- a/lib/librte_vhost/vhost_user.c\n+++ b/lib/librte_vhost/vhost_user.c\n@@ -570,6 +570,74 @@ 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 Vhost Virtual Address to Guest Physical Address\n+ */\n+static uint64_t\n+vva_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\tgoto out_error;\n+\n+\t/* Find the region where the address lives. */\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 <  r->host_user_addr + r->size) {\n+\n+\t\t\tif (unlikely(vva + *len > r->host_user_addr + r->size))\n+\t\t\t\t*len = r->guest_user_addr + r->size - vva;\n+\n+\t\t\treturn r->guest_phys_addr + vva - r->host_user_addr;\n+\t\t}\n+\t}\n+out_error:\n+\t*len = 0;\n+\n+\treturn 0;\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 vva, gpa;\n+\t\tuint64_t size = exp_size;\n+\n+\t\tvva = vhost_user_iotlb_cache_find(vq, log_addr,\n+\t\t\t\t\t&size, VHOST_ACCESS_RW);\n+\t\tif (size != exp_size) {\n+\t\t\tvhost_user_iotlb_miss(dev, log_addr + size,\n+\t\t\t\t\t      VHOST_ACCESS_RW);\n+\t\t\treturn 0;\n+\t\t}\n+\n+\t\tgpa = vva_to_gpa(dev, vva, &size);\n+\t\tif (size != exp_size) {\n+\t\t\tRTE_LOG(ERR, VHOST_CONFIG,\n+\t\t\t\t\"VQ: Failed to find GPA mapping for log_addr.\"\n+\t\t\t\t\"log_addr: 0x%0lx vva: 0x%0lx\\n\",\n+\t\t\t\tlog_addr, vva);\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@@ -676,7 +744,15 @@ 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+\n \n \tVHOST_LOG_DEBUG(VHOST_CONFIG, \"(%d) mapped address desc: %p\\n\",\n \t\t\tdev->vid, vq->desc);\n",
    "prefixes": []
}