get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 61174,
    "url": "https://patches.dpdk.org/api/patches/61174/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20191015143014.1656-11-yong.liu@intel.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": "<20191015143014.1656-11-yong.liu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20191015143014.1656-11-yong.liu@intel.com",
    "date": "2019-10-15T14:30:11",
    "name": "[v5,10/13] vhost: optimize packed ring enqueue",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9f603b8ed8c1c4945c76f629962db2925ef3bb12",
    "submitter": {
        "id": 17,
        "url": "https://patches.dpdk.org/api/people/17/?format=api",
        "name": "Marvin Liu",
        "email": "yong.liu@intel.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/20191015143014.1656-11-yong.liu@intel.com/mbox/",
    "series": [
        {
            "id": 6845,
            "url": "https://patches.dpdk.org/api/series/6845/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=6845",
            "date": "2019-10-15T14:30:01",
            "name": "vhost packed ring performance optimization",
            "version": 5,
            "mbox": "https://patches.dpdk.org/series/6845/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/61174/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/61174/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 0F8F81D179;\n\tTue, 15 Oct 2019 08:52:05 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 33D431D171\n\tfor <dev@dpdk.org>; Tue, 15 Oct 2019 08:51:52 +0200 (CEST)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n\tby orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t14 Oct 2019 23:51:51 -0700",
            "from npg-dpdk-virtual-marvin-dev.sh.intel.com ([10.67.119.142])\n\tby orsmga001.jf.intel.com with ESMTP; 14 Oct 2019 23:51:49 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.67,298,1566889200\"; d=\"scan'208\";a=\"279098562\"",
        "From": "Marvin Liu <yong.liu@intel.com>",
        "To": "maxime.coquelin@redhat.com, tiwei.bie@intel.com, zhihong.wang@intel.com, \n\tstephen@networkplumber.org, gavin.hu@arm.com",
        "Cc": "dev@dpdk.org,\n\tMarvin Liu <yong.liu@intel.com>",
        "Date": "Tue, 15 Oct 2019 22:30:11 +0800",
        "Message-Id": "<20191015143014.1656-11-yong.liu@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20191015143014.1656-1-yong.liu@intel.com>",
        "References": "<20191009133849.69002-1-yong.liu@intel.com>\n\t<20191015143014.1656-1-yong.liu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v5 10/13] vhost: optimize packed ring enqueue",
        "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": "Optimize vhost device packed ring enqueue function by splitting batch\nand single functions. Packets can be filled into one desc will be\nhandled by batch and others will be handled by single as before.\n\nSigned-off-by: Marvin Liu <yong.liu@intel.com>",
    "diff": "diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c\nindex 750d16f50..5cdca9a7f 100644\n--- a/lib/librte_vhost/virtio_net.c\n+++ b/lib/librte_vhost/virtio_net.c\n@@ -772,64 +772,6 @@ fill_vec_buf_packed(struct virtio_net *dev, struct vhost_virtqueue *vq,\n \treturn 0;\n }\n \n-/*\n- * Returns -1 on fail, 0 on success\n- */\n-static inline int\n-reserve_avail_buf_packed(struct virtio_net *dev, struct vhost_virtqueue *vq,\n-\t\t\t\tuint32_t size, struct buf_vector *buf_vec,\n-\t\t\t\tuint16_t *nr_vec, uint16_t *num_buffers,\n-\t\t\t\tuint16_t *nr_descs)\n-{\n-\tuint16_t avail_idx;\n-\tuint16_t vec_idx = 0;\n-\tuint16_t max_tries, tries = 0;\n-\n-\tuint16_t buf_id = 0;\n-\tuint32_t len = 0;\n-\tuint16_t desc_count;\n-\n-\t*num_buffers = 0;\n-\tavail_idx = vq->last_avail_idx;\n-\n-\tif (rxvq_is_mergeable(dev))\n-\t\tmax_tries = vq->size - 1;\n-\telse\n-\t\tmax_tries = 1;\n-\n-\twhile (size > 0) {\n-\t\t/*\n-\t\t * if we tried all available ring items, and still\n-\t\t * can't get enough buf, it means something abnormal\n-\t\t * happened.\n-\t\t */\n-\t\tif (unlikely(++tries > max_tries))\n-\t\t\treturn -1;\n-\n-\t\tif (unlikely(fill_vec_buf_packed(dev, vq,\n-\t\t\t\t\t\tavail_idx, &desc_count,\n-\t\t\t\t\t\tbuf_vec, &vec_idx,\n-\t\t\t\t\t\t&buf_id, &len,\n-\t\t\t\t\t\tVHOST_ACCESS_RW) < 0))\n-\t\t\treturn -1;\n-\n-\t\tlen = RTE_MIN(len, size);\n-\t\tupdate_shadow_used_ring_packed(vq, buf_id, len, desc_count);\n-\t\tsize -= len;\n-\n-\t\tavail_idx += desc_count;\n-\t\tif (avail_idx >= vq->size)\n-\t\t\tavail_idx -= vq->size;\n-\n-\t\t*nr_descs += desc_count;\n-\t\t*num_buffers += 1;\n-\t}\n-\n-\t*nr_vec = vec_idx;\n-\n-\treturn 0;\n-}\n-\n static __rte_noinline void\n copy_vnet_hdr_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq,\n \t\tstruct buf_vector *buf_vec,\n@@ -1111,7 +1053,7 @@ virtio_dev_rx_split(struct virtio_net *dev, struct vhost_virtqueue *vq,\n \treturn pkt_idx;\n }\n \n-static __rte_unused int\n+static __rte_always_inline int\n virtio_dev_rx_batch_packed(struct virtio_net *dev,\n \t\t\t   struct vhost_virtqueue *vq,\n \t\t\t   struct rte_mbuf **pkts)\n@@ -1187,7 +1129,7 @@ virtio_dev_rx_batch_packed(struct virtio_net *dev,\n \treturn 0;\n }\n \n-static __rte_unused int16_t\n+static __rte_always_inline int16_t\n virtio_dev_rx_single_packed(struct virtio_net *dev,\n \t\t\t    struct vhost_virtqueue *vq,\n \t\t\t    struct rte_mbuf *pkt)\n@@ -1214,49 +1156,40 @@ virtio_dev_rx_single_packed(struct virtio_net *dev,\n }\n \n static __rte_noinline uint32_t\n-virtio_dev_rx_packed(struct virtio_net *dev, struct vhost_virtqueue *vq,\n-\tstruct rte_mbuf **pkts, uint32_t count)\n+virtio_dev_rx_packed(struct virtio_net *dev,\n+\t\t     struct vhost_virtqueue *vq,\n+\t\t     struct rte_mbuf **pkts,\n+\t\t     uint32_t count)\n {\n \tuint32_t pkt_idx = 0;\n-\tuint16_t num_buffers;\n-\tstruct buf_vector buf_vec[BUF_VECTOR_MAX];\n+\tuint32_t remained = count;\n \n-\tfor (pkt_idx = 0; pkt_idx < count; pkt_idx++) {\n-\t\tuint32_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen;\n-\t\tuint16_t nr_vec = 0;\n-\t\tuint16_t nr_descs = 0;\n+\tdo {\n+\t\trte_prefetch0(&vq->desc_packed[vq->last_avail_idx]);\n \n-\t\tif (unlikely(reserve_avail_buf_packed(dev, vq,\n-\t\t\t\t\t\tpkt_len, buf_vec, &nr_vec,\n-\t\t\t\t\t\t&num_buffers, &nr_descs) < 0)) {\n-\t\t\tVHOST_LOG_DEBUG(VHOST_DATA,\n-\t\t\t\t\"(%d) failed to get enough desc from vring\\n\",\n-\t\t\t\tdev->vid);\n-\t\t\tvq->shadow_used_idx -= num_buffers;\n-\t\t\tbreak;\n+\t\tif (remained >= PACKED_BATCH_SIZE) {\n+\t\t\tif (!virtio_dev_rx_batch_packed(dev, vq, pkts)) {\n+\t\t\t\tpkt_idx += PACKED_BATCH_SIZE;\n+\t\t\t\tremained -= PACKED_BATCH_SIZE;\n+\t\t\t\tcontinue;\n+\t\t\t}\n \t\t}\n \n-\t\tVHOST_LOG_DEBUG(VHOST_DATA, \"(%d) current index %d | end index %d\\n\",\n-\t\t\tdev->vid, vq->last_avail_idx,\n-\t\t\tvq->last_avail_idx + num_buffers);\n-\n-\t\tif (copy_mbuf_to_desc(dev, vq, pkts[pkt_idx],\n-\t\t\t\t\t\tbuf_vec, nr_vec,\n-\t\t\t\t\t\tnum_buffers) < 0) {\n-\t\t\tvq->shadow_used_idx -= num_buffers;\n+\t\tif (virtio_dev_rx_single_packed(dev, vq, pkts[pkt_idx]))\n \t\t\tbreak;\n-\t\t}\n+\t\tpkt_idx++;\n+\t\tremained--;\n \n-\t\tvq_inc_last_avail_packed(vq, nr_descs);\n-\t}\n-\n-\tdo_data_copy_enqueue(dev, vq);\n+\t} while (pkt_idx < count);\n \n-\tif (likely(vq->shadow_used_idx)) {\n+\tif (vq->shadow_used_idx) {\n+\t\tdo_data_copy_enqueue(dev, vq);\n \t\tvhost_flush_enqueue_shadow_packed(dev, vq);\n-\t\tvhost_vring_call_packed(dev, vq);\n \t}\n \n+\tif (pkt_idx)\n+\t\tvhost_vring_call_packed(dev, vq);\n+\n \treturn pkt_idx;\n }\n \n",
    "prefixes": [
        "v5",
        "10/13"
    ]
}