get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1041525,
    "url": "http://patchwork.ozlabs.org/api/patches/1041525/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20190213185115.25877-5-anirudh.venkataramanan@intel.com/",
    "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": "<20190213185115.25877-5-anirudh.venkataramanan@intel.com>",
    "list_archive_url": null,
    "date": "2019-02-13T18:51:04",
    "name": "[S14,04/15] ice: Introduce bulk update for page count",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "fcccc6531488d54604b7962e2679a854d5aad8f0",
    "submitter": {
        "id": 73601,
        "url": "http://patchwork.ozlabs.org/api/people/73601/?format=api",
        "name": "Anirudh Venkataramanan",
        "email": "anirudh.venkataramanan@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/20190213185115.25877-5-anirudh.venkataramanan@intel.com/mbox/",
    "series": [
        {
            "id": 91786,
            "url": "http://patchwork.ozlabs.org/api/series/91786/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=91786",
            "date": "2019-02-13T18:51:02",
            "name": "Implementation updates for ice",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/91786/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1041525/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1041525/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>)",
            "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=intel.com"
        ],
        "Received": [
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 4407vy02jKz9s1l\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 14 Feb 2019 05:53:33 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 443E2869FE;\n\tWed, 13 Feb 2019 18:53:32 +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 SfSHogZOLel1; Wed, 13 Feb 2019 18:53:24 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id E0B50815BC;\n\tWed, 13 Feb 2019 18:53:23 +0000 (UTC)",
            "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id 802A71BF989\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 13 Feb 2019 18:51:19 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 793CC22CB0\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 13 Feb 2019 18:51:19 +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 9dkl+n6rgJX0 for <intel-wired-lan@lists.osuosl.org>;\n\tWed, 13 Feb 2019 18:51:17 +0000 (UTC)",
            "from mga17.intel.com (mga17.intel.com [192.55.52.151])\n\tby silver.osuosl.org (Postfix) with ESMTPS id 6B7F022C31\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 13 Feb 2019 18:51:17 +0000 (UTC)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n\tby fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t13 Feb 2019 10:51:16 -0800",
            "from shasta.jf.intel.com ([10.166.241.11])\n\tby orsmga001.jf.intel.com with ESMTP; 13 Feb 2019 10:51:16 -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.58,366,1544515200\"; d=\"scan'208\";a=\"138354236\"",
        "From": "Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Wed, 13 Feb 2019 10:51:04 -0800",
        "Message-Id": "<20190213185115.25877-5-anirudh.venkataramanan@intel.com>",
        "X-Mailer": "git-send-email 2.14.5",
        "In-Reply-To": "<20190213185115.25877-1-anirudh.venkataramanan@intel.com>",
        "References": "<20190213185115.25877-1-anirudh.venkataramanan@intel.com>",
        "Subject": "[Intel-wired-lan] [PATCH S14 04/15] ice: Introduce bulk update for\n\tpage count",
        "X-BeenThere": "intel-wired-lan@osuosl.org",
        "X-Mailman-Version": "2.1.29",
        "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>",
        "MIME-Version": "1.0",
        "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": "From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>\n\n{get,put}_page are atomic operations which we use for page count\nhandling. The current logic for refcount handling is that we increment\nit when passing a skb with the data from the first half of page up to\nnetstack and recycle the second half of page. This operation protects us\nfrom losing a page since the network stack can decrement the refcount of\npage from skb.\n\nThe performance can be gently improved by doing the bulk updates of\nrefcount instead of doing it one by one. During the buffer initialization,\nmaximize the page's refcount and don't allow the refcount to become\nless than two.\n\nSigned-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>\nSigned-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>\n---\n[Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> cleaned up commit message]\n---\n drivers/net/ethernet/intel/ice/ice_txrx.c | 26 +++++++++++++++++++-------\n drivers/net/ethernet/intel/ice/ice_txrx.h |  1 +\n 2 files changed, 20 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c\nindex 03dddbd8c108..1c49d245d889 100644\n--- a/drivers/net/ethernet/intel/ice/ice_txrx.c\n+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c\n@@ -283,7 +283,7 @@ void ice_clean_rx_ring(struct ice_ring *rx_ring)\n \t\t\tcontinue;\n \n \t\tdma_unmap_page(dev, rx_buf->dma, PAGE_SIZE, DMA_FROM_DEVICE);\n-\t\t__free_pages(rx_buf->page, 0);\n+\t\t__page_frag_cache_drain(rx_buf->page, rx_buf->pagecnt_bias);\n \n \t\trx_buf->page = NULL;\n \t\trx_buf->page_offset = 0;\n@@ -423,6 +423,8 @@ ice_alloc_mapped_page(struct ice_ring *rx_ring, struct ice_rx_buf *bi)\n \tbi->dma = dma;\n \tbi->page = page;\n \tbi->page_offset = 0;\n+\tpage_ref_add(page, USHRT_MAX - 1);\n+\tbi->pagecnt_bias = USHRT_MAX;\n \n \treturn true;\n }\n@@ -509,6 +511,7 @@ static bool ice_page_is_reserved(struct page *page)\n static bool ice_can_reuse_rx_page(struct ice_rx_buf *rx_buf,\n \t\t\t\t  unsigned int truesize)\n {\n+\tunsigned int pagecnt_bias = rx_buf->pagecnt_bias;\n \tstruct page *page = rx_buf->page;\n \n \t/* avoid re-using remote pages */\n@@ -517,7 +520,7 @@ static bool ice_can_reuse_rx_page(struct ice_rx_buf *rx_buf,\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_count(page) - pagecnt_bias) > 1))\n \t\treturn false;\n \n \t/* flip page offset to other buffer */\n@@ -530,10 +533,14 @@ static bool ice_can_reuse_rx_page(struct ice_rx_buf *rx_buf,\n \t\treturn false;\n #endif /* PAGE_SIZE < 8192) */\n \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+\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-\tget_page(page);\n+\tif (unlikely(pagecnt_bias == 1)) {\n+\t\tpage_ref_add(page, USHRT_MAX - 1);\n+\t\trx_buf->pagecnt_bias = USHRT_MAX;\n+\t}\n \n \treturn true;\n }\n@@ -576,11 +583,12 @@ ice_add_rx_frag(struct ice_rx_buf *rx_buf, struct sk_buff *skb,\n \t\tmemcpy(__skb_put(skb, size), va, ALIGN(size, sizeof(long)));\n \n \t\t/* page is not reserved, we can reuse buffer as-is */\n-\t\tif (likely(!ice_page_is_reserved(page)))\n+\t\tif (likely(!ice_page_is_reserved(page))) {\n+\t\t\trx_buf->pagecnt_bias++;\n \t\t\treturn true;\n+\t\t}\n \n \t\t/* this page cannot be reused so discard it */\n-\t\t__free_pages(page, 0);\n \t\treturn false;\n \t}\n \n@@ -650,6 +658,9 @@ ice_get_rx_buf(struct ice_ring *rx_ring, const unsigned int size)\n \t\t\t\t      rx_buf->page_offset, size,\n \t\t\t\t      DMA_FROM_DEVICE);\n \n+\t/* We have pulled a buffer for use, so decrement pagecnt_bias */\n+\trx_buf->pagecnt_bias--;\n+\n \treturn rx_buf;\n }\n \n@@ -703,6 +714,7 @@ ice_fetch_rx_buf(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf,\n \t\t/* we are not reusing the buffer so unmap it */\n \t\tdma_unmap_page(rx_ring->dev, rx_buf->dma, PAGE_SIZE,\n \t\t\t       DMA_FROM_DEVICE);\n+\t\t__page_frag_cache_drain(rx_buf->page, rx_buf->pagecnt_bias);\n \t}\n \n \t/* clear contents of buffer_info */\ndiff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h\nindex b7ff0ff82517..43b39e7ce470 100644\n--- a/drivers/net/ethernet/intel/ice/ice_txrx.h\n+++ b/drivers/net/ethernet/intel/ice/ice_txrx.h\n@@ -73,6 +73,7 @@ struct ice_rx_buf {\n \tdma_addr_t dma;\n \tstruct page *page;\n \tunsigned int page_offset;\n+\tu16 pagecnt_bias;\n };\n \n struct ice_q_stats {\n",
    "prefixes": [
        "S14",
        "04/15"
    ]
}