get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 788795,
    "url": "http://patchwork.ozlabs.org/api/patches/788795/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20170714131019.52530-7-alice.michael@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": "<20170714131019.52530-7-alice.michael@intel.com>",
    "list_archive_url": null,
    "date": "2017-07-14T13:10:13",
    "name": "[next,S76-V2,07/13] i40e/i40evf: avoid dynamic ITR updates when polling or low packet rate",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "b9bfc56af70eb525bb18e62fc690b08422cc1ffb",
    "submitter": {
        "id": 71123,
        "url": "http://patchwork.ozlabs.org/api/people/71123/?format=api",
        "name": "Michael, Alice",
        "email": "alice.michael@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/20170714131019.52530-7-alice.michael@intel.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/788795/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/788795/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"
        ],
        "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 3x8QRv5hBXz9sNd\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 15 Jul 2017 07:14:35 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 6223A8A423;\n\tFri, 14 Jul 2017 21:14:34 +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 tdlQSsBu+0oA; Fri, 14 Jul 2017 21:14:33 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 4EB4C8A426;\n\tFri, 14 Jul 2017 21:14:33 +0000 (UTC)",
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\tby ash.osuosl.org (Postfix) with ESMTP id B25591C0683\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:14:22 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id AACB78A41C\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:14:22 +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 4IsxQQG0Es-S for <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:14:19 +0000 (UTC)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n\tby hemlock.osuosl.org (Postfix) with ESMTPS id 05B9F8A2B4\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:14:18 +0000 (UTC)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby fmsmga105.fm.intel.com with ESMTP; 14 Jul 2017 14:14:18 -0700",
            "from unknown (HELO localhost.jf.intel.com) ([10.166.16.121])\n\tby orsmga002.jf.intel.com with ESMTP; 14 Jul 2017 14:14:17 -0700"
        ],
        "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.40,360,1496127600\"; d=\"scan'208\";a=\"111486595\"",
        "From": "Alice Michael <alice.michael@intel.com>",
        "To": "alice.michael@intel.com,\n\tintel-wired-lan@lists.osuosl.org",
        "Date": "Fri, 14 Jul 2017 09:10:13 -0400",
        "Message-Id": "<20170714131019.52530-7-alice.michael@intel.com>",
        "X-Mailer": "git-send-email 2.9.3",
        "In-Reply-To": "<20170714131019.52530-1-alice.michael@intel.com>",
        "References": "<20170714131019.52530-1-alice.michael@intel.com>",
        "Subject": "[Intel-wired-lan] [next PATCH S76-V2 07/13] i40e/i40evf: avoid\n\tdynamic ITR updates when polling or low packet rate",
        "X-BeenThere": "intel-wired-lan@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.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: Jacob Keller <jacob.e.keller@intel.com>\n\nThe dynamic ITR algorithm depends on a calculation of usecs which\nassumes that the interrupts have been firing constantly at the interrupt\nthrottle rate. This is not guaranteed because we could have a low packet\nrate, or have been polling in software.\n\nWe'll estimate whether this is the case by using jiffies to determine if\nwe've been too long. If the time difference of jiffies is larger we are\nguaranteed to have an incorrect calculation. If the time difference of\njiffies is smaller we might have been polling some but the difference\nshouldn't affect the calculation too much.\n\nThis ensures that we don't get stuck in BULK latency during certain rare\nsituations where we receive bursts of packets that force us into napi\npolling.\n\nSigned-off-by: Jacob Keller <jacob.e.keller@intel.com>\n---\n drivers/net/ethernet/intel/i40e/i40e_txrx.c   | 22 +++++++++++++++++-----\n drivers/net/ethernet/intel/i40e/i40e_txrx.h   |  1 +\n drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 22 +++++++++++++++++-----\n drivers/net/ethernet/intel/i40evf/i40e_txrx.h |  1 +\n 4 files changed, 36 insertions(+), 10 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\nindex c056f60..74589ed 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n@@ -961,11 +961,25 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \tenum i40e_latency_range new_latency_range = rc->latency_range;\n \tu32 new_itr = rc->itr;\n \tint bytes_per_int;\n-\tint usecs;\n+\tunsigned int usecs, estimated_usecs;\n \n \tif (rc->total_packets == 0 || !rc->itr)\n \t\treturn false;\n \n+\tusecs = (rc->itr << 1) * ITR_COUNTDOWN_START;\n+\tbytes_per_int = rc->total_bytes / usecs;\n+\n+\t/* The calculations in this algorithm depend on interrupts actually\n+\t * firing at the ITR rate. This may not happen if the packet rate is\n+\t * really low, or if we've been napi polling. Check to make sure\n+\t * that's not the case before we continue.\n+\t */\n+\testimated_usecs = jiffies_to_usecs(jiffies - rc->last_itr_update);\n+\tif (estimated_usecs > usecs) {\n+\t\tnew_latency_range = I40E_LOW_LATENCY;\n+\t\tgoto reset_latency;\n+\t}\n+\n \t/* simple throttlerate management\n \t *   0-10MB/s   lowest (50000 ints/s)\n \t *  10-20MB/s   low    (20000 ints/s)\n@@ -977,9 +991,6 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \t * are in 2 usec increments in the ITR registers, and make sure\n \t * to use the smoothed values that the countdown timer gives us.\n \t */\n-\tusecs = (rc->itr << 1) * ITR_COUNTDOWN_START;\n-\tbytes_per_int = rc->total_bytes / usecs;\n-\n \tswitch (new_latency_range) {\n \tcase I40E_LOWEST_LATENCY:\n \t\tif (bytes_per_int > 10)\n@@ -998,6 +1009,7 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \t\tbreak;\n \t}\n \n+reset_latency:\n \trc->latency_range = new_latency_range;\n \n \tswitch (new_latency_range) {\n@@ -1016,12 +1028,12 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \n \trc->total_bytes = 0;\n \trc->total_packets = 0;\n+\trc->last_itr_update = jiffies;\n \n \tif (new_itr != rc->itr) {\n \t\trc->itr = new_itr;\n \t\treturn true;\n \t}\n-\n \treturn false;\n }\n \ndiff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h\nindex e6456e8..2f848bc 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h\n@@ -461,6 +461,7 @@ struct i40e_ring_container {\n \tstruct i40e_ring *ring;\n \tunsigned int total_bytes;\t/* total bytes processed this int */\n \tunsigned int total_packets;\t/* total packets processed this int */\n+\tunsigned long last_itr_update;\t/* jiffies of last ITR update */\n \tu16 count;\n \tenum i40e_latency_range latency_range;\n \tu16 itr;\ndiff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\nindex b9acb20..b56a193 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n@@ -359,11 +359,25 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \tenum i40e_latency_range new_latency_range = rc->latency_range;\n \tu32 new_itr = rc->itr;\n \tint bytes_per_int;\n-\tint usecs;\n+\tunsigned int usecs, estimated_usecs;\n \n \tif (rc->total_packets == 0 || !rc->itr)\n \t\treturn false;\n \n+\tusecs = (rc->itr << 1) * ITR_COUNTDOWN_START;\n+\tbytes_per_int = rc->total_bytes / usecs;\n+\n+\t/* The calculations in this algorithm depend on interrupts actually\n+\t * firing at the ITR rate. This may not happen if the packet rate is\n+\t * really low, or if we've been napi polling. Check to make sure\n+\t * that's not the case before we continue.\n+\t */\n+\testimated_usecs = jiffies_to_usecs(jiffies - rc->last_itr_update);\n+\tif (estimated_usecs > usecs) {\n+\t\tnew_latency_range = I40E_LOW_LATENCY;\n+\t\tgoto reset_latency;\n+\t}\n+\n \t/* simple throttlerate management\n \t *   0-10MB/s   lowest (50000 ints/s)\n \t *  10-20MB/s   low    (20000 ints/s)\n@@ -375,9 +389,6 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \t * are in 2 usec increments in the ITR registers, and make sure\n \t * to use the smoothed values that the countdown timer gives us.\n \t */\n-\tusecs = (rc->itr << 1) * ITR_COUNTDOWN_START;\n-\tbytes_per_int = rc->total_bytes / usecs;\n-\n \tswitch (new_latency_range) {\n \tcase I40E_LOWEST_LATENCY:\n \t\tif (bytes_per_int > 10)\n@@ -396,6 +407,7 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \t\tbreak;\n \t}\n \n+reset_latency:\n \trc->latency_range = new_latency_range;\n \n \tswitch (new_latency_range) {\n@@ -414,12 +426,12 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)\n \n \trc->total_bytes = 0;\n \trc->total_packets = 0;\n+\trc->last_itr_update = jiffies;\n \n \tif (new_itr != rc->itr) {\n \t\trc->itr = new_itr;\n \t\treturn true;\n \t}\n-\n \treturn false;\n }\n \ndiff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h\nindex fb506c9..0d9f98b 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h\n+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h\n@@ -432,6 +432,7 @@ struct i40e_ring_container {\n \tstruct i40e_ring *ring;\n \tunsigned int total_bytes;\t/* total bytes processed this int */\n \tunsigned int total_packets;\t/* total packets processed this int */\n+\tunsigned long last_itr_update;\t/* jiffies of last ITR update */\n \tu16 count;\n \tenum i40e_latency_range latency_range;\n \tu16 itr;\n",
    "prefixes": [
        "next",
        "S76-V2",
        "07/13"
    ]
}