get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 572585,
    "url": "http://patchwork.ozlabs.org/api/patches/572585/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20160125051642.12004.46612.stgit@localhost.localdomain/",
    "project": {
        "id": 46,
        "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api",
        "name": "Intel Wired Ethernet development",
        "link_name": "intel-wired-lan",
        "list_id": "intel-wired-lan.osuosl.org",
        "list_email": "intel-wired-lan@osuosl.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20160125051642.12004.46612.stgit@localhost.localdomain>",
    "list_archive_url": null,
    "date": "2016-01-25T05:16:42",
    "name": "[next,v3,05/15] i40e/i40evf: Replace header pointers with unions of pointers in Tx checksum path",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "b60fdc3142e265e8e15d27d6850b268a36d8e610",
    "submitter": {
        "id": 67293,
        "url": "http://patchwork.ozlabs.org/api/people/67293/?format=api",
        "name": "Alexander Duyck",
        "email": "aduyck@mirantis.com"
    },
    "delegate": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/users/68/?format=api",
        "username": "jtkirshe",
        "first_name": "Jeff",
        "last_name": "Kirsher",
        "email": "jeffrey.t.kirsher@intel.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20160125051642.12004.46612.stgit@localhost.localdomain/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/572585/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/572585/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@lists.osuosl.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Received": [
            "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\tby ozlabs.org (Postfix) with ESMTP id 8E1E91402BF\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon, 25 Jan 2016 16:16:48 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 76DA98C401;\n\tMon, 25 Jan 2016 05:16:46 +0000 (UTC)",
            "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id Ovd5iiLHy2d6; Mon, 25 Jan 2016 05:16:45 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 1DACE8C363;\n\tMon, 25 Jan 2016 05:16:45 +0000 (UTC)",
            "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id 40C741C107C\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:16:45 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 2ACAC3180D\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:16:45 +0000 (UTC)",
            "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id zwwSRTp1LwF9 for <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:16:43 +0000 (UTC)",
            "from mail-pa0-f41.google.com (mail-pa0-f41.google.com\n\t[209.85.220.41])\n\tby silver.osuosl.org (Postfix) with ESMTPS id 975932E55F\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:16:43 +0000 (UTC)",
            "by mail-pa0-f41.google.com with SMTP id uo6so76341606pac.1\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tSun, 24 Jan 2016 21:16:43 -0800 (PST)",
            "from localhost.localdomain\n\t(static-50-53-29-36.bvtn.or.frontiernet.net. [50.53.29.36])\n\tby smtp.gmail.com with ESMTPSA id\n\tt70sm25055551pfi.8.2016.01.24.21.16.42\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tSun, 24 Jan 2016 21:16:42 -0800 (PST)"
        ],
        "Authentication-Results": "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=mirantis.com header.i=@mirantis.com\n\theader.b=cNWw/Tc7; dkim-atps=neutral",
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "from auto-whitelisted by SQLgrey-1.7.6",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=mirantis.com;\n\ts=google; \n\th=subject:from:to:cc:date:message-id:in-reply-to:references\n\t:user-agent:mime-version:content-type:content-transfer-encoding;\n\tbh=iwdSeCcZHuzsEaOM+krY20teKZldE13M1/yiU0iCjL4=;\n\tb=cNWw/Tc7xTD7V7kD1dQDmuDMpLrLaXn6kuOx5P3uCw0eN73ssdLHLdzVvP6CpqK9ll\n\t+iFPDfreXETbHN10Jl1I40QPUTREmag0Os1JWbzqavWxeGseTaFEKLxMmIUyRp7+HpYG\n\tLk/pnZ/Kv8HKNyK+l7/w02UKdYFZTh1+5AAUA=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to\n\t:references:user-agent:mime-version:content-type\n\t:content-transfer-encoding;\n\tbh=iwdSeCcZHuzsEaOM+krY20teKZldE13M1/yiU0iCjL4=;\n\tb=auzzlsE4c/gKo5WPOX5cgOdK+PEDrwF3XIK5xf8inGkRwq8/duo23ZKai23uL1cJVW\n\tJXFxj4fnKvJerwf0cwTN2NpwgukCn2q7asz7kgBtBRdLtlsDNU+k4ZkFA7AE2Rvb3vDt\n\tEYf30fnLUULe3A6i4UufN3nsIgPmv8nRi8ZDRYn6Ne6WgSzG4qmVGu9iaL2OnH/xdgCK\n\tGGzmx1laemfiM5uCOeYdXk7jp1qLzF6HgH6FFnmbbzJnJNc+lQ2zjyoy562mI+e+aAVW\n\taJUzaW/tw2yfazt3QgEoREQORkZ4yuMnJdfIUPNDuC8f9KdWE2qFp/kFXwCCSfV/BbI8\n\tHDpQ==",
        "X-Gm-Message-State": "AG10YOT/nHnR2EaLggUqg8QT3AJwzapBmueZfmJefgj/dE/QAk//60CHCS603apkHLU5/rtO",
        "X-Received": "by 10.66.142.201 with SMTP id ry9mr23445830pab.89.1453699003323; \n\tSun, 24 Jan 2016 21:16:43 -0800 (PST)",
        "From": "Alexander Duyck <aduyck@mirantis.com>",
        "To": "intel-wired-lan@lists.osuosl.org, jeffrey.t.kirsher@intel.com",
        "Date": "Sun, 24 Jan 2016 21:16:42 -0800",
        "Message-ID": "<20160125051642.12004.46612.stgit@localhost.localdomain>",
        "In-Reply-To": "<20160125050602.12004.38884.stgit@localhost.localdomain>",
        "References": "<20160125050602.12004.38884.stgit@localhost.localdomain>",
        "User-Agent": "StGit/0.17.1-dirty",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [next PATCH v3 05/15] i40e/i40evf: Replace header\n\tpointers with unions of pointers in Tx checksum path",
        "X-BeenThere": "intel-wired-lan@lists.osuosl.org",
        "X-Mailman-Version": "2.1.18-1",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.lists.osuosl.org>",
        "List-Unsubscribe": "<http://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@lists.osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@lists.osuosl.org?subject=help>",
        "List-Subscribe": "<http://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "intel-wired-lan-bounces@lists.osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@lists.osuosl.org>"
    },
    "content": "The Tx checksum path was maintaining a set of 3 pointers and two lengths in\norder to prepare the packet for being checksummed.  The thing is we only\nreally needed 2 pointers, and the lengths that were being maintained can\neasily be computed.\n\nAs such we can replace the IPv4 and IPv6 header pointers with one single\nunion that represents both, or a generic pointer to the start of the\nnetwork header.  For the L4 headers we can do the same with TCP and a\ngeneric pointer to the start of the transport header.  The length of the\nTCP header is obtained by simply multiplying doff by 4, and the network\nheader length can be obtained by subtracting the network header pointer\nfrom the transport header pointer.\n\nWhile I was at it I renamed l4_hdr to l4_proto to make it a bit more clear\nand less likely to be confused with l4.hdr which is the transport header\npointer.\n\nSigned-off-by: Alexander Duyck <aduyck@mirantis.com>\n---\n drivers/net/ethernet/intel/i40e/i40e_txrx.c   |   51 +++++++++++++------------\n drivers/net/ethernet/intel/i40evf/i40e_txrx.c |   52 +++++++++++++------------\n 2 files changed, 52 insertions(+), 51 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\nindex c84ba5d4634a..ef632fd60486 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n@@ -2392,12 +2392,21 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\tstruct i40e_ring *tx_ring,\n \t\t\t\tu32 *cd_tunneling)\n {\n-\tstruct ipv6hdr *this_ipv6_hdr;\n-\tunsigned int this_tcp_hdrlen;\n-\tstruct iphdr *this_ip_hdr;\n-\tu32 network_hdr_len;\n-\tu8 l4_hdr = 0;\n+\tunion {\n+\t\tstruct iphdr *v4;\n+\t\tstruct ipv6hdr *v6;\n+\t\tunsigned char *hdr;\n+\t} ip;\n+\tunion {\n+\t\tstruct tcphdr *tcp;\n+\t\tstruct udphdr *udp;\n+\t\tunsigned char *hdr;\n+\t} l4;\n \tu32 l4_tunnel = 0;\n+\tu8 l4_proto = 0;\n+\n+\tip.hdr = skb_network_header(skb);\n+\tl4.hdr = skb_transport_header(skb);\n \n \tif (skb->encapsulation) {\n \t\tswitch (ip_hdr(skb)->protocol) {\n@@ -2412,10 +2421,10 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\tdefault:\n \t\t\treturn;\n \t\t}\n-\t\tnetwork_hdr_len = skb_inner_network_header_len(skb);\n-\t\tthis_ip_hdr = inner_ip_hdr(skb);\n-\t\tthis_ipv6_hdr = inner_ipv6_hdr(skb);\n-\t\tthis_tcp_hdrlen = inner_tcp_hdrlen(skb);\n+\n+\t\t/* switch L4 header pointer from outer to inner */\n+\t\tip.hdr = skb_inner_network_header(skb);\n+\t\tl4.hdr = skb_inner_transport_header(skb);\n \n \t\tif (*tx_flags & I40E_TX_FLAGS_IPV4) {\n \t\t\tif (*tx_flags & I40E_TX_FLAGS_TSO) {\n@@ -2435,20 +2444,15 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\t   ((skb_inner_network_offset(skb) -\n \t\t\t\t\tskb_transport_offset(skb)) >> 1) <<\n \t\t\t\t   I40E_TXD_CTX_QW0_NATLEN_SHIFT;\n-\t\tif (this_ip_hdr->version == 6) {\n+\t\tif (ip.v6->version == 6) {\n \t\t\t*tx_flags &= ~I40E_TX_FLAGS_IPV4;\n \t\t\t*tx_flags |= I40E_TX_FLAGS_IPV6;\n \t\t}\n-\t} else {\n-\t\tnetwork_hdr_len = skb_network_header_len(skb);\n-\t\tthis_ip_hdr = ip_hdr(skb);\n-\t\tthis_ipv6_hdr = ipv6_hdr(skb);\n-\t\tthis_tcp_hdrlen = tcp_hdrlen(skb);\n \t}\n \n \t/* Enable IP checksum offloads */\n \tif (*tx_flags & I40E_TX_FLAGS_IPV4) {\n-\t\tl4_hdr = this_ip_hdr->protocol;\n+\t\tl4_proto = ip.v4->protocol;\n \t\t/* the stack computes the IP header already, the only time we\n \t\t * need the hardware to recompute it is in the case of TSO.\n \t\t */\n@@ -2457,26 +2461,23 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t} else {\n \t\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4;\n \t\t}\n-\t\t/* Now set the td_offset for IP header length */\n-\t\t*td_offset = (network_hdr_len >> 2) <<\n-\t\t\t      I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \t} else if (*tx_flags & I40E_TX_FLAGS_IPV6) {\n-\t\tl4_hdr = this_ipv6_hdr->nexthdr;\n+\t\tl4_proto = ip.v6->nexthdr;\n \t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV6;\n-\t\t/* Now set the td_offset for IP header length */\n-\t\t*td_offset = (network_hdr_len >> 2) <<\n-\t\t\t      I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \t}\n+\n+\t/* Now set the td_offset for IP header length */\n+\t*td_offset = ((l4.hdr - ip.hdr) / 4) << I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \t/* words in MACLEN + dwords in IPLEN + dwords in L4Len */\n \t*td_offset |= (skb_network_offset(skb) >> 1) <<\n \t\t       I40E_TX_DESC_LENGTH_MACLEN_SHIFT;\n \n \t/* Enable L4 checksum offloads */\n-\tswitch (l4_hdr) {\n+\tswitch (l4_proto) {\n \tcase IPPROTO_TCP:\n \t\t/* enable checksum offloads */\n \t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP;\n-\t\t*td_offset |= (this_tcp_hdrlen >> 2) <<\n+\t\t*td_offset |= l4.tcp->doff <<\n \t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tcase IPPROTO_SCTP:\ndiff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\nindex 1b2788093425..b1c8ada663aa 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n@@ -1609,12 +1609,21 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\tstruct i40e_ring *tx_ring,\n \t\t\t\tu32 *cd_tunneling)\n {\n-\tstruct ipv6hdr *this_ipv6_hdr;\n-\tunsigned int this_tcp_hdrlen;\n-\tstruct iphdr *this_ip_hdr;\n-\tu32 network_hdr_len;\n-\tu8 l4_hdr = 0;\n+\tunion {\n+\t\tstruct iphdr *v4;\n+\t\tstruct ipv6hdr *v6;\n+\t\tunsigned char *hdr;\n+\t} ip;\n+\tunion {\n+\t\tstruct tcphdr *tcp;\n+\t\tstruct udphdr *udp;\n+\t\tunsigned char *hdr;\n+\t} l4;\n \tu32 l4_tunnel = 0;\n+\tu8 l4_proto = 0;\n+\n+\tip.hdr = skb_network_header(skb);\n+\tl4.hdr = skb_transport_header(skb);\n \n \tif (skb->encapsulation) {\n \t\tswitch (ip_hdr(skb)->protocol) {\n@@ -1625,10 +1634,10 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\tdefault:\n \t\t\treturn;\n \t\t}\n-\t\tnetwork_hdr_len = skb_inner_network_header_len(skb);\n-\t\tthis_ip_hdr = inner_ip_hdr(skb);\n-\t\tthis_ipv6_hdr = inner_ipv6_hdr(skb);\n-\t\tthis_tcp_hdrlen = inner_tcp_hdrlen(skb);\n+\n+\t\t/* switch L4 header pointer from outer to inner */\n+\t\tip.hdr = skb_inner_network_header(skb);\n+\t\tl4.hdr = skb_inner_transport_header(skb);\n \n \t\tif (*tx_flags & I40E_TX_FLAGS_IPV4) {\n \t\t\tif (*tx_flags & I40E_TX_FLAGS_TSO) {\n@@ -1648,21 +1657,15 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\t   ((skb_inner_network_offset(skb) -\n \t\t\t\t\tskb_transport_offset(skb)) >> 1) <<\n \t\t\t\t   I40E_TXD_CTX_QW0_NATLEN_SHIFT;\n-\t\tif (this_ip_hdr->version == 6) {\n+\t\tif (ip.v6->version == 6) {\n \t\t\t*tx_flags &= ~I40E_TX_FLAGS_IPV4;\n \t\t\t*tx_flags |= I40E_TX_FLAGS_IPV6;\n \t\t}\n-\n-\t} else {\n-\t\tnetwork_hdr_len = skb_network_header_len(skb);\n-\t\tthis_ip_hdr = ip_hdr(skb);\n-\t\tthis_ipv6_hdr = ipv6_hdr(skb);\n-\t\tthis_tcp_hdrlen = tcp_hdrlen(skb);\n \t}\n \n \t/* Enable IP checksum offloads */\n \tif (*tx_flags & I40E_TX_FLAGS_IPV4) {\n-\t\tl4_hdr = this_ip_hdr->protocol;\n+\t\tl4_proto = ip.v4->protocol;\n \t\t/* the stack computes the IP header already, the only time we\n \t\t * need the hardware to recompute it is in the case of TSO.\n \t\t */\n@@ -1671,26 +1674,23 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t} else {\n \t\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4;\n \t\t}\n-\t\t/* Now set the td_offset for IP header length */\n-\t\t*td_offset = (network_hdr_len >> 2) <<\n-\t\t\t      I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \t} else if (*tx_flags & I40E_TX_FLAGS_IPV6) {\n-\t\tl4_hdr = this_ipv6_hdr->nexthdr;\n+\t\tl4_proto = ip.v6->nexthdr;\n \t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV6;\n-\t\t/* Now set the td_offset for IP header length */\n-\t\t*td_offset = (network_hdr_len >> 2) <<\n-\t\t\t      I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \t}\n+\n+\t/* Now set the td_offset for IP header length */\n+\t*td_offset = ((l4.hdr - ip.hdr) / 4) << I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \t/* words in MACLEN + dwords in IPLEN + dwords in L4Len */\n \t*td_offset |= (skb_network_offset(skb) >> 1) <<\n \t\t       I40E_TX_DESC_LENGTH_MACLEN_SHIFT;\n \n \t/* Enable L4 checksum offloads */\n-\tswitch (l4_hdr) {\n+\tswitch (l4_proto) {\n \tcase IPPROTO_TCP:\n \t\t/* enable checksum offloads */\n \t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP;\n-\t\t*td_offset |= (this_tcp_hdrlen >> 2) <<\n+\t\t*td_offset |= l4.tcp->doff <<\n \t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tcase IPPROTO_SCTP:\n",
    "prefixes": [
        "next",
        "v3",
        "05/15"
    ]
}