get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 69211,
    "url": "http://patchwork.dpdk.org/api/patches/69211/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20200424092445.44693-4-yong.liu@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20200424092445.44693-4-yong.liu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200424092445.44693-4-yong.liu@intel.com",
    "date": "2020-04-24T09:24:39",
    "name": "[v9,3/9] net/virtio: add vectorized devarg",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "89c929ec27d768b7549539dd1eefdfa5aa87107a",
    "submitter": {
        "id": 17,
        "url": "http://patchwork.dpdk.org/api/people/17/?format=api",
        "name": "Marvin Liu",
        "email": "yong.liu@intel.com"
    },
    "delegate": {
        "id": 2642,
        "url": "http://patchwork.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20200424092445.44693-4-yong.liu@intel.com/mbox/",
    "series": [
        {
            "id": 9605,
            "url": "http://patchwork.dpdk.org/api/series/9605/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=9605",
            "date": "2020-04-24T09:24:36",
            "name": "add packed ring vectorized path",
            "version": 9,
            "mbox": "http://patchwork.dpdk.org/series/9605/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/69211/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/69211/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id B60FBA00C4;\n\tFri, 24 Apr 2020 03:49:56 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5040E1C28F;\n\tFri, 24 Apr 2020 03:49:38 +0200 (CEST)",
            "from mga06.intel.com (mga06.intel.com [134.134.136.31])\n by dpdk.org (Postfix) with ESMTP id ED6681C23E\n for <dev@dpdk.org>; Fri, 24 Apr 2020 03:49:33 +0200 (CEST)",
            "from orsmga007.jf.intel.com ([10.7.209.58])\n by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 23 Apr 2020 18:49:33 -0700",
            "from npg-dpdk-virtual-marvin-dev.sh.intel.com ([10.67.119.56])\n by orsmga007.jf.intel.com with ESMTP; 23 Apr 2020 18:49:31 -0700"
        ],
        "IronPort-SDR": [
            "\n gsHOAVZK5kW8pdRGILsj2IQLT1UMPWCDRAjIrIUjFvCfU+9y3eCEPswHhHtiLb1usGn/oHeIg8\n xy2FQdjt3Apw==",
            "\n u5qPa4mpcKvveKNC5oVNM2tf/m1/vpsi8hCJrH1gg7goB71uYWzvRhTFvmmgQbIgWXd8TSEHya\n c3qyrif89UGQ=="
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.73,310,1583222400\"; d=\"scan'208\";a=\"245083900\"",
        "From": "Marvin Liu <yong.liu@intel.com>",
        "To": "maxime.coquelin@redhat.com, xiaolong.ye@intel.com, zhihong.wang@intel.com",
        "Cc": "dev@dpdk.org, harry.van.haaren@intel.com, Marvin Liu <yong.liu@intel.com>",
        "Date": "Fri, 24 Apr 2020 17:24:39 +0800",
        "Message-Id": "<20200424092445.44693-4-yong.liu@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20200424092445.44693-1-yong.liu@intel.com>",
        "References": "<20200313174230.74661-1-yong.liu@intel.com>\n <20200424092445.44693-1-yong.liu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v9 3/9] net/virtio: add vectorized devarg",
        "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 <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 <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Previously, virtio split ring vectorized path was enabled by default.\nThis is not suitable for everyone because that path dose not follow\nvirtio spec. Add new devarg for virtio vectorized path selection. By\ndefault vectorized path is disabled.\n\nSigned-off-by: Marvin Liu <yong.liu@intel.com>",
    "diff": "diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst\nindex 6286286db..902a1f0cf 100644\n--- a/doc/guides/nics/virtio.rst\n+++ b/doc/guides/nics/virtio.rst\n@@ -363,6 +363,13 @@ Below devargs are supported by the PCI virtio driver:\n     rte_eth_link_get_nowait function.\n     (Default: 10000 (10G))\n \n+#.  ``vectorized``:\n+\n+    It is used to specify whether virtio device perfer to use vectorized path.\n+    Afterwards, dependencies of vectorized path will be checked in path\n+    election.\n+    (Default: 0 (disabled))\n+\n Below devargs are supported by the virtio-user vdev:\n \n #.  ``path``:\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex 37766cbb6..0a69a4db1 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -48,7 +48,8 @@ static int virtio_dev_allmulticast_disable(struct rte_eth_dev *dev);\n static uint32_t virtio_dev_speed_capa_get(uint32_t speed);\n static int virtio_dev_devargs_parse(struct rte_devargs *devargs,\n \tint *vdpa,\n-\tuint32_t *speed);\n+\tuint32_t *speed,\n+\tint *vectorized);\n static int virtio_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_dev_info *dev_info);\n static int virtio_dev_link_update(struct rte_eth_dev *dev,\n@@ -1551,8 +1552,8 @@ set_rxtx_funcs(struct rte_eth_dev *eth_dev)\n \t\t\teth_dev->rx_pkt_burst = &virtio_recv_pkts_packed;\n \t\t}\n \t} else {\n-\t\tif (hw->use_simple_rx) {\n-\t\t\tPMD_INIT_LOG(INFO, \"virtio: using simple Rx path on port %u\",\n+\t\tif (hw->use_vec_rx) {\n+\t\t\tPMD_INIT_LOG(INFO, \"virtio: using vectorized Rx path on port %u\",\n \t\t\t\teth_dev->data->port_id);\n \t\t\teth_dev->rx_pkt_burst = virtio_recv_pkts_vec;\n \t\t} else if (hw->use_inorder_rx) {\n@@ -1886,6 +1887,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)\n {\n \tstruct virtio_hw *hw = eth_dev->data->dev_private;\n \tuint32_t speed = SPEED_UNKNOWN;\n+\tint vectorized = 0;\n \tint ret;\n \n \tif (sizeof(struct virtio_net_hdr_mrg_rxbuf) > RTE_PKTMBUF_HEADROOM) {\n@@ -1912,7 +1914,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)\n \t\treturn 0;\n \t}\n \tret = virtio_dev_devargs_parse(eth_dev->device->devargs,\n-\t\t NULL, &speed);\n+\t\t NULL, &speed, &vectorized);\n \tif (ret < 0)\n \t\treturn ret;\n \thw->speed = speed;\n@@ -1949,6 +1951,11 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)\n \tif (ret < 0)\n \t\tgoto err_virtio_init;\n \n+\tif (vectorized) {\n+\t\tif (!vtpci_packed_queue(hw))\n+\t\t\thw->use_vec_rx = 1;\n+\t}\n+\n \thw->opened = true;\n \n \treturn 0;\n@@ -2021,9 +2028,20 @@ virtio_dev_speed_capa_get(uint32_t speed)\n \t}\n }\n \n+static int vectorized_check_handler(__rte_unused const char *key,\n+\t\tconst char *value, void *ret_val)\n+{\n+\tif (strcmp(value, \"1\") == 0)\n+\t\t*(int *)ret_val = 1;\n+\telse\n+\t\t*(int *)ret_val = 0;\n+\n+\treturn 0;\n+}\n \n #define VIRTIO_ARG_SPEED      \"speed\"\n #define VIRTIO_ARG_VDPA       \"vdpa\"\n+#define VIRTIO_ARG_VECTORIZED \"vectorized\"\n \n \n static int\n@@ -2045,7 +2063,7 @@ link_speed_handler(const char *key __rte_unused,\n \n static int\n virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa,\n-\tuint32_t *speed)\n+\tuint32_t *speed, int *vectorized)\n {\n \tstruct rte_kvargs *kvlist;\n \tint ret = 0;\n@@ -2081,6 +2099,18 @@ virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa,\n \t\t}\n \t}\n \n+\tif (vectorized &&\n+\t\trte_kvargs_count(kvlist, VIRTIO_ARG_VECTORIZED) == 1) {\n+\t\tret = rte_kvargs_process(kvlist,\n+\t\t\t\tVIRTIO_ARG_VECTORIZED,\n+\t\t\t\tvectorized_check_handler, vectorized);\n+\t\tif (ret < 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Failed to parse %s\",\n+\t\t\t\t\tVIRTIO_ARG_VECTORIZED);\n+\t\t\tgoto exit;\n+\t\t}\n+\t}\n+\n exit:\n \trte_kvargs_free(kvlist);\n \treturn ret;\n@@ -2092,7 +2122,8 @@ static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \tint vdpa = 0;\n \tint ret = 0;\n \n-\tret = virtio_dev_devargs_parse(pci_dev->device.devargs, &vdpa, NULL);\n+\tret = virtio_dev_devargs_parse(pci_dev->device.devargs, &vdpa, NULL,\n+\t\tNULL);\n \tif (ret < 0) {\n \t\tPMD_INIT_LOG(ERR, \"devargs parsing is failed\");\n \t\treturn ret;\n@@ -2257,33 +2288,31 @@ virtio_dev_configure(struct rte_eth_dev *dev)\n \t\t\treturn -EBUSY;\n \t\t}\n \n-\thw->use_simple_rx = 1;\n-\n \tif (vtpci_with_feature(hw, VIRTIO_F_IN_ORDER)) {\n \t\thw->use_inorder_tx = 1;\n \t\thw->use_inorder_rx = 1;\n-\t\thw->use_simple_rx = 0;\n+\t\thw->use_vec_rx = 0;\n \t}\n \n \tif (vtpci_packed_queue(hw)) {\n-\t\thw->use_simple_rx = 0;\n+\t\thw->use_vec_rx = 0;\n \t\thw->use_inorder_rx = 0;\n \t}\n \n #if defined RTE_ARCH_ARM64 || defined RTE_ARCH_ARM\n \tif (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON)) {\n-\t\thw->use_simple_rx = 0;\n+\t\thw->use_vec_rx = 0;\n \t}\n #endif\n \tif (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) {\n-\t\t hw->use_simple_rx = 0;\n+\t\thw->use_vec_rx = 0;\n \t}\n \n \tif (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM |\n \t\t\t   DEV_RX_OFFLOAD_TCP_CKSUM |\n \t\t\t   DEV_RX_OFFLOAD_TCP_LRO |\n \t\t\t   DEV_RX_OFFLOAD_VLAN_STRIP))\n-\t\thw->use_simple_rx = 0;\n+\t\thw->use_vec_rx = 0;\n \n \treturn 0;\n }\ndiff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h\nindex bd89357e4..668e688e1 100644\n--- a/drivers/net/virtio/virtio_pci.h\n+++ b/drivers/net/virtio/virtio_pci.h\n@@ -253,7 +253,8 @@ struct virtio_hw {\n \tuint8_t\t    vlan_strip;\n \tuint8_t\t    use_msix;\n \tuint8_t     modern;\n-\tuint8_t     use_simple_rx;\n+\tuint8_t     use_vec_rx;\n+\tuint8_t     use_vec_tx;\n \tuint8_t     use_inorder_rx;\n \tuint8_t     use_inorder_tx;\n \tuint8_t     weak_barriers;\ndiff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c\nindex e450477e8..84f4cf946 100644\n--- a/drivers/net/virtio/virtio_rxtx.c\n+++ b/drivers/net/virtio/virtio_rxtx.c\n@@ -996,7 +996,7 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx)\n \t/* Allocate blank mbufs for the each rx descriptor */\n \tnbufs = 0;\n \n-\tif (hw->use_simple_rx) {\n+\tif (hw->use_vec_rx && !vtpci_packed_queue(hw)) {\n \t\tfor (desc_idx = 0; desc_idx < vq->vq_nentries;\n \t\t     desc_idx++) {\n \t\t\tvq->vq_split.ring.avail->ring[desc_idx] = desc_idx;\n@@ -1014,7 +1014,7 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx)\n \t\t\t&rxvq->fake_mbuf;\n \t}\n \n-\tif (hw->use_simple_rx) {\n+\tif (hw->use_vec_rx && !vtpci_packed_queue(hw)) {\n \t\twhile (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) {\n \t\t\tvirtio_rxq_rearm_vec(rxvq);\n \t\t\tnbufs += RTE_VIRTIO_VPMD_RX_REARM_THRESH;\ndiff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c\nindex 953f00d72..150a8d987 100644\n--- a/drivers/net/virtio/virtio_user_ethdev.c\n+++ b/drivers/net/virtio/virtio_user_ethdev.c\n@@ -525,7 +525,7 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev)\n \t */\n \thw->use_msix = 1;\n \thw->modern   = 0;\n-\thw->use_simple_rx = 0;\n+\thw->use_vec_rx = 0;\n \thw->use_inorder_rx = 0;\n \thw->use_inorder_tx = 0;\n \thw->virtio_user_dev = dev;\ndiff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c\nindex 0b4e3bf3e..ca23180de 100644\n--- a/drivers/net/virtio/virtqueue.c\n+++ b/drivers/net/virtio/virtqueue.c\n@@ -32,7 +32,8 @@ virtqueue_detach_unused(struct virtqueue *vq)\n \tend = (vq->vq_avail_idx + vq->vq_free_cnt) & (vq->vq_nentries - 1);\n \n \tfor (idx = 0; idx < vq->vq_nentries; idx++) {\n-\t\tif (hw->use_simple_rx && type == VTNET_RQ) {\n+\t\tif (hw->use_vec_rx && !vtpci_packed_queue(hw) &&\n+\t\t    type == VTNET_RQ) {\n \t\t\tif (start <= end && idx >= start && idx < end)\n \t\t\t\tcontinue;\n \t\t\tif (start > end && (idx >= start || idx < end))\n@@ -97,7 +98,7 @@ virtqueue_rxvq_flush_split(struct virtqueue *vq)\n \tfor (i = 0; i < nb_used; i++) {\n \t\tused_idx = vq->vq_used_cons_idx & (vq->vq_nentries - 1);\n \t\tuep = &vq->vq_split.ring.used->ring[used_idx];\n-\t\tif (hw->use_simple_rx) {\n+\t\tif (hw->use_vec_rx) {\n \t\t\tdesc_idx = used_idx;\n \t\t\trte_pktmbuf_free(vq->sw_ring[desc_idx]);\n \t\t\tvq->vq_free_cnt++;\n@@ -121,7 +122,7 @@ virtqueue_rxvq_flush_split(struct virtqueue *vq)\n \t\tvq->vq_used_cons_idx++;\n \t}\n \n-\tif (hw->use_simple_rx) {\n+\tif (hw->use_vec_rx) {\n \t\twhile (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) {\n \t\t\tvirtio_rxq_rearm_vec(rxq);\n \t\t\tif (virtqueue_kick_prepare(vq))\n",
    "prefixes": [
        "v9",
        "3/9"
    ]
}