get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 6251,
    "url": "https://patches.dpdk.org/api/patches/6251/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1436459501-14173-5-git-send-email-helin.zhang@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": "<1436459501-14173-5-git-send-email-helin.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1436459501-14173-5-git-send-email-helin.zhang@intel.com",
    "date": "2015-07-09T16:31:26",
    "name": "[dpdk-dev,v10,04/19] ixgbe: replace bit mask based packet type with unified packet type",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "c179092f02a35ecc680dc04a461269898642cb06",
    "submitter": {
        "id": 14,
        "url": "https://patches.dpdk.org/api/people/14/?format=api",
        "name": "Zhang, Helin",
        "email": "helin.zhang@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1436459501-14173-5-git-send-email-helin.zhang@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/6251/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/6251/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 7C28FC362;\n\tThu,  9 Jul 2015 18:32:11 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 945BCC322\n\tfor <dev@dpdk.org>; Thu,  9 Jul 2015 18:32:04 +0200 (CEST)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby orsmga102.jf.intel.com with ESMTP; 09 Jul 2015 09:32:04 -0700",
            "from shvmail01.sh.intel.com ([10.239.29.42])\n\tby fmsmga001.fm.intel.com with ESMTP; 09 Jul 2015 09:32:00 -0700",
            "from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com\n\t[10.239.29.89])\n\tby shvmail01.sh.intel.com with ESMTP id t69GVvhI005439;\n\tFri, 10 Jul 2015 00:31:57 +0800",
            "from shecgisg004.sh.intel.com (localhost [127.0.0.1])\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP\n\tid t69GVroE014236; Fri, 10 Jul 2015 00:31:55 +0800",
            "(from hzhan75@localhost)\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t69GVrD7014232; \n\tFri, 10 Jul 2015 00:31:53 +0800"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.15,441,1432623600\"; d=\"scan'208\";a=\"743789670\"",
        "From": "Helin Zhang <helin.zhang@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Fri, 10 Jul 2015 00:31:26 +0800",
        "Message-Id": "<1436459501-14173-5-git-send-email-helin.zhang@intel.com>",
        "X-Mailer": "git-send-email 1.7.4.1",
        "In-Reply-To": "<1436459501-14173-1-git-send-email-helin.zhang@intel.com>",
        "References": "<1435912347-19499-1-git-send-email-helin.zhang@intel.com>\n\t<1436459501-14173-1-git-send-email-helin.zhang@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v10 04/19] ixgbe: replace bit mask based packet\n\ttype with unified packet type",
        "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": "To unify packet type among all PMDs, bit masks of packet type for\n'ol_flags' are replaced by unified packet type.\nTo avoid breaking ABI compatibility, all the changes would be\nenabled by RTE_NEXT_ABI, which is disabled by default.\nNote that around 2.5% performance drop (64B) was observed of doing\n4 ports (1 port per 82599 card) IO forwarding on the same SNB core.\n\nSigned-off-by: Helin Zhang <helin.zhang@intel.com>\n---\n drivers/net/ixgbe/ixgbe_rxtx.c | 163 +++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 163 insertions(+)\n\nv2 changes:\n* Used redefined packet types and enlarged packet_type field in mbuf.\n\nv5 changes:\n* Re-worded the commit logs.\n\nv6 changes:\n* Disabled the code changes for unified packet type by default, to\n  avoid breaking ABI compatibility.\n\nv7 changes:\n* Renamed RTE_UNIFIED_PKT_TYPE to RTE_NEXT_ABI.\n\nv9 changes:\n* Renamed MAC to ETHER in packet type names.",
    "diff": "diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c\nindex b1db57f..9e99e80 100644\n--- a/drivers/net/ixgbe/ixgbe_rxtx.c\n+++ b/drivers/net/ixgbe/ixgbe_rxtx.c\n@@ -859,6 +859,110 @@ end_of_tx:\n  *  RX functions\n  *\n  **********************************************************************/\n+#ifdef RTE_NEXT_ABI\n+#define IXGBE_PACKET_TYPE_IPV4              0X01\n+#define IXGBE_PACKET_TYPE_IPV4_TCP          0X11\n+#define IXGBE_PACKET_TYPE_IPV4_UDP          0X21\n+#define IXGBE_PACKET_TYPE_IPV4_SCTP         0X41\n+#define IXGBE_PACKET_TYPE_IPV4_EXT          0X03\n+#define IXGBE_PACKET_TYPE_IPV4_EXT_SCTP     0X43\n+#define IXGBE_PACKET_TYPE_IPV6              0X04\n+#define IXGBE_PACKET_TYPE_IPV6_TCP          0X14\n+#define IXGBE_PACKET_TYPE_IPV6_UDP          0X24\n+#define IXGBE_PACKET_TYPE_IPV6_EXT          0X0C\n+#define IXGBE_PACKET_TYPE_IPV6_EXT_TCP      0X1C\n+#define IXGBE_PACKET_TYPE_IPV6_EXT_UDP      0X2C\n+#define IXGBE_PACKET_TYPE_IPV4_IPV6         0X05\n+#define IXGBE_PACKET_TYPE_IPV4_IPV6_TCP     0X15\n+#define IXGBE_PACKET_TYPE_IPV4_IPV6_UDP     0X25\n+#define IXGBE_PACKET_TYPE_IPV4_IPV6_EXT     0X0D\n+#define IXGBE_PACKET_TYPE_IPV4_IPV6_EXT_TCP 0X1D\n+#define IXGBE_PACKET_TYPE_IPV4_IPV6_EXT_UDP 0X2D\n+#define IXGBE_PACKET_TYPE_MAX               0X80\n+#define IXGBE_PACKET_TYPE_MASK              0X7F\n+#define IXGBE_PACKET_TYPE_SHIFT             0X04\n+static inline uint32_t\n+ixgbe_rxd_pkt_info_to_pkt_type(uint16_t pkt_info)\n+{\n+\tstatic const uint32_t\n+\t\tptype_table[IXGBE_PACKET_TYPE_MAX] __rte_cache_aligned = {\n+\t\t[IXGBE_PACKET_TYPE_IPV4] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_EXT] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4_EXT,\n+\t\t[IXGBE_PACKET_TYPE_IPV6] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV6,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_IPV6] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_IP |\n+\t\t\tRTE_PTYPE_INNER_L3_IPV6,\n+\t\t[IXGBE_PACKET_TYPE_IPV6_EXT] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV6_EXT,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_IPV6_EXT] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_IP |\n+\t\t\tRTE_PTYPE_INNER_L3_IPV6_EXT,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_TCP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP,\n+\t\t[IXGBE_PACKET_TYPE_IPV6_TCP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_IPV6_TCP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_IP |\n+\t\t\tRTE_PTYPE_INNER_L3_IPV6 | RTE_PTYPE_INNER_L4_TCP,\n+\t\t[IXGBE_PACKET_TYPE_IPV6_EXT_TCP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_TCP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_IPV6_EXT_TCP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_IP |\n+\t\t\tRTE_PTYPE_INNER_L3_IPV6_EXT | RTE_PTYPE_INNER_L4_TCP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_UDP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP,\n+\t\t[IXGBE_PACKET_TYPE_IPV6_UDP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_IPV6_UDP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_IP |\n+\t\t\tRTE_PTYPE_INNER_L3_IPV6 | RTE_PTYPE_INNER_L4_UDP,\n+\t\t[IXGBE_PACKET_TYPE_IPV6_EXT_UDP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_UDP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_IPV6_EXT_UDP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_IP |\n+\t\t\tRTE_PTYPE_INNER_L3_IPV6_EXT | RTE_PTYPE_INNER_L4_UDP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_SCTP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_SCTP,\n+\t\t[IXGBE_PACKET_TYPE_IPV4_EXT_SCTP] = RTE_PTYPE_L2_ETHER |\n+\t\t\tRTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_SCTP,\n+\t};\n+\tif (unlikely(pkt_info & IXGBE_RXDADV_PKTTYPE_ETQF))\n+\t\treturn RTE_PTYPE_UNKNOWN;\n+\n+\tpkt_info = (pkt_info >> IXGBE_PACKET_TYPE_SHIFT) &\n+\t\t\t\tIXGBE_PACKET_TYPE_MASK;\n+\n+\treturn ptype_table[pkt_info];\n+}\n+\n+static inline uint64_t\n+ixgbe_rxd_pkt_info_to_pkt_flags(uint16_t pkt_info)\n+{\n+\tstatic uint64_t ip_rss_types_map[16] __rte_cache_aligned = {\n+\t\t0, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,\n+\t\t0, PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH,\n+\t\tPKT_RX_RSS_HASH, 0, 0, 0,\n+\t\t0, 0, 0,  PKT_RX_FDIR,\n+\t};\n+#ifdef RTE_LIBRTE_IEEE1588\n+\tstatic uint64_t ip_pkt_etqf_map[8] = {\n+\t\t0, 0, 0, PKT_RX_IEEE1588_PTP,\n+\t\t0, 0, 0, 0,\n+\t};\n+\n+\tif (likely(pkt_info & IXGBE_RXDADV_PKTTYPE_ETQF))\n+\t\treturn ip_pkt_etqf_map[(pkt_info >> 4) & 0X07] |\n+\t\t\t\tip_rss_types_map[pkt_info & 0XF];\n+\telse\n+\t\treturn ip_rss_types_map[pkt_info & 0XF];\n+#else\n+\treturn ip_rss_types_map[pkt_info & 0XF];\n+#endif\n+}\n+#else /* RTE_NEXT_ABI */\n static inline uint64_t\n rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)\n {\n@@ -894,6 +998,7 @@ rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)\n #endif\n \treturn pkt_flags | ip_rss_types_map[hl_tp_rs & 0xF];\n }\n+#endif /* RTE_NEXT_ABI */\n \n static inline uint64_t\n rx_desc_status_to_pkt_flags(uint32_t rx_status)\n@@ -949,7 +1054,13 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)\n \tstruct rte_mbuf *mb;\n \tuint16_t pkt_len;\n \tuint64_t pkt_flags;\n+#ifdef RTE_NEXT_ABI\n+\tint nb_dd;\n+\tuint32_t s[LOOK_AHEAD];\n+\tuint16_t pkt_info[LOOK_AHEAD];\n+#else\n \tint s[LOOK_AHEAD], nb_dd;\n+#endif /* RTE_NEXT_ABI */\n \tint i, j, nb_rx = 0;\n \n \n@@ -972,6 +1083,12 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)\n \t\tfor (j = LOOK_AHEAD-1; j >= 0; --j)\n \t\t\ts[j] = rxdp[j].wb.upper.status_error;\n \n+#ifdef RTE_NEXT_ABI\n+\t\tfor (j = LOOK_AHEAD-1; j >= 0; --j)\n+\t\t\tpkt_info[j] = rxdp[j].wb.lower.lo_dword.\n+\t\t\t\t\t\ths_rss.pkt_info;\n+#endif /* RTE_NEXT_ABI */\n+\n \t\t/* Compute how many status bits were set */\n \t\tnb_dd = 0;\n \t\tfor (j = 0; j < LOOK_AHEAD; ++j)\n@@ -988,12 +1105,22 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)\n \t\t\tmb->vlan_tci = rte_le_to_cpu_16(rxdp[j].wb.upper.vlan);\n \n \t\t\t/* convert descriptor fields to rte mbuf flags */\n+#ifdef RTE_NEXT_ABI\n+\t\t\tpkt_flags = rx_desc_status_to_pkt_flags(s[j]);\n+\t\t\tpkt_flags |= rx_desc_error_to_pkt_flags(s[j]);\n+\t\t\tpkt_flags |=\n+\t\t\t\tixgbe_rxd_pkt_info_to_pkt_flags(pkt_info[j]);\n+\t\t\tmb->ol_flags = pkt_flags;\n+\t\t\tmb->packet_type =\n+\t\t\t\tixgbe_rxd_pkt_info_to_pkt_type(pkt_info[j]);\n+#else /* RTE_NEXT_ABI */\n \t\t\tpkt_flags  = rx_desc_hlen_type_rss_to_pkt_flags(\n \t\t\t\t\trxdp[j].wb.lower.lo_dword.data);\n \t\t\t/* reuse status field from scan list */\n \t\t\tpkt_flags |= rx_desc_status_to_pkt_flags(s[j]);\n \t\t\tpkt_flags |= rx_desc_error_to_pkt_flags(s[j]);\n \t\t\tmb->ol_flags = pkt_flags;\n+#endif /* RTE_NEXT_ABI */\n \n \t\t\tif (likely(pkt_flags & PKT_RX_RSS_HASH))\n \t\t\t\tmb->hash.rss = rxdp[j].wb.lower.hi_dword.rss;\n@@ -1210,7 +1337,11 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \tunion ixgbe_adv_rx_desc rxd;\n \tuint64_t dma_addr;\n \tuint32_t staterr;\n+#ifdef RTE_NEXT_ABI\n+\tuint32_t pkt_info;\n+#else\n \tuint32_t hlen_type_rss;\n+#endif\n \tuint16_t pkt_len;\n \tuint16_t rx_id;\n \tuint16_t nb_rx;\n@@ -1328,6 +1459,19 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\trxm->data_len = pkt_len;\n \t\trxm->port = rxq->port_id;\n \n+#ifdef RTE_NEXT_ABI\n+\t\tpkt_info = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.hs_rss.\n+\t\t\t\t\t\t\t\tpkt_info);\n+\t\t/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */\n+\t\trxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);\n+\n+\t\tpkt_flags = rx_desc_status_to_pkt_flags(staterr);\n+\t\tpkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);\n+\t\tpkt_flags = pkt_flags |\n+\t\t\tixgbe_rxd_pkt_info_to_pkt_flags(pkt_info);\n+\t\trxm->ol_flags = pkt_flags;\n+\t\trxm->packet_type = ixgbe_rxd_pkt_info_to_pkt_type(pkt_info);\n+#else /* RTE_NEXT_ABI */\n \t\thlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);\n \t\t/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */\n \t\trxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);\n@@ -1336,6 +1480,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\tpkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);\n \t\tpkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);\n \t\trxm->ol_flags = pkt_flags;\n+#endif /* RTE_NEXT_ABI */\n \n \t\tif (likely(pkt_flags & PKT_RX_RSS_HASH))\n \t\t\trxm->hash.rss = rxd.wb.lower.hi_dword.rss;\n@@ -1409,6 +1554,23 @@ ixgbe_fill_cluster_head_buf(\n \tuint8_t port_id,\n \tuint32_t staterr)\n {\n+#ifdef RTE_NEXT_ABI\n+\tuint16_t pkt_info;\n+\tuint64_t pkt_flags;\n+\n+\thead->port = port_id;\n+\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+\tpkt_info = rte_le_to_cpu_32(desc->wb.lower.lo_dword.hs_rss.pkt_info);\n+\tpkt_flags = rx_desc_status_to_pkt_flags(staterr);\n+\tpkt_flags |= rx_desc_error_to_pkt_flags(staterr);\n+\tpkt_flags |= ixgbe_rxd_pkt_info_to_pkt_flags(pkt_info);\n+\thead->ol_flags = pkt_flags;\n+\thead->packet_type = ixgbe_rxd_pkt_info_to_pkt_type(pkt_info);\n+#else /* RTE_NEXT_ABI */\n \tuint32_t hlen_type_rss;\n \tuint64_t pkt_flags;\n \n@@ -1424,6 +1586,7 @@ ixgbe_fill_cluster_head_buf(\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+#endif /* RTE_NEXT_ABI */\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",
    "prefixes": [
        "dpdk-dev",
        "v10",
        "04/19"
    ]
}