Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/807198/?format=api
{ "id": 807198, "url": "http://patchwork.ozlabs.org/api/patches/807198/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20170829093242.41026-2-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": "<20170829093242.41026-2-alice.michael@intel.com>", "list_archive_url": null, "date": "2017-08-29T09:32:31", "name": "[next,S79-V2,02/13] i40e/i40evf: spread CPU affinity hints across online CPUs only", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "e881778eeaedd809fb511457083685daa14ac2c0", "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/20170829093242.41026-2-alice.michael@intel.com/mbox/", "series": [ { "id": 423, "url": "http://patchwork.ozlabs.org/api/series/423/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=423", "date": "2017-08-29T09:32:31", "name": "[next,S79-V2,01/13] i40e: add private flag to control source pruning", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/423/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/807198/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/807198/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 3xhbSL3SSpz9ryr\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 30 Aug 2017 03:37:37 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 6CBD788B92;\n\tTue, 29 Aug 2017 17:37:36 +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 OoRYVhLpbyHX; Tue, 29 Aug 2017 17:37:35 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id D324C889CA;\n\tTue, 29 Aug 2017 17:37:35 +0000 (UTC)", "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\tby ash.osuosl.org (Postfix) with ESMTP id 6FD301CE993\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue, 29 Aug 2017 17:37:34 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 68B1588B92\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue, 29 Aug 2017 17:37: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 DPHtweCKZVBu for <intel-wired-lan@lists.osuosl.org>;\n\tTue, 29 Aug 2017 17:37:33 +0000 (UTC)", "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby hemlock.osuosl.org (Postfix) with ESMTPS id BFB46889C9\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue, 29 Aug 2017 17:37:33 +0000 (UTC)", "from orsmga003.jf.intel.com ([10.7.209.27])\n\tby orsmga105.jf.intel.com with ESMTP; 29 Aug 2017 10:37:33 -0700", "from unknown (HELO localhost.jf.intel.com) ([10.166.16.121])\n\tby orsmga003.jf.intel.com with ESMTP; 29 Aug 2017 10:37:33 -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.41,445,1498546800\"; d=\"scan'208\";\n\ta=\"1008934104\"", "From": "Alice Michael <alice.michael@intel.com>", "To": "alice.michael@intel.com,\n\tintel-wired-lan@lists.osuosl.org", "Date": "Tue, 29 Aug 2017 05:32:31 -0400", "Message-Id": "<20170829093242.41026-2-alice.michael@intel.com>", "X-Mailer": "git-send-email 2.9.4", "In-Reply-To": "<20170829093242.41026-1-alice.michael@intel.com>", "References": "<20170829093242.41026-1-alice.michael@intel.com>", "Subject": "[Intel-wired-lan] [next PATCH S79-V2 02/13] i40e/i40evf: spread CPU\n\taffinity hints across online CPUs only", "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\nCurrently, when setting up the IRQ for a q_vector, we set an affinity\nhint based on the v_idx of that q_vector. Meaning a loop iterates on\nv_idx, which is an incremental value, and the cpumask is created based\non this value.\n\nThis is a problem in systems with multiple logical CPUs per core (like in\nSMT scenarios). If we disable some logical CPUs, by turning SMT off for\nexample, we will end up with a sparse cpu_online_mask, i.e., only the first\nCPU in a core is online, and incremental filling in q_vector cpumask might\nlead to multiple offline CPUs being assigned to q_vectors.\n\nExample: if we have a system with 8 cores each one containing 8 logical\nCPUs (SMT == 8 in this case), we have 64 CPUs in total. But if SMT is\ndisabled, only the 1st CPU in each core remains online, so the\ncpu_online_mask in this case would have only 8 bits set, in a sparse way.\n\nIn general case, when SMT is off the cpu_online_mask has only C bits set:\n0, 1*N, 2*N, ..., C*(N-1) where\nC == # of cores;\nN == # of logical CPUs per core.\nIn our example, only bits 0, 8, 16, 24, 32, 40, 48, 56 would be set.\n\nInstead, we should only assign hints for CPUs which are online. Even\nbetter, the kernel already provides a function, cpumask_local_spread()\nwhich takes an index and returns a CPU, spreading the interrupts across\nlocal NUMA nodes first, and then remote ones if necessary.\n\nSince we generally have a 1:1 mapping between vectors and CPUs, there\nis no real advantage to spreading vectors to local CPUs first. In order\nto avoid mismatch of the default XPS hints, we'll pass -1 so that it\nspreads across all CPUs without regard to the node locality.\n\nNote that we don't need to change the q_vector->affinity_mask as this is\ninitialized to cpu_possible_mask, until an actual affinity is set and\nthen notified back to us.\n\nSigned-off-by: Jacob Keller <jacob.e.keller@intel.com>\n---\n drivers/net/ethernet/intel/i40e/i40e_main.c | 16 +++++++++++-----\n drivers/net/ethernet/intel/i40evf/i40evf_main.c | 9 ++++++---\n 2 files changed, 17 insertions(+), 8 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c\nindex 0083bf4..e54163b 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_main.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c\n@@ -2886,14 +2886,15 @@ static void i40e_vsi_free_rx_resources(struct i40e_vsi *vsi)\n static void i40e_config_xps_tx_ring(struct i40e_ring *ring)\n {\n \tstruct i40e_vsi *vsi = ring->vsi;\n+\tint cpu;\n \n \tif (!ring->q_vector || !ring->netdev)\n \t\treturn;\n \n \tif ((vsi->tc_config.numtc <= 1) &&\n \t !test_and_set_bit(__I40E_TX_XPS_INIT_DONE, &ring->state)) {\n-\t\tnetif_set_xps_queue(ring->netdev,\n-\t\t\t\t get_cpu_mask(ring->q_vector->v_idx),\n+\t\tcpu = cpumask_local_spread(ring->q_vector->v_idx, -1);\n+\t\tnetif_set_xps_queue(ring->netdev, get_cpu_mask(cpu),\n \t\t\t\t ring->queue_index);\n \t}\n \n@@ -3483,6 +3484,7 @@ static int i40e_vsi_request_irq_msix(struct i40e_vsi *vsi, char *basename)\n \tint tx_int_idx = 0;\n \tint vector, err;\n \tint irq_num;\n+\tint cpu;\n \n \tfor (vector = 0; vector < q_vectors; vector++) {\n \t\tstruct i40e_q_vector *q_vector = vsi->q_vectors[vector];\n@@ -3518,10 +3520,14 @@ static int i40e_vsi_request_irq_msix(struct i40e_vsi *vsi, char *basename)\n \t\tq_vector->affinity_notify.notify = i40e_irq_affinity_notify;\n \t\tq_vector->affinity_notify.release = i40e_irq_affinity_release;\n \t\tirq_set_affinity_notifier(irq_num, &q_vector->affinity_notify);\n-\t\t/* get_cpu_mask returns a static constant mask with\n-\t\t * a permanent lifetime so it's ok to use here.\n+\t\t/* Spread affinity hints out across online CPUs.\n+\t\t *\n+\t\t * get_cpu_mask returns a static constant mask with\n+\t\t * a permanent lifetime so it's ok to pass to\n+\t\t * irq_set_affinity_hint without making a copy.\n \t\t */\n-\t\tirq_set_affinity_hint(irq_num, get_cpu_mask(q_vector->v_idx));\n+\t\tcpu = cpumask_local_spread(q_vector->v_idx, -1);\n+\t\tirq_set_affinity_hint(irq_num, get_cpu_mask(cpu));\n \t}\n \n \tvsi->irqs_ready = true;\ndiff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c\nindex 85e66db..e495856 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c\n+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c\n@@ -515,6 +515,7 @@ i40evf_request_traffic_irqs(struct i40evf_adapter *adapter, char *basename)\n \tunsigned int vector, q_vectors;\n \tunsigned int rx_int_idx = 0, tx_int_idx = 0;\n \tint irq_num, err;\n+\tint cpu;\n \n \ti40evf_irq_disable(adapter);\n \t/* Decrement for Other and TCP Timer vectors */\n@@ -553,10 +554,12 @@ i40evf_request_traffic_irqs(struct i40evf_adapter *adapter, char *basename)\n \t\tq_vector->affinity_notify.release =\n \t\t\t\t\t\t i40evf_irq_affinity_release;\n \t\tirq_set_affinity_notifier(irq_num, &q_vector->affinity_notify);\n-\t\t/* get_cpu_mask returns a static constant mask with\n-\t\t * a permanent lifetime so it's ok to use here.\n+\t\t/* Spread the IRQ affinity hints across online CPUs. Note that\n+\t\t * get_cpu_mask returns a mask with a permanent lifetime so\n+\t\t * it's safe to use as a hint for irq_set_affinity_hint.\n \t\t */\n-\t\tirq_set_affinity_hint(irq_num, get_cpu_mask(q_vector->v_idx));\n+\t\tcpu = cpumask_local_spread(q_vector->v_idx, -1);\n+\t\tirq_set_affinity_hint(irq_num, get_cpu_mask(cpu));\n \t}\n \n \treturn 0;\n", "prefixes": [ "next", "S79-V2", "02/13" ] }