get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 3965,
    "url": "https://patches.dpdk.org/api/patches/3965/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1426015891-20450-3-git-send-email-vladz@cloudius-systems.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": "<1426015891-20450-3-git-send-email-vladz@cloudius-systems.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1426015891-20450-3-git-send-email-vladz@cloudius-systems.com",
    "date": "2015-03-10T19:31:30",
    "name": "[dpdk-dev,v7,2/3] ixgbe: Code refactoring",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "38ecb12b1eec029fa6779d09e7654a0103c96f93",
    "submitter": {
        "id": 141,
        "url": "https://patches.dpdk.org/api/people/141/?format=api",
        "name": "Vladislav Zolotarov",
        "email": "vladz@cloudius-systems.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1426015891-20450-3-git-send-email-vladz@cloudius-systems.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/3965/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/3965/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 5A2D19AAC;\n\tTue, 10 Mar 2015 20:31:40 +0100 (CET)",
            "from mail-we0-f173.google.com (mail-we0-f173.google.com\n\t[74.125.82.173]) by dpdk.org (Postfix) with ESMTP id E713C9A9F\n\tfor <dev@dpdk.org>; Tue, 10 Mar 2015 20:31:37 +0100 (CET)",
            "by wesw62 with SMTP id w62so4219302wes.0\n\tfor <dev@dpdk.org>; Tue, 10 Mar 2015 12:31:37 -0700 (PDT)",
            "from vladz-laptop.cloudius-systems.com. ([212.143.139.214])\n\tby mx.google.com with ESMTPSA id\n\tgz3sm2957940wib.1.2015.03.10.12.31.36\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 10 Mar 2015 12:31:37 -0700 (PDT)"
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=8rhPqVm1XZsvvHEHEwXtZ9HUki1sXoghgbTlPWPgFPA=;\n\tb=PCucpSwL6guYYRXT8py5cr/X0IqGhNvtPXtvI4CuatpMHyqzttkRCTiJXke0WB9H+s\n\ttUujxQDaxtSpqNrsZIudHsB0MqPLLPMp2Z2q0ep/zdnS4UHRA9XsahjTxS8u5JnFUG4y\n\tVoG6FIKR6WJbFbVB4yuHJCQXNY3EPam6LFg85iVy7ziF/7m6QG91u901va1tcoZ/52yn\n\tZ0Zxf8O+4Jwd0mBfhBw+1AXhQoeSMY/DMPaUwHzpl0D6zw7flCxpuUvptnLb964kcIje\n\tYqsPNcKibKEv/Iyau8LkNXzZT9gPJ6cxB9z+BQqAzQjA1yQJizDrZJsas27F9KEJS8iZ\n\txEPw==",
        "X-Gm-Message-State": "ALoCoQmY0zvsxhd6W5wjmqjXt3uvY8DZWt89/fQ5IDaNVLmdkR5tLGwmW7KZBIKmuJ4zdtya4mHP",
        "X-Received": "by 10.194.192.167 with SMTP id\n\thh7mr71646388wjc.151.1426015897771; \n\tTue, 10 Mar 2015 12:31:37 -0700 (PDT)",
        "From": "Vlad Zolotarov <vladz@cloudius-systems.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue, 10 Mar 2015 21:31:30 +0200",
        "Message-Id": "<1426015891-20450-3-git-send-email-vladz@cloudius-systems.com>",
        "X-Mailer": "git-send-email 2.1.0",
        "In-Reply-To": "<1426015891-20450-1-git-send-email-vladz@cloudius-systems.com>",
        "References": "<1426015891-20450-1-git-send-email-vladz@cloudius-systems.com>",
        "Subject": "[dpdk-dev]  [PATCH v7 2/3] ixgbe: Code refactoring",
        "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": "- ixgbe_rx_alloc_bufs():\n       - Reset the rte_mbuf fields only when requested.\n       - Take the RDT update out of the function.\n       - Add the stub when RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC is not defined.\n    - ixgbe_recv_scattered_pkts():\n       - Take the code that updates the fields of the cluster's HEAD buffer into\n         the inline function.\n\nSigned-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>\n---\nNew in v3:\n   - ixgbe_rx_alloc_bufs(): Always reset refcnt of the buffers to 1.\n---\n lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 114 +++++++++++++++++++++++---------------\n 1 file changed, 69 insertions(+), 45 deletions(-)",
    "diff": "diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c\nindex e015981..58e619b 100644\n--- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c\n+++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c\n@@ -1022,7 +1022,7 @@ ixgbe_rx_scan_hw_ring(struct igb_rx_queue *rxq)\n }\n \n static inline int\n-ixgbe_rx_alloc_bufs(struct igb_rx_queue *rxq)\n+ixgbe_rx_alloc_bufs(struct igb_rx_queue *rxq, bool reset_mbuf)\n {\n \tvolatile union ixgbe_adv_rx_desc *rxdp;\n \tstruct igb_rx_entry *rxep;\n@@ -1043,11 +1043,14 @@ ixgbe_rx_alloc_bufs(struct igb_rx_queue *rxq)\n \tfor (i = 0; i < rxq->rx_free_thresh; ++i) {\n \t\t/* populate the static rte mbuf fields */\n \t\tmb = rxep[i].mbuf;\n+\t\tif (reset_mbuf) {\n+\t\t\tmb->next = NULL;\n+\t\t\tmb->nb_segs = 1;\n+\t\t\tmb->port = rxq->port_id;\n+\t\t}\n+\n \t\trte_mbuf_refcnt_set(mb, 1);\n-\t\tmb->next = NULL;\n \t\tmb->data_off = RTE_PKTMBUF_HEADROOM;\n-\t\tmb->nb_segs = 1;\n-\t\tmb->port = rxq->port_id;\n \n \t\t/* populate the descriptors */\n \t\tdma_addr = rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mb));\n@@ -1055,10 +1058,6 @@ ixgbe_rx_alloc_bufs(struct igb_rx_queue *rxq)\n \t\trxdp[i].read.pkt_addr = dma_addr;\n \t}\n \n-\t/* update tail pointer */\n-\trte_wmb();\n-\tIXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rxq->rx_free_trigger);\n-\n \t/* update state of internal queue structure */\n \trxq->rx_free_trigger = rxq->rx_free_trigger + rxq->rx_free_thresh;\n \tif (rxq->rx_free_trigger >= rxq->nb_rx_desc)\n@@ -1110,7 +1109,9 @@ rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \n \t/* if required, allocate new buffers to replenish descriptors */\n \tif (rxq->rx_tail > rxq->rx_free_trigger) {\n-\t\tif (ixgbe_rx_alloc_bufs(rxq) != 0) {\n+\t\tuint16_t cur_free_trigger = rxq->rx_free_trigger;\n+\n+\t\tif (ixgbe_rx_alloc_bufs(rxq, true) != 0) {\n \t\t\tint i, j;\n \t\t\tPMD_RX_LOG(DEBUG, \"RX mbuf alloc failed port_id=%u \"\n \t\t\t\t   \"queue_id=%u\", (unsigned) rxq->port_id,\n@@ -1130,6 +1131,10 @@ rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \n \t\t\treturn 0;\n \t\t}\n+\n+\t\t/* update tail pointer */\n+\t\trte_wmb();\n+\t\tIXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, cur_free_trigger);\n \t}\n \n \tif (rxq->rx_tail >= rxq->nb_rx_desc)\n@@ -1169,6 +1174,13 @@ ixgbe_recv_pkts_bulk_alloc(void *rx_queue, struct rte_mbuf **rx_pkts,\n \n \treturn nb_rx;\n }\n+#else\n+static inline int\n+ixgbe_rx_alloc_bufs(__rte_unused struct igb_rx_queue *rxq,\n+\t\t    __rte_unused bool reset_mbuf)\n+{\n+\treturn -ENOMEM;\n+}\n #endif /* RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC */\n \n uint16_t\n@@ -1353,6 +1365,51 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \treturn (nb_rx);\n }\n \n+/**\n+ * Initialize the first mbuf of the returned packet:\n+ *    - RX port identifier,\n+ *    - hardware offload data, if any:\n+ *      - RSS flag & hash,\n+ *      - IP checksum flag,\n+ *      - VLAN TCI, if any,\n+ *      - error flags.\n+ * @head HEAD of the packet cluster\n+ * @desc HW descriptor to get data from\n+ * @port_id Port ID of the Rx queue\n+ */\n+static inline void ixgbe_fill_cluster_head_buf(\n+\tstruct rte_mbuf *head,\n+\tunion ixgbe_adv_rx_desc *desc,\n+\tuint8_t port_id,\n+\tuint32_t staterr)\n+{\n+\tuint32_t hlen_type_rss;\n+\tuint64_t pkt_flags;\n+\n+\thead->port = port_id;\n+\n+\t/*\n+\t * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is\n+\t * set in the pkt_flags field.\n+\t */\n+\thead->vlan_tci = rte_le_to_cpu_16(desc->wb.upper.vlan);\n+\thlen_type_rss = rte_le_to_cpu_32(desc->wb.lower.lo_dword.data);\n+\tpkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);\n+\tpkt_flags |= rx_desc_status_to_pkt_flags(staterr);\n+\tpkt_flags |= rx_desc_error_to_pkt_flags(staterr);\n+\thead->ol_flags = pkt_flags;\n+\n+\tif (likely(pkt_flags & PKT_RX_RSS_HASH))\n+\t\thead->hash.rss = rte_le_to_cpu_32(desc->wb.lower.hi_dword.rss);\n+\telse if (pkt_flags & PKT_RX_FDIR) {\n+\t\thead->hash.fdir.hash =\n+\t\t\trte_le_to_cpu_16(desc->wb.lower.hi_dword.csum_ip.csum)\n+\t\t\t\t\t\t\t  & IXGBE_ATR_HASH_MASK;\n+\t\thead->hash.fdir.id =\n+\t\t\trte_le_to_cpu_16(desc->wb.lower.hi_dword.csum_ip.ip_id);\n+\t}\n+}\n+\n uint16_t\n ixgbe_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\t\t  uint16_t nb_pkts)\n@@ -1369,12 +1426,10 @@ ixgbe_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \tunion ixgbe_adv_rx_desc rxd;\n \tuint64_t dma; /* Physical address of mbuf data buffer */\n \tuint32_t staterr;\n-\tuint32_t hlen_type_rss;\n \tuint16_t rx_id;\n \tuint16_t nb_rx;\n \tuint16_t nb_hold;\n \tuint16_t data_len;\n-\tuint64_t pkt_flags;\n \n \tnb_rx = 0;\n \tnb_hold = 0;\n@@ -1532,40 +1587,9 @@ ixgbe_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\t\t\t\t(uint16_t) (data_len - ETHER_CRC_LEN);\n \t\t}\n \n-\t\t/*\n-\t\t * Initialize the first mbuf of the returned packet:\n-\t\t *    - RX port identifier,\n-\t\t *    - hardware offload data, if any:\n-\t\t *      - RSS flag & hash,\n-\t\t *      - IP checksum flag,\n-\t\t *      - VLAN TCI, if any,\n-\t\t *      - error flags.\n-\t\t */\n-\t\tfirst_seg->port = rxq->port_id;\n-\n-\t\t/*\n-\t\t * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is\n-\t\t * set in the pkt_flags field.\n-\t\t */\n-\t\tfirst_seg->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);\n-\t\thlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);\n-\t\tpkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);\n-\t\tpkt_flags = (pkt_flags |\n-\t\t\t\trx_desc_status_to_pkt_flags(staterr));\n-\t\tpkt_flags = (pkt_flags |\n-\t\t\t\trx_desc_error_to_pkt_flags(staterr));\n-\t\tfirst_seg->ol_flags = pkt_flags;\n-\n-\t\tif (likely(pkt_flags & PKT_RX_RSS_HASH))\n-\t\t\tfirst_seg->hash.rss =\n-\t\t\t\t    rte_le_to_cpu_32(rxd.wb.lower.hi_dword.rss);\n-\t\telse if (pkt_flags & PKT_RX_FDIR) {\n-\t\t\tfirst_seg->hash.fdir.hash =\n-\t\t\t    rte_le_to_cpu_16(rxd.wb.lower.hi_dword.csum_ip.csum)\n-\t\t\t\t\t   & IXGBE_ATR_HASH_MASK;\n-\t\t\tfirst_seg->hash.fdir.id =\n-\t\t\t  rte_le_to_cpu_16(rxd.wb.lower.hi_dword.csum_ip.ip_id);\n-\t\t}\n+\t\t/* Initialize the first mbuf of the returned packet */\n+\t\tixgbe_fill_cluster_head_buf(first_seg, &rxd, rxq->port_id,\n+\t\t\t\t\t    staterr);\n \n \t\t/* Prefetch data of first segment, if configured to do so. */\n \t\trte_packet_prefetch((char *)first_seg->buf_addr +\n",
    "prefixes": [
        "dpdk-dev",
        "v7",
        "2/3"
    ]
}