get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 847160,
    "url": "http://patchwork.ozlabs.org/api/patches/847160/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20171211183709.21524.19432.stgit@localhost6.localdomain6/",
    "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": "<20171211183709.21524.19432.stgit@localhost6.localdomain6>",
    "list_archive_url": null,
    "date": "2017-12-11T18:37:10",
    "name": "[5/9] ixgbevf: update code to better handle incrementing page count",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "512ab8b834a0ef9727b4301e190f60f77668616c",
    "submitter": {
        "id": 1670,
        "url": "http://patchwork.ozlabs.org/api/people/1670/?format=api",
        "name": "Tantilov, Emil S",
        "email": "emil.s.tantilov@intel.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/20171211183709.21524.19432.stgit@localhost6.localdomain6/mbox/",
    "series": [
        {
            "id": 17925,
            "url": "http://patchwork.ozlabs.org/api/series/17925/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=17925",
            "date": "2017-12-11T18:36:44",
            "name": "ixgbevf: update Rx/Tx code path for build_skb",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/17925/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/847160/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/847160/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@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"
        ],
        "Authentication-Results": "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=osuosl.org\n\t(client-ip=140.211.166.133; helo=hemlock.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3ywWmH5Tm7z9s0g\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 12 Dec 2017 05:33:03 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 0CB7E881F0;\n\tMon, 11 Dec 2017 18:33:02 +0000 (UTC)",
            "from hemlock.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id f8oSdabOqofE; Mon, 11 Dec 2017 18:33:01 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 5C572881C8;\n\tMon, 11 Dec 2017 18:33:01 +0000 (UTC)",
            "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\tby ash.osuosl.org (Postfix) with ESMTP id E81021BFA4B\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 11 Dec 2017 18:32:59 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id E4CBB87290\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 11 Dec 2017 18:32:59 +0000 (UTC)",
            "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id ZzPlB1R9ABmn for <intel-wired-lan@lists.osuosl.org>;\n\tMon, 11 Dec 2017 18:32:59 +0000 (UTC)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby fraxinus.osuosl.org (Postfix) with ESMTPS id 609D687277\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 11 Dec 2017 18:32:59 +0000 (UTC)",
            "from orsmga006.jf.intel.com ([10.7.209.51])\n\tby orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t11 Dec 2017 10:32:59 -0800",
            "from estantil-desk3.jf.intel.com (HELO localhost6.localdomain6)\n\t([134.134.177.96])\n\tby orsmga006.jf.intel.com with ESMTP; 11 Dec 2017 10:32:59 -0800"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.45,392,1508828400\"; d=\"scan'208\";a=\"1971089\"",
        "From": "Emil Tantilov <emil.s.tantilov@intel.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Mon, 11 Dec 2017 10:37:10 -0800",
        "Message-ID": "<20171211183709.21524.19432.stgit@localhost6.localdomain6>",
        "In-Reply-To": "<20171211183537.21524.10133.stgit@localhost6.localdomain6>",
        "References": "<20171211183537.21524.10133.stgit@localhost6.localdomain6>",
        "User-Agent": "StGit/0.17.1-17-ge4e0",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [PATCH 5/9] ixgbevf: update code to better handle\n\tincrementing page count",
        "X-BeenThere": "intel-wired-lan@osuosl.org",
        "X-Mailman-Version": "2.1.24",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.osuosl.org>",
        "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>",
        "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "intel-wired-lan-bounces@osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>"
    },
    "content": "Based on commit bd4171a5d4c2\n(\"igb: update code to better handle incrementing page count\")\n\nUpdate the driver code so that we do bulk updates of the page reference\ncount instead of just incrementing it by one reference at a time.  The\nadvantage to doing this is that we cut down on atomic operations and\nthis in turn should give us a slight improvement in cycles per packet.\nIn addition if we eventually move this over to using build_skb the gains\nwill be more noticeable.\n\nSigned-off-by: Emil Tantilov <emil.s.tantilov@intel.com>\n---\n drivers/net/ethernet/intel/ixgbevf/ixgbevf.h      |    7 ++++-\n drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c |   30 +++++++++++++++------\n 2 files changed, 28 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h\nindex b1da9f4..c70a789 100644\n--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h\n+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h\n@@ -62,7 +62,12 @@ struct ixgbevf_tx_buffer {\n struct ixgbevf_rx_buffer {\n \tdma_addr_t dma;\n \tstruct page *page;\n-\tunsigned int page_offset;\n+#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)\n+\t__u32 page_offset;\n+#else\n+\t__u16 page_offset;\n+#endif\n+\t__u16 pagecnt_bias;\n };\n \n struct ixgbevf_stats {\ndiff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c\nindex fbd493e..ae2402d 100644\n--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c\n+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c\n@@ -611,6 +611,7 @@ static bool ixgbevf_alloc_mapped_page(struct ixgbevf_ring *rx_ring,\n \tbi->dma = dma;\n \tbi->page = page;\n \tbi->page_offset = 0;\n+\tbi->pagecnt_bias = 1;\n \n \treturn true;\n }\n@@ -747,6 +748,7 @@ static void ixgbevf_reuse_rx_page(struct ixgbevf_ring *rx_ring,\n \tnew_buff->page = old_buff->page;\n \tnew_buff->dma = old_buff->dma;\n \tnew_buff->page_offset = old_buff->page_offset;\n+\tnew_buff->pagecnt_bias = old_buff->pagecnt_bias;\n }\n \n static inline bool ixgbevf_page_is_reserved(struct page *page)\n@@ -758,13 +760,15 @@ static bool ixgbevf_can_reuse_rx_page(struct ixgbevf_rx_buffer *rx_buffer,\n \t\t\t\t      struct page *page,\n \t\t\t\t      const unsigned int truesize)\n {\n+\tunsigned int pagecnt_bias = rx_buffer->pagecnt_bias--;\n+\n \t/* avoid re-using remote pages */\n \tif (unlikely(ixgbevf_page_is_reserved(page)))\n \t\treturn false;\n \n #if (PAGE_SIZE < 8192)\n \t/* if we are only owner of page we can reuse it */\n-\tif (unlikely(page_count(page) != 1))\n+\tif (unlikely(page_ref_count(page) != pagecnt_bias))\n \t\treturn false;\n \n \t/* flip page offset to other buffer */\n@@ -778,10 +782,15 @@ static bool ixgbevf_can_reuse_rx_page(struct ixgbevf_rx_buffer *rx_buffer,\n \t\treturn false;\n \n #endif\n-\t/* Even if we own the page, we are not allowed to use atomic_set()\n-\t * This would break get_page_unless_zero() users.\n+\n+\t/* If we have drained the page fragment pool we need to update\n+\t * the pagecnt_bias and page count so that we fully restock the\n+\t * number of references the driver holds.\n \t */\n-\tpage_ref_inc(page);\n+\tif (unlikely(pagecnt_bias == 1)) {\n+\t\tpage_ref_add(page, USHRT_MAX);\n+\t\trx_buffer->pagecnt_bias = USHRT_MAX;\n+\t}\n \n \treturn true;\n }\n@@ -827,7 +836,6 @@ static bool ixgbevf_add_rx_frag(struct ixgbevf_ring *rx_ring,\n \t\t\treturn true;\n \n \t\t/* this page cannot be reused so discard it */\n-\t\tput_page(page);\n \t\treturn false;\n \t}\n \n@@ -899,10 +907,13 @@ static struct sk_buff *ixgbevf_fetch_rx_buffer(struct ixgbevf_ring *rx_ring,\n \t\t/* hand second half of page back to the ring */\n \t\tixgbevf_reuse_rx_page(rx_ring, rx_buffer);\n \t} else {\n-\t\t/* we are not reusing the buffer so unmap it */\n+\t\t/* We are not reusing the buffer so unmap it and free\n+\t\t * any references we are holding to it\n+\t\t */\n \t\tdma_unmap_page_attrs(rx_ring->dev, rx_buffer->dma,\n \t\t\t\t     PAGE_SIZE, DMA_FROM_DEVICE,\n \t\t\t\t     IXGBEVF_RX_DMA_ATTR);\n+\t\t__page_frag_cache_drain(page, rx_buffer->pagecnt_bias);\n \t}\n \n \t/* clear contents of buffer_info */\n@@ -2135,6 +2146,8 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)\n \t\tstruct ixgbevf_rx_buffer *rx_buffer;\n \n \t\trx_buffer = &rx_ring->rx_buffer_info[i];\n+\t\tif (!rx_buffer->page)\n+\t\t\tcontinue;\n \n \t\t/* Invalidate cache lines that may have been written to by\n \t\t * device so that we avoid corrupting memory.\n@@ -2152,8 +2165,9 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)\n \t\t\t\t     DMA_FROM_DEVICE,\n \t\t\t\t     IXGBEVF_RX_DMA_ATTR);\n \n-\t\tif (rx_buffer->page)\n-\t\t\t__free_page(rx_buffer->page);\n+\t\t__page_frag_cache_drain(rx_buffer->page,\n+\t\t\t\t\trx_buffer->pagecnt_bias);\n+\n \t\trx_buffer->page = NULL;\n \t}\n \n",
    "prefixes": [
        "5/9"
    ]
}