get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1130,
    "url": "https://patches.dpdk.org/api/patches/1130/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1415152183-119796-7-git-send-email-yongwang@vmware.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": "<1415152183-119796-7-git-send-email-yongwang@vmware.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1415152183-119796-7-git-send-email-yongwang@vmware.com",
    "date": "2014-11-05T01:49:43",
    "name": "[dpdk-dev,v2,6/6] vmxnet3: Leverage data_ring on tx path",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "2cd371a5f86650a2306c022675c12cc2b0d65deb",
    "submitter": {
        "id": 93,
        "url": "https://patches.dpdk.org/api/people/93/?format=api",
        "name": "Yong Wang",
        "email": "yongwang@vmware.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1415152183-119796-7-git-send-email-yongwang@vmware.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/1130/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/1130/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 [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id F1E4E7F40;\n\tWed,  5 Nov 2014 02:40:35 +0100 (CET)",
            "from smtp-outbound-2.vmware.com (smtp-outbound-2.vmware.com\n\t[208.91.2.13]) by dpdk.org (Postfix) with ESMTP id 034277E97\n\tfor <dev@dpdk.org>; Wed,  5 Nov 2014 02:40:31 +0100 (CET)",
            "from sc9-mailhost1.vmware.com (sc9-mailhost1.vmware.com\n\t[10.113.161.71])\n\tby smtp-outbound-2.vmware.com (Postfix) with ESMTP id 4F115285BD\n\tfor <dev@dpdk.org>; Tue,  4 Nov 2014 17:49:47 -0800 (PST)",
            "from sc9-mailhost2.vmware.com (unknown [10.32.43.10])\n\tby sc9-mailhost1.vmware.com (Postfix) with ESMTP id 3016519198\n\tfor <dev@dpdk.org>; Tue,  4 Nov 2014 17:49:47 -0800 (PST)"
        ],
        "From": "Yong Wang <yongwang@vmware.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue,  4 Nov 2014 17:49:43 -0800",
        "Message-Id": "<1415152183-119796-7-git-send-email-yongwang@vmware.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1415152183-119796-1-git-send-email-yongwang@vmware.com>",
        "References": "<1415152183-119796-1-git-send-email-yongwang@vmware.com>",
        "Subject": "[dpdk-dev] [PATCH v2 6/6] vmxnet3: Leverage data_ring on tx path",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Data_ring is a pre-mapped guest ring buffer that vmxnet3\nbackend has access to directly without a need for buffer\naddress mapping and unmapping during packet transmission.\nIt is useful in reducing device emulation cost on the tx\npath.  There are some additional cost though on the guest\ndriver for packet copy and overall it's a win.\n\nThis patch leverages the data_ring for packets with a\nlength less than or equal to the data_ring entry size\n(128B).  For larger packet, we won't use the data_ring\nas that requires one extra tx descriptor and it's not\nclear if doing this will be beneficial.\n\nPerformance results show that this patch significantly\nboosts vmxnet3 64B tx performance (pkt rate) for l2fwd\napplication on a Ivy Bridge server by >20% at which\npoint we start to hit some bottleneck on the rx side.\n\nSigned-off-by: Yong Wang <yongwang@vmware.com>\n---\n lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c |  7 +++---\n lib/librte_pmd_vmxnet3/vmxnet3_ring.h   | 13 +++++++---\n lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c   | 43 +++++++++++++++++++++++++--------\n 3 files changed, 47 insertions(+), 16 deletions(-)",
    "diff": "diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c\nindex c6e69f2..64789ac 100644\n--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c\n+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c\n@@ -401,15 +401,17 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)\n \n \tfor (i = 0; i < hw->num_tx_queues; i++) {\n \t\tVmxnet3_TxQueueDesc *tqd = &hw->tqd_start[i];\n-\t\tvmxnet3_tx_queue_t *txq   = dev->data->tx_queues[i];\n+\t\tvmxnet3_tx_queue_t *txq  = dev->data->tx_queues[i];\n \n \t\ttqd->ctrl.txNumDeferred  = 0;\n \t\ttqd->ctrl.txThreshold    = 1;\n \t\ttqd->conf.txRingBasePA   = txq->cmd_ring.basePA;\n \t\ttqd->conf.compRingBasePA = txq->comp_ring.basePA;\n+\t\ttqd->conf.dataRingBasePA = txq->data_ring.basePA;\n \n \t\ttqd->conf.txRingSize   = txq->cmd_ring.size;\n \t\ttqd->conf.compRingSize = txq->comp_ring.size;\n+\t\ttqd->conf.dataRingSize = txq->data_ring.size;\n \t\ttqd->conf.intrIdx      = txq->comp_ring.intr_idx;\n \t\ttqd->status.stopped    = TRUE;\n \t\ttqd->status.error      = 0;\n@@ -418,7 +420,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)\n \n \tfor (i = 0; i < hw->num_rx_queues; i++) {\n \t\tVmxnet3_RxQueueDesc *rqd  = &hw->rqd_start[i];\n-\t\tvmxnet3_rx_queue_t *rxq    = dev->data->rx_queues[i];\n+\t\tvmxnet3_rx_queue_t *rxq   = dev->data->rx_queues[i];\n \n \t\trqd->conf.rxRingBasePA[0] = rxq->cmd_ring[0].basePA;\n \t\trqd->conf.rxRingBasePA[1] = rxq->cmd_ring[1].basePA;\n@@ -583,7 +585,6 @@ vmxnet3_dev_close(struct rte_eth_dev *dev)\n \n \tvmxnet3_dev_stop(dev);\n \thw->adapter_stopped = TRUE;\n-\n }\n \n static void\ndiff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ring.h b/lib/librte_pmd_vmxnet3/vmxnet3_ring.h\nindex 7a5dd5f..c5abdb6 100644\n--- a/lib/librte_pmd_vmxnet3/vmxnet3_ring.h\n+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ring.h\n@@ -51,9 +51,9 @@\n \n typedef struct vmxnet3_buf_info {\n \tuint16_t               len;\n-\tstruct rte_mbuf       *m;\n-\tuint64_t             bufPA;\n-}vmxnet3_buf_info_t;\n+\tstruct rte_mbuf        *m;\n+\tuint64_t               bufPA;\n+} vmxnet3_buf_info_t;\n \n typedef struct vmxnet3_cmd_ring {\n \tvmxnet3_buf_info_t     *buf_info;\n@@ -104,6 +104,12 @@ typedef struct vmxnet3_comp_ring {\n \tuint64_t\t       basePA;\n } vmxnet3_comp_ring_t;\n \n+struct vmxnet3_data_ring {\n+\tstruct Vmxnet3_TxDataDesc *base;\n+\tuint32_t                  size;\n+\tuint64_t                  basePA;\n+};\n+\n static inline void\n vmxnet3_comp_ring_adv_next2proc(struct vmxnet3_comp_ring *ring)\n {\n@@ -143,6 +149,7 @@ typedef struct vmxnet3_tx_queue {\n \tstruct vmxnet3_hw            *hw;\n \tstruct vmxnet3_cmd_ring      cmd_ring;\n \tstruct vmxnet3_comp_ring     comp_ring;\n+\tstruct vmxnet3_data_ring     data_ring;\n \tuint32_t                     qid;\n \tstruct Vmxnet3_TxQueueDesc   *shared;\n \tstruct vmxnet3_txq_stats     stats;\ndiff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c\nindex 4799f4d..e138f9c 100644\n--- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c\n+++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c\n@@ -78,7 +78,6 @@\n #include \"vmxnet3_logs.h\"\n #include \"vmxnet3_ethdev.h\"\n \n-\n #define RTE_MBUF_DATA_DMA_ADDR(mb) \\\n \t(uint64_t) ((mb)->buf_physaddr + (mb)->data_off)\n \n@@ -144,11 +143,12 @@ vmxnet3_txq_dump(struct vmxnet3_tx_queue *txq)\n \tif (txq == NULL)\n \t\treturn;\n \n-\tPMD_TX_LOG(DEBUG, \"TXQ: cmd base : 0x%p comp ring base : 0x%p.\",\n-\t\t   txq->cmd_ring.base, txq->comp_ring.base);\n-\tPMD_TX_LOG(DEBUG, \"TXQ: cmd basePA : 0x%lx comp ring basePA : 0x%lx.\",\n+\tPMD_TX_LOG(DEBUG, \"TXQ: cmd base : 0x%p comp ring base : 0x%p data ring base : 0x%p.\",\n+\t\t   txq->cmd_ring.base, txq->comp_ring.base, txq->data_ring.base);\n+\tPMD_TX_LOG(DEBUG, \"TXQ: cmd basePA : 0x%lx comp ring basePA : 0x%lx data ring basePA : 0x%lx.\",\n \t\t   (unsigned long)txq->cmd_ring.basePA,\n-\t\t   (unsigned long)txq->comp_ring.basePA);\n+\t\t   (unsigned long)txq->comp_ring.basePA,\n+\t\t   (unsigned long)txq->data_ring.basePA);\n \n \tavail = vmxnet3_cmd_ring_desc_avail(&txq->cmd_ring);\n \tPMD_TX_LOG(DEBUG, \"TXQ: size=%u; free=%u; next2proc=%u; queued=%u\",\n@@ -213,6 +213,7 @@ vmxnet3_dev_tx_queue_reset(void *txq)\n \tvmxnet3_tx_queue_t *tq = txq;\n \tstruct vmxnet3_cmd_ring *ring = &tq->cmd_ring;\n \tstruct vmxnet3_comp_ring *comp_ring = &tq->comp_ring;\n+\tstruct vmxnet3_data_ring *data_ring = &tq->data_ring;\n \tint size;\n \n \tif (tq != NULL) {\n@@ -229,6 +230,7 @@ vmxnet3_dev_tx_queue_reset(void *txq)\n \n \tsize = sizeof(struct Vmxnet3_TxDesc) * ring->size;\n \tsize += sizeof(struct Vmxnet3_TxCompDesc) * comp_ring->size;\n+\tsize += sizeof(struct Vmxnet3_TxDataDesc) * data_ring->size;\n \n \tmemset(ring->base, 0, size);\n }\n@@ -342,7 +344,7 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n \n \thw = txq->hw;\n \n-\tif (txq->stopped) {\n+\tif (unlikely(txq->stopped)) {\n \t\tPMD_TX_LOG(DEBUG, \"Tx queue is stopped.\");\n \t\treturn 0;\n \t}\n@@ -354,6 +356,7 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n \twhile (nb_tx < nb_pkts) {\n \n \t\tif (vmxnet3_cmd_ring_desc_avail(&txq->cmd_ring)) {\n+\t\t\tint copy_size = 0;\n \n \t\t\ttxm = tx_pkts[nb_tx];\n \t\t\t/* Don't support scatter packets yet, free them if met */\n@@ -377,11 +380,23 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n \t\t\t}\n \n \t\t\ttxd = (Vmxnet3_TxDesc *)(txq->cmd_ring.base + txq->cmd_ring.next2fill);\n+\t\t\tif (rte_pktmbuf_pkt_len(txm) <= VMXNET3_HDR_COPY_SIZE) {\n+\t\t\t\tstruct Vmxnet3_TxDataDesc *tdd;\n+\t\t\t\n+\t\t\t\ttdd = txq->data_ring.base + txq->cmd_ring.next2fill;\n+\t\t\t\tcopy_size = rte_pktmbuf_pkt_len(txm);\n+\t\t\t\trte_memcpy(tdd->data, rte_pktmbuf_mtod(txm, char *), copy_size);\n+\t\t\t}\n \n \t\t\t/* Fill the tx descriptor */\n \t\t\ttbi = txq->cmd_ring.buf_info + txq->cmd_ring.next2fill;\n \t\t\ttbi->bufPA = RTE_MBUF_DATA_DMA_ADDR(txm);\n-\t\t\ttxd->addr = tbi->bufPA;\n+\t\t\tif (copy_size)\n+\t\t\t\ttxd->addr = rte_cpu_to_le_64(txq->data_ring.basePA +\n+\t\t\t\t\t\t\ttxq->cmd_ring.next2fill *\n+\t\t\t\t\t\t\tsizeof(struct Vmxnet3_TxDataDesc));\n+\t\t\telse\n+\t\t\t\ttxd->addr = tbi->bufPA;\n \t\t\ttxd->len = txm->data_len;\n \n \t\t\t/* Mark the last descriptor as End of Packet. */\n@@ -707,11 +722,12 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \t\t\t   unsigned int socket_id,\n \t\t\t   __attribute__((unused)) const struct rte_eth_txconf *tx_conf)\n {\n-\tstruct vmxnet3_hw     *hw = dev->data->dev_private;\n+\tstruct vmxnet3_hw *hw = dev->data->dev_private;\n \tconst struct rte_memzone *mz;\n \tstruct vmxnet3_tx_queue *txq;\n \tstruct vmxnet3_cmd_ring *ring;\n \tstruct vmxnet3_comp_ring *comp_ring;\n+\tstruct vmxnet3_data_ring *data_ring;\n \tint size;\n \n \tPMD_INIT_FUNC_TRACE();\n@@ -743,6 +759,7 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \n \tring = &txq->cmd_ring;\n \tcomp_ring = &txq->comp_ring;\n+\tdata_ring = &txq->data_ring;\n \n \t/* Tx vmxnet ring length should be between 512-4096 */\n \tif (nb_desc < VMXNET3_DEF_TX_RING_SIZE) {\n@@ -757,7 +774,7 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \t\tring->size = nb_desc;\n \t\tring->size &= ~VMXNET3_RING_SIZE_MASK;\n \t}\n-\tcomp_ring->size = ring->size;\n+\tcomp_ring->size = data_ring->size = ring->size;\n \n \t/* Tx vmxnet rings structure initialization*/\n \tring->next2fill = 0;\n@@ -768,6 +785,7 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \n \tsize = sizeof(struct Vmxnet3_TxDesc) * ring->size;\n \tsize += sizeof(struct Vmxnet3_TxCompDesc) * comp_ring->size;\n+\tsize += sizeof(struct Vmxnet3_TxDataDesc) * data_ring->size;\n \n \tmz = ring_dma_zone_reserve(dev, \"txdesc\", queue_idx, size, socket_id);\n \tif (mz == NULL) {\n@@ -785,6 +803,11 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \tcomp_ring->basePA = ring->basePA +\n \t\t(sizeof(struct Vmxnet3_TxDesc) * ring->size);\n \n+\t/* data_ring initialization */\n+\tdata_ring->base = (Vmxnet3_TxDataDesc *)(comp_ring->base + comp_ring->size);\n+\tdata_ring->basePA = comp_ring->basePA +\n+\t\t\t(sizeof(struct Vmxnet3_TxCompDesc) * comp_ring->size);\n+\n \t/* cmd_ring0 buf_info allocation */\n \tring->buf_info = rte_zmalloc(\"tx_ring_buf_info\",\n \t\t\t\t     ring->size * sizeof(vmxnet3_buf_info_t), CACHE_LINE_SIZE);\n@@ -895,7 +918,7 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,\n \tring1->basePA = ring0->basePA + sizeof(struct Vmxnet3_RxDesc) * ring0->size;\n \n \t/* comp_ring initialization */\n-\tcomp_ring->base = ring1->base +  ring1->size;\n+\tcomp_ring->base = ring1->base + ring1->size;\n \tcomp_ring->basePA = ring1->basePA + sizeof(struct Vmxnet3_RxDesc) *\n \t\tring1->size;\n \n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "6/6"
    ]
}