Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806315/?format=api
{ "id": 806315, "url": "http://patchwork.ozlabs.org/api/patches/806315/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170828001603.75876-16-jeffrey.t.kirsher@intel.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170828001603.75876-16-jeffrey.t.kirsher@intel.com>", "list_archive_url": null, "date": "2017-08-28T00:16:03", "name": "[net-next,15/15] i40e/i40evf: avoid dynamic ITR updates when polling or low packet rate", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "b9bfc56af70eb525bb18e62fc690b08422cc1ffb", "submitter": { "id": 473, "url": "http://patchwork.ozlabs.org/api/people/473/?format=api", "name": "Kirsher, Jeffrey T", "email": "jeffrey.t.kirsher@intel.com" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20170828001603.75876-16-jeffrey.t.kirsher@intel.com/mbox/", "series": [ { "id": 52, "url": "http://patchwork.ozlabs.org/api/series/52/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=52", "date": "2017-08-28T00:15:49", "name": "40GbE Intel Wired LAN Driver Updates 2017-08-27", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/52/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806315/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806315/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xgXPf58GJz9s82\n\tfor <patchwork-incoming@ozlabs.org>;\n\tMon, 28 Aug 2017 10:16:38 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751774AbdH1AQh (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tSun, 27 Aug 2017 20:16:37 -0400", "from mga14.intel.com ([192.55.52.115]:36375 \"EHLO mga14.intel.com\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751613AbdH1AQW (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tSun, 27 Aug 2017 20:16:22 -0400", "from fmsmga004.fm.intel.com ([10.253.24.48])\n\tby fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t27 Aug 2017 17:16:21 -0700", "from davidpwo-mobl1.amr.corp.intel.com (HELO\n\tjtkirshe-DESK.amr.corp.intel.com.com) ([10.254.22.134])\n\tby fmsmga004.fm.intel.com with ESMTP; 27 Aug 2017 17:16:21 -0700" ], "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.41,439,1498546800\"; d=\"scan'208\";a=\"304981106\"", "From": "Jeff Kirsher <jeffrey.t.kirsher@intel.com>", "To": "davem@davemloft.net", "Cc": "Jacob Keller <jacob.e.keller@intel.com>, netdev@vger.kernel.org,\n\tnhorman@redhat.com, sassmann@redhat.com, jogreene@redhat.com,\n\tJeff Kirsher <jeffrey.t.kirsher@intel.com>", "Subject": "[net-next 15/15] i40e/i40evf: avoid dynamic ITR updates when\n\tpolling or low packet rate", "Date": "Sun, 27 Aug 2017 17:16:03 -0700", "Message-Id": "<20170828001603.75876-16-jeffrey.t.kirsher@intel.com>", "X-Mailer": "git-send-email 2.14.1", "In-Reply-To": "<20170828001603.75876-1-jeffrey.t.kirsher@intel.com>", "References": "<20170828001603.75876-1-jeffrey.t.kirsher@intel.com>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.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>\nTested-by: Andrew Bowers <andrewx.bowers@intel.com>\nSigned-off-by: Jeff Kirsher <jeffrey.t.kirsher@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 f00f233092e9..1519dfb851d0 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 e6456e8a899c..2f848bc5e391 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 2f7d9f4a6746..c32c62462c84 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 fb506c9f5a6e..0d9f98bc07bd 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": [ "net-next", "15/15" ] }