get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 568511,
    "url": "http://patchwork.ozlabs.org/api/patches/568511/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1452897202-15204-9-git-send-email-joshua.a.hay@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": "<1452897202-15204-9-git-send-email-joshua.a.hay@intel.com>",
    "list_archive_url": null,
    "date": "2016-01-15T22:33:15",
    "name": "[next,S28,08/15] i40e/i40evf: avoid atomics",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "1ab42b4bdcc8165b719e6a87219a01ccce8d3eea",
    "submitter": {
        "id": 19461,
        "url": "http://patchwork.ozlabs.org/api/people/19461/?format=api",
        "name": "Joshua Hay",
        "email": "joshua.a.hay@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/1452897202-15204-9-git-send-email-joshua.a.hay@intel.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/568511/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/568511/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 6C1B3140BA4\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 16 Jan 2016 09:33:36 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id D538191A9C;\n\tFri, 15 Jan 2016 22:33:34 +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 jtQg+LlyOk5O; Fri, 15 Jan 2016 22:33:30 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id EEAB291A73;\n\tFri, 15 Jan 2016 22:33:25 +0000 (UTC)",
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\tby ash.osuosl.org (Postfix) with ESMTP id 420D01C2189\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 15 Jan 2016 22:33:25 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 3E60393643\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 15 Jan 2016 22:33:25 +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 BbfMpsm1A7tF for <intel-wired-lan@lists.osuosl.org>;\n\tFri, 15 Jan 2016 22:33:23 +0000 (UTC)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id E1A8093648\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 15 Jan 2016 22:33:23 +0000 (UTC)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n\tby fmsmga103.fm.intel.com with ESMTP; 15 Jan 2016 14:33:23 -0800",
            "from jahay1-mobl2.amr.corp.intel.com (HELO\n\tlocalhost.localdomain.localdomain) ([134.134.176.81])\n\tby fmsmga002.fm.intel.com with ESMTP; 15 Jan 2016 14:33:22 -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-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.22,302,1449561600\"; d=\"scan'208\";a=\"894132183\"",
        "From": "Joshua Hay <joshua.a.hay@intel.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Fri, 15 Jan 2016 14:33:15 -0800",
        "Message-Id": "<1452897202-15204-9-git-send-email-joshua.a.hay@intel.com>",
        "X-Mailer": "git-send-email 2.1.0",
        "In-Reply-To": "<1452897202-15204-1-git-send-email-joshua.a.hay@intel.com>",
        "References": "<1452897202-15204-1-git-send-email-joshua.a.hay@intel.com>",
        "Subject": "[Intel-wired-lan] [next PATCH S28 08/15] i40e/i40evf: avoid atomics",
        "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>",
        "MIME-Version": "1.0",
        "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": "From: Mitch Williams <mitch.a.williams@intel.com>\n\nIn the case where we have a page fully used by receive data, we need to\nrelease the page fully to the stack. Instead of calling get_page (which\nincrements the page count) followed by free_page (which decrements the\npage count), just donate our reference to the stack. Although this\ndonation is not tax deductable, it does allow us to avoid two very\nexpensive atomic operations that reverse each other.\n\nSigned-off-by: Mitch Williams <mitch.a.williams@intel.com>\nChange-ID: If70739792d5748995fc175ec92ac2171ed4ad8fc\n---\nTesting Hints: make sure receive traffic is stable under heavy load with\npacket split enabled, and that no data corruption is seen.\n\n drivers/net/ethernet/intel/i40e/i40e_txrx.c   | 21 +++++++++++++--------\n drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 21 +++++++++++++--------\n 2 files changed, 26 insertions(+), 16 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\nindex 60e993e..cd9bb7f 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n@@ -1663,28 +1663,33 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, const int budget)\n \t\t\t\t\trx_bi->page_offset + copysize,\n \t\t\t\t\trx_packet_len, I40E_RXBUFFER_2048);\n \n-\t\t\tget_page(rx_bi->page);\n-\t\t\t/* switch to the other half-page here; the allocation\n-\t\t\t * code programs the right addr into HW. If we haven't\n-\t\t\t * used this half-page, the address won't be changed,\n-\t\t\t * and HW can just use it next time through.\n-\t\t\t */\n-\t\t\trx_bi->page_offset ^= PAGE_SIZE / 2;\n \t\t\t/* If the page count is more than 2, then both halves\n \t\t\t * of the page are used and we need to free it. Do it\n \t\t\t * here instead of in the alloc code. Otherwise one\n \t\t\t * of the half-pages might be released between now and\n \t\t\t * then, and we wouldn't know which one to use.\n+\t\t\t * Don't call get_page and free_page since those are\n+\t\t\t * both expensive atomic operations that just change\n+\t\t\t * the refcount in opposite directions. Just give the\n+\t\t\t * page to the stack; he can have our refcount.\n \t\t\t */\n \t\t\tif (page_count(rx_bi->page) > 2) {\n \t\t\t\tdma_unmap_page(rx_ring->dev,\n \t\t\t\t\t       rx_bi->page_dma,\n \t\t\t\t\t       PAGE_SIZE,\n \t\t\t\t\t       DMA_FROM_DEVICE);\n-\t\t\t\t__free_page(rx_bi->page);\n \t\t\t\trx_bi->page = NULL;\n \t\t\t\trx_bi->page_dma = 0;\n \t\t\t\trx_ring->rx_stats.realloc_count++;\n+\t\t\t} else {\n+\t\t\t\tget_page(rx_bi->page);\n+\t\t\t\t/* switch to the other half-page here; the\n+\t\t\t\t * allocation code programs the right addr\n+\t\t\t\t * into HW. If we haven't used this half-page,\n+\t\t\t\t * the address won't be changed, and HW can\n+\t\t\t\t * just use it next time through.\n+\t\t\t\t */\n+\t\t\t\trx_bi->page_offset ^= PAGE_SIZE / 2;\n \t\t\t}\n \n \t\t}\ndiff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\nindex c1ea819..ecd2df2 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n@@ -1126,28 +1126,33 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, const int budget)\n \t\t\t\t\trx_bi->page_offset + copysize,\n \t\t\t\t\trx_packet_len, I40E_RXBUFFER_2048);\n \n-\t\t\tget_page(rx_bi->page);\n-\t\t\t/* switch to the other half-page here; the allocation\n-\t\t\t * code programs the right addr into HW. If we haven't\n-\t\t\t * used this half-page, the address won't be changed,\n-\t\t\t * and HW can just use it next time through.\n-\t\t\t */\n-\t\t\trx_bi->page_offset ^= PAGE_SIZE / 2;\n \t\t\t/* If the page count is more than 2, then both halves\n \t\t\t * of the page are used and we need to free it. Do it\n \t\t\t * here instead of in the alloc code. Otherwise one\n \t\t\t * of the half-pages might be released between now and\n \t\t\t * then, and we wouldn't know which one to use.\n+\t\t\t * Don't call get_page and free_page since those are\n+\t\t\t * both expensive atomic operations that just change\n+\t\t\t * the refcount in opposite directions. Just give the\n+\t\t\t * page to the stack; he can have our refcount.\n \t\t\t */\n \t\t\tif (page_count(rx_bi->page) > 2) {\n \t\t\t\tdma_unmap_page(rx_ring->dev,\n \t\t\t\t\t       rx_bi->page_dma,\n \t\t\t\t\t       PAGE_SIZE,\n \t\t\t\t\t       DMA_FROM_DEVICE);\n-\t\t\t\t__free_page(rx_bi->page);\n \t\t\t\trx_bi->page = NULL;\n \t\t\t\trx_bi->page_dma = 0;\n \t\t\t\trx_ring->rx_stats.realloc_count++;\n+\t\t\t} else {\n+\t\t\t\tget_page(rx_bi->page);\n+\t\t\t\t/* switch to the other half-page here; the\n+\t\t\t\t * allocation code programs the right addr\n+\t\t\t\t * into HW. If we haven't used this half-page,\n+\t\t\t\t * the address won't be changed, and HW can\n+\t\t\t\t * just use it next time through.\n+\t\t\t\t */\n+\t\t\t\trx_bi->page_offset ^= PAGE_SIZE / 2;\n \t\t\t}\n \n \t\t}\n",
    "prefixes": [
        "next",
        "S28",
        "08/15"
    ]
}