get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45075,
    "url": "http://patches.dpdk.org/api/patches/45075/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180921103308.16357-9-jfreimann@redhat.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<20180921103308.16357-9-jfreimann@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180921103308.16357-9-jfreimann@redhat.com",
    "date": "2018-09-21T10:33:05",
    "name": "[v6,08/11] net/virtio: add support for mergeable buffers with packed virtqueues",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e35990ba5d59ea9f5afca3f685b7abb94c0102e7",
    "submitter": {
        "id": 745,
        "url": "http://patches.dpdk.org/api/people/745/?format=api",
        "name": "Jens Freimann",
        "email": "jfreimann@redhat.com"
    },
    "delegate": {
        "id": 2642,
        "url": "http://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20180921103308.16357-9-jfreimann@redhat.com/mbox/",
    "series": [
        {
            "id": 1435,
            "url": "http://patches.dpdk.org/api/series/1435/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1435",
            "date": "2018-09-21T10:32:57",
            "name": "implement packed virtqueues",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/1435/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/45075/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/45075/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 7C61F5A6E;\n\tFri, 21 Sep 2018 12:34:22 +0200 (CEST)",
            "from mx1.redhat.com (mx1.redhat.com [209.132.183.28])\n\tby dpdk.org (Postfix) with ESMTP id 04FB15A44\n\tfor <dev@dpdk.org>; Fri, 21 Sep 2018 12:34:21 +0200 (CEST)",
            "from smtp.corp.redhat.com\n\t(int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23])\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 6D598307D86F;\n\tFri, 21 Sep 2018 10:34:20 +0000 (UTC)",
            "from localhost (dhcp-192-209.str.redhat.com [10.33.192.209])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id 300F94122;\n\tFri, 21 Sep 2018 10:34:15 +0000 (UTC)"
        ],
        "From": "Jens Freimann <jfreimann@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "tiwei.bie@intel.com,\n\tmaxime.coquelin@redhat.com,\n\tGavin.Hu@arm.com",
        "Date": "Fri, 21 Sep 2018 12:33:05 +0200",
        "Message-Id": "<20180921103308.16357-9-jfreimann@redhat.com>",
        "In-Reply-To": "<20180921103308.16357-1-jfreimann@redhat.com>",
        "References": "<20180921103308.16357-1-jfreimann@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.84 on 10.5.11.23",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.48]); Fri, 21 Sep 2018 10:34:20 +0000 (UTC)",
        "Subject": "[dpdk-dev] [PATCH v6 08/11] net/virtio: add support for mergeable\n\tbuffers with packed virtqueues",
        "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": "Implement support for receiving merged buffers in virtio when packed\nvirtqueues are enabled.\n\nSigned-off-by: Jens Freimann <jfreimann@redhat.com>\n---\n drivers/net/virtio/virtio_ethdev.c |   8 +-\n drivers/net/virtio/virtio_rxtx.c   | 117 ++++++++++++++++++++++++++---\n drivers/net/virtio/virtqueue.h     |   1 +\n 3 files changed, 113 insertions(+), 13 deletions(-)",
    "diff": "diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex f03cf04a9..c4ef095ed 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -1322,12 +1322,12 @@ set_rxtx_funcs(struct rte_eth_dev *eth_dev)\n {\n \tstruct virtio_hw *hw = eth_dev->data->dev_private;\n \n-\t/*\n-\t * workarount for packed vqs which don't support\n-\t * mrg_rxbuf at this point\n-\t */\n \tif (vtpci_packed_queue(hw)) {\n+\t\tif (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) {\n+\t\t\teth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;\n+\t\t} else {\n \t\teth_dev->rx_pkt_burst = &virtio_recv_pkts_packed;\n+\t\t}\n \t} else if (hw->use_simple_rx) {\n \t\tPMD_INIT_LOG(INFO, \"virtio: using simple Rx path on port %u\",\n \t\t\teth_dev->data->port_id);\ndiff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c\nindex 90a0e306f..35c375cd5 100644\n--- a/drivers/net/virtio/virtio_rxtx.c\n+++ b/drivers/net/virtio/virtio_rxtx.c\n@@ -90,6 +90,80 @@ vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx)\n \tdp->next = VQ_RING_DESC_CHAIN_END;\n }\n \n+static void\n+virtio_refill_packed(struct virtqueue *vq, uint16_t used_idx,\n+\t\t     struct virtnet_rx *rxvq)\n+{\n+\tstruct vq_desc_extra *dxp;\n+\tstruct vring_desc_packed *descs = vq->vq_ring.desc_packed;\n+\tstruct vring_desc_packed *desc;\n+\tstruct rte_mbuf *nmb;\n+\n+\tnmb = rte_mbuf_raw_alloc(rxvq->mpool);\n+\tif (unlikely(nmb == NULL)) {\n+\t\tstruct rte_eth_dev *dev\n+\t\t\t= &rte_eth_devices[rxvq->port_id];\n+\t\tdev->data->rx_mbuf_alloc_failed++;\n+\t\treturn;\n+\t}\n+\n+\tdesc = &descs[used_idx];\n+\n+\tdxp = &vq->vq_descx[used_idx];\n+\n+\tdxp->cookie = nmb;\n+\tdxp->ndescs = 1;\n+\n+\tdesc->addr = VIRTIO_MBUF_ADDR(nmb, vq) +\n+\t\tRTE_PKTMBUF_HEADROOM - vq->hw->vtnet_hdr_size;\n+\tdesc->len = nmb->buf_len - RTE_PKTMBUF_HEADROOM +\n+\t\tvq->hw->vtnet_hdr_size;\n+\tdesc->flags |= VRING_DESC_F_WRITE;\n+}\n+\n+static uint16_t\n+virtqueue_dequeue_burst_rx_packed(struct virtqueue *vq,\n+\t\t\t\t  struct rte_mbuf **rx_pkts,\n+\t\t\t\t  uint32_t *len,\n+\t\t\t\t  uint16_t num,\n+\t\t\t\t  struct virtnet_rx *rx_queue)\n+{\n+\tstruct rte_mbuf *cookie;\n+\tuint16_t used_idx;\n+\tuint16_t id;\n+\tstruct vring_desc_packed *desc;\n+\tuint16_t i;\n+\n+\tfor (i = 0; i < num; i++) {\n+\t\tused_idx = vq->vq_used_cons_idx;\n+\t\tdesc = &vq->vq_ring.desc_packed[used_idx];\n+\t\tif (!desc_is_used(desc, &vq->vq_ring))\n+\t\t\treturn i;\n+\t\tlen[i] = desc->len;\n+\t\tid = desc[used_idx].index;\n+\t\tcookie = (struct rte_mbuf *)vq->vq_descx[id].cookie;\n+\n+\t\tif (unlikely(cookie == NULL)) {\n+\t\t\tPMD_DRV_LOG(ERR, \"vring descriptor with no mbuf cookie at %u\",\n+\t\t\t\tvq->vq_used_cons_idx);\n+\t\t\tbreak;\n+\t\t}\n+\t\trte_prefetch0(cookie);\n+\t\trte_packet_prefetch(rte_pktmbuf_mtod(cookie, void *));\n+\t\trx_pkts[i] = cookie;\n+\n+\t\tvirtio_refill_packed(vq, used_idx, rx_queue);\n+\n+\t\tif (++vq->vq_used_cons_idx >= vq->vq_nentries) {\n+\t\t\tvq->vq_used_cons_idx = 0;\n+\t\t\tvq->vq_ring.used_wrap_counter ^= 1;\n+\t\t}\n+\t\tvq->vq_descx[id].cookie = NULL;\n+\t}\n+\n+\treturn i;\n+}\n+\n static uint16_t\n virtqueue_dequeue_burst_rx(struct virtqueue *vq, struct rte_mbuf **rx_pkts,\n \t\t\t   uint32_t *len, uint16_t num)\n@@ -1476,12 +1550,16 @@ virtio_recv_mergeable_pkts(void *rx_queue,\n \tuint16_t extra_idx;\n \tuint32_t seg_res;\n \tuint32_t hdr_size;\n+\tuint32_t rx_num = 0;\n \n \tnb_rx = 0;\n \tif (unlikely(hw->started == 0))\n \t\treturn nb_rx;\n \n-\tnb_used = VIRTQUEUE_NUSED(vq);\n+\tif (vtpci_packed_queue(vq->hw))\n+\t\tnb_used = VIRTIO_MBUF_BURST_SZ;\n+\telse\n+\t\tnb_used = VIRTQUEUE_NUSED(vq);\n \n \tvirtio_rmb();\n \n@@ -1494,13 +1572,21 @@ virtio_recv_mergeable_pkts(void *rx_queue,\n \tseg_res = 0;\n \thdr_size = hw->vtnet_hdr_size;\n \n+\tvq->vq_used_idx = vq->vq_used_cons_idx;\n+\n \twhile (i < nb_used) {\n \t\tstruct virtio_net_hdr_mrg_rxbuf *header;\n \n \t\tif (nb_rx == nb_pkts)\n \t\t\tbreak;\n \n-\t\tnum = virtqueue_dequeue_burst_rx(vq, rcv_pkts, len, 1);\n+\t\tif (vtpci_packed_queue(vq->hw))\n+\t\t\tnum = virtqueue_dequeue_burst_rx_packed(vq, rcv_pkts,\n+\t\t\t\tlen, 1, (struct virtnet_rx *)rx_queue);\n+\t\telse\n+\t\t\tnum = virtqueue_dequeue_burst_rx(vq, rcv_pkts, len, 1);\n+\t\tif (num == 0)\n+\t\t\treturn nb_rx;\n \t\tif (num != 1)\n \t\t\tcontinue;\n \n@@ -1552,12 +1638,15 @@ virtio_recv_mergeable_pkts(void *rx_queue,\n \t\t\t */\n \t\t\tuint16_t  rcv_cnt =\n \t\t\t\tRTE_MIN(seg_res, RTE_DIM(rcv_pkts));\n-\t\t\tif (likely(VIRTQUEUE_NUSED(vq) >= rcv_cnt)) {\n-\t\t\t\tuint32_t rx_num =\n-\t\t\t\t\tvirtqueue_dequeue_burst_rx(vq,\n-\t\t\t\t\trcv_pkts, len, rcv_cnt);\n-\t\t\t\ti += rx_num;\n-\t\t\t\trcv_cnt = rx_num;\n+\t\t\tif (vtpci_packed_queue(vq->hw)) {\n+\t\t\t\tif (likely(vq->vq_free_cnt >= rcv_cnt)) {\t\n+\t\t\t\t\trx_num = virtqueue_dequeue_burst_rx_packed(vq,\n+\t\t\t\t\t\t     rcv_pkts, len, rcv_cnt,\n+\t\t\t\t\t\t     (struct virtnet_rx *)rx_queue);\n+\t\t\t\t}\n+\t\t\t} else if (likely(VIRTQUEUE_NUSED(vq) >= rcv_cnt)) {\n+\t\t\t\trx_num = virtqueue_dequeue_burst_rx(vq,\n+\t\t\t\t\t      rcv_pkts, len, rcv_cnt);\n \t\t\t} else {\n \t\t\t\tPMD_RX_LOG(ERR,\n \t\t\t\t\t   \"No enough segments for packet.\");\n@@ -1566,6 +1655,8 @@ virtio_recv_mergeable_pkts(void *rx_queue,\n \t\t\t\trxvq->stats.errors++;\n \t\t\t\tbreak;\n \t\t\t}\n+\t\t\ti += rx_num;\n+\t\t\trcv_cnt = rx_num;\n \n \t\t\textra_idx = 0;\n \n@@ -1599,6 +1690,15 @@ virtio_recv_mergeable_pkts(void *rx_queue,\n \n \trxvq->stats.packets += nb_rx;\n \n+\tif (vtpci_packed_queue(vq->hw)) {\n+\t\tif (unlikely(virtqueue_kick_prepare_packed(vq)) &&\n+\t\t    likely(nb_rx)) {\n+\t\t\tvirtqueue_notify(vq);\n+\t\t\tPMD_RX_LOG(DEBUG, \"Notified\");\n+\t\t}\n+\t\treturn nb_rx;\n+\t}\n+\n \t/* Allocate new mbuf for the used descriptor */\n \twhile (likely(!virtqueue_full(vq))) {\n \t\tnew_mbuf = rte_mbuf_raw_alloc(rxvq->mpool);\n@@ -1618,7 +1718,6 @@ virtio_recv_mergeable_pkts(void *rx_queue,\n \n \tif (likely(nb_enqueued)) {\n \t\tvq_update_avail_idx(vq);\n-\n \t\tif (unlikely(virtqueue_kick_prepare(vq))) {\n \t\t\tvirtqueue_notify(vq);\n \t\t\tPMD_RX_LOG(DEBUG, \"Notified\");\ndiff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h\nindex ffa2d8f92..15df6a050 100644\n--- a/drivers/net/virtio/virtqueue.h\n+++ b/drivers/net/virtio/virtqueue.h\n@@ -171,6 +171,7 @@ struct virtqueue {\n \t * trails vq_ring.used->idx.\n \t */\n \tuint16_t vq_used_cons_idx;\n+\tuint16_t vq_used_idx;\n \tuint16_t vq_nentries;  /**< vring desc numbers */\n \tuint16_t vq_free_cnt;  /**< num of desc available */\n \tuint16_t vq_avail_idx; /**< sync until needed */\n",
    "prefixes": [
        "v6",
        "08/11"
    ]
}