Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1165380/?format=api
{ "id": 1165380, "url": "http://patchwork.ozlabs.org/api/patches/1165380/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20190920091724.51767-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": "<20190920091724.51767-2-alice.michael@intel.com>", "list_archive_url": null, "date": "2019-09-20T09:17:16", "name": "[next,S10,02/10] i40e: Add ability to display VF stats along with PF core stats", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": false, "hash": "b63e7e622649b4597923722140f195d272d398d2", "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/20190920091724.51767-2-alice.michael@intel.com/mbox/", "series": [ { "id": 131821, "url": "http://patchwork.ozlabs.org/api/series/131821/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=131821", "date": "2019-09-20T09:17:15", "name": "[next,S10,01/10] i40e: Fix for persistent lldp support", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/131821/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/1165380/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/1165380/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.138; helo=whitealder.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 whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\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 46Zgw05gx9z9sNk\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 21 Sep 2019 03:40:00 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 16A3686FD1;\n\tFri, 20 Sep 2019 17:39:59 +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 ZLNASJAz8zir; Fri, 20 Sep 2019 17:39:56 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 1116987034;\n\tFri, 20 Sep 2019 17:39:55 +0000 (UTC)", "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\tby ash.osuosl.org (Postfix) with ESMTP id 63F8C1BF2C6\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 20 Sep 2019 17:39:53 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 6139B85852\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 20 Sep 2019 17:39:53 +0000 (UTC)", "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id Hqs2xXdjTY1p for <intel-wired-lan@lists.osuosl.org>;\n\tFri, 20 Sep 2019 17:39:52 +0000 (UTC)", "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby fraxinus.osuosl.org (Postfix) with ESMTPS id 74D90857B0\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 20 Sep 2019 17:39:52 +0000 (UTC)", "from fmsmga004.fm.intel.com ([10.253.24.48])\n\tby orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t20 Sep 2019 10:39:51 -0700", "from alicemic-1.jf.intel.com ([10.166.17.62])\n\tby fmsmga004.fm.intel.com with ESMTP; 20 Sep 2019 10:39:51 -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-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.64,529,1559545200\"; d=\"scan'208\";a=\"212635323\"", "From": "Alice Michael <alice.michael@intel.com>", "To": "alice.michael@intel.com,\n\tintel-wired-lan@lists.osuosl.org", "Date": "Fri, 20 Sep 2019 02:17:16 -0700", "Message-Id": "<20190920091724.51767-2-alice.michael@intel.com>", "X-Mailer": "git-send-email 2.21.0", "In-Reply-To": "<20190920091724.51767-1-alice.michael@intel.com>", "References": "<20190920091724.51767-1-alice.michael@intel.com>", "MIME-Version": "1.0", "Subject": "[Intel-wired-lan] [next PATCH S10 02/10] i40e: Add ability to\n\tdisplay VF stats along with PF core stats", "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>", "Cc": "Arkadiusz Grubba <arkadiusz.grubba@intel.com>", "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: Arkadiusz Grubba <arkadiusz.grubba@intel.com>\n\nThis change introduces the ability to display extended (enhanced)\nstatistics for PF interfaces (in accordance to the new build flags\nalso introduced here).\n\nThe patch introduces new arrays and preprocessor symbols defined for these\nextra stats (in i40e_ethtool.c file) and enhances/extends ethtool ops\nfunctions intended for dealing with PF stats (i.e.: i40e_get_stats_count(),\ni40e_get_ethtool_stats(), i40e_get_stat_strings() ).\n\nThere have also been introduced the new build flag named\n\"I40E_PF_EXTRA_STATS_OFF\" to exclude from the driver code all code snippets\nassociated with these extra stats.\n\nSigned-off-by: Arkadiusz Grubba <arkadiusz.grubba@intel.com>\n---\n .../net/ethernet/intel/i40e/i40e_ethtool.c | 149 ++++++++++++++++++\n 1 file changed, 149 insertions(+)", "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\nindex 41e1240acaea..c814c756b4bb 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\n@@ -389,6 +389,7 @@ static const struct i40e_stats i40e_gstrings_pfc_stats[] = {\n \n #define I40E_GLOBAL_STATS_LEN\tARRAY_SIZE(i40e_gstrings_stats)\n \n+/* Length (number) of PF core stats only (i.e. without queues / extra stats): */\n #define I40E_PF_STATS_LEN\t(I40E_GLOBAL_STATS_LEN + \\\n \t\t\t\t I40E_PFC_STATS_LEN + \\\n \t\t\t\t I40E_VEB_STATS_LEN + \\\n@@ -397,6 +398,44 @@ static const struct i40e_stats i40e_gstrings_pfc_stats[] = {\n /* Length of stats for a single queue */\n #define I40E_QUEUE_STATS_LEN\tARRAY_SIZE(i40e_gstrings_queue_stats)\n \n+#define I40E_STATS_NAME_VFID_EXTRA \"vf___.\"\n+#define I40E_STATS_NAME_VFID_EXTRA_LEN (sizeof(I40E_STATS_NAME_VFID_EXTRA) - 1)\n+\n+static struct i40e_stats i40e_gstrings_eth_stats_extra[] = {\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"rx_bytes\", eth_stats.rx_bytes),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"rx_unicast\", eth_stats.rx_unicast),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"rx_multicast\", eth_stats.rx_multicast),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"rx_broadcast\", eth_stats.rx_broadcast),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"rx_discards\", eth_stats.rx_discards),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"rx_unknown_protocol\", eth_stats.rx_unknown_protocol),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"tx_bytes\", eth_stats.tx_bytes),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"tx_unicast\", eth_stats.tx_unicast),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"tx_multicast\", eth_stats.tx_multicast),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"tx_broadcast\", eth_stats.tx_broadcast),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"tx_discards\", eth_stats.tx_discards),\n+\tI40E_VSI_STAT(I40E_STATS_NAME_VFID_EXTRA\n+\t\t \"tx_errors\", eth_stats.tx_errors),\n+};\n+\n+#define I40E_STATS_EXTRA_COUNT\t128 /* as for now only I40E_MAX_VF_COUNT */\n+/* Following length value does not include the length values for queues stats */\n+#define I40E_STATS_EXTRA_LEN\tARRAY_SIZE(i40e_gstrings_eth_stats_extra)\n+/* Length (number) of PF extra stats only (i.e. without core stats / queues): */\n+#define I40E_PF_STATS_EXTRA_LEN (I40E_STATS_EXTRA_COUNT * I40E_STATS_EXTRA_LEN)\n+/* Length (number) of enhanced/all PF stats (i.e. core with extra stats): */\n+#define I40E_PF_STATS_ENHANCE_LEN (I40E_PF_STATS_LEN + I40E_PF_STATS_EXTRA_LEN)\n+\n enum i40e_ethtool_test_id {\n \tI40E_ETH_TEST_REG = 0,\n \tI40E_ETH_TEST_EEPROM,\n@@ -2190,6 +2229,9 @@ static int i40e_get_stats_count(struct net_device *netdev)\n \t */\n \tstats_len += I40E_QUEUE_STATS_LEN * 2 * netdev->num_tx_queues;\n \n+\tif (vsi == pf->vsi[pf->lan_vsi] && pf->hw.partition_id == 1)\n+\t\tstats_len += I40E_PF_STATS_EXTRA_LEN;\n+\n \treturn stats_len;\n }\n \n@@ -2258,6 +2300,10 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,\n \tstruct i40e_vsi *vsi = np->vsi;\n \tstruct i40e_pf *pf = vsi->back;\n \tstruct i40e_veb *veb = NULL;\n+\tunsigned int vsi_idx;\n+\tunsigned int vf_idx;\n+\tunsigned int vf_id;\n+\tbool is_vf_valid;\n \tunsigned int i;\n \tbool veb_stats;\n \tu64 *p = data;\n@@ -2307,11 +2353,109 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,\n \t\ti40e_add_ethtool_stats(&data, &pfc, i40e_gstrings_pfc_stats);\n \t}\n \n+\t/* As for now, we only process the SRIOV type VSIs (as extra stats to\n+\t * PF core stats) which are correlated with VF LAN VSI (hence below,\n+\t * in this for-loop instruction block, only VF's LAN VSIs are currently\n+\t * processed).\n+\t */\n+\tfor (vf_id = 0; vf_id < pf->num_alloc_vfs; vf_id++) {\n+\t\tis_vf_valid = true;\n+\t\tfor (vf_idx = 0; vf_idx < pf->num_alloc_vfs; vf_idx++)\n+\t\t\tif (pf->vf[vf_idx].vf_id == vf_id)\n+\t\t\t\tbreak;\n+\t\tif (vf_idx >= pf->num_alloc_vfs) {\n+\t\t\tdev_info(&pf->pdev->dev,\n+\t\t\t\t \"In the PF's array, there is no VF instance with VF_ID identifier %d or it is not set/initialized correctly yet\\n\",\n+\t\t\t\t vf_id);\n+\t\t\tis_vf_valid = false;\n+\t\t\tgoto check_vf;\n+\t\t}\n+\t\tvsi_idx = pf->vf[vf_idx].lan_vsi_idx;\n+\n+\t\tvsi = pf->vsi[vsi_idx];\n+\t\tif (!vsi) {\n+\t\t\t/* It means empty field in the PF VSI array... */\n+\t\t\tdev_info(&pf->pdev->dev,\n+\t\t\t\t \"No LAN VSI instance referenced by VF %d or it is not set/initialized correctly yet\\n\",\n+\t\t\t\t vf_id);\n+\t\t\tis_vf_valid = false;\n+\t\t\tgoto check_vf;\n+\t\t}\n+\t\tif (vsi->vf_id != vf_id) {\n+\t\t\tdev_info(&pf->pdev->dev,\n+\t\t\t\t \"In the PF's array, there is incorrectly set/initialized LAN VSI or reference to it from VF %d is not set/initialized correctly yet\\n\",\n+\t\t\t\t vf_id);\n+\t\t\tis_vf_valid = false;\n+\t\t\tgoto check_vf;\n+\t\t}\n+\t\tif (vsi->vf_id != pf->vf[vf_idx].vf_id ||\n+\t\t !i40e_find_vsi_from_id(pf, pf->vf[vsi->vf_id].lan_vsi_id)) {\n+\t\t\t/* Disjointed identifiers or broken references VF-VSI */\n+\t\t\tdev_warn(&pf->pdev->dev,\n+\t\t\t\t \"SRIOV LAN VSI (index %d in PF VSI array) with invalid VF Identifier %d (referenced by VF %d, ordered as %d in VF array)\\n\",\n+\t\t\t\t vsi_idx, pf->vsi[vsi_idx]->vf_id,\n+\t\t\t\t pf->vf[vf_idx].vf_id, vf_idx);\n+\t\t\tis_vf_valid = false;\n+\t\t}\n+check_vf:\n+\t\tif (!is_vf_valid) {\n+\t\t\ti40e_add_ethtool_stats(&data, NULL,\n+\t\t\t\t\t i40e_gstrings_eth_stats_extra);\n+\t\t} else {\n+\t\t\ti40e_update_eth_stats(vsi);\n+\t\t\ti40e_add_ethtool_stats(&data, vsi,\n+\t\t\t\t\t i40e_gstrings_eth_stats_extra);\n+\t\t}\n+\t}\n+\tfor (; vf_id < I40E_STATS_EXTRA_COUNT; vf_id++)\n+\t\ti40e_add_ethtool_stats(&data, NULL,\n+\t\t\t\t i40e_gstrings_eth_stats_extra);\n+\n check_data_pointer:\n \tWARN_ONCE(data - p != i40e_get_stats_count(netdev),\n \t\t \"ethtool stats count mismatch!\");\n }\n \n+/**\n+ * __i40e_update_vfid_in_stats_strings - print VF num to stats names\n+ * @stats_extra: array of stats structs with stats name strings\n+ * @strings_num: number of stats name strings in array above (length)\n+ * @vf_id: VF number to update stats name strings with\n+ *\n+ * Helper function to i40e_get_stat_strings() in case of extra stats.\n+ **/\n+static inline void\n+__i40e_update_vfid_in_stats_strings(struct i40e_stats stats_extra[],\n+\t\t\t\t int strings_num, int vf_id)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < strings_num; i++) {\n+\t\tsnprintf(stats_extra[i].stat_string,\n+\t\t\t I40E_STATS_NAME_VFID_EXTRA_LEN, \"vf%03d\", vf_id);\n+\t\tstats_extra[i].stat_string[I40E_STATS_NAME_VFID_EXTRA_LEN -\n+\t\t\t\t\t\t\t\t 1] = '.';\n+\t}\n+}\n+\n+/**\n+ * i40e_update_vfid_in_stats - print VF num to stat names\n+ * @stats_extra: array of stats structs with stats name strings\n+ * @vf_id: VF number to update stats name strings with\n+ *\n+ * Helper macro to i40e_get_stat_strings() to ease use of\n+ * __i40e_update_vfid_in_stats_strings() function due to extra stats.\n+ *\n+ * Macro to ease the use of __i40e_update_vfid_in_stats_strings by taking\n+ * a static constant stats array and passing the ARRAY_SIZE(). This avoids typos\n+ * by ensuring that we pass the size associated with the given stats array.\n+ *\n+ * The parameter @stats_extra is evaluated twice, so parameters with side\n+ * effects should be avoided.\n+ **/\n+#define i40e_update_vfid_in_stats(stats_extra, vf_id) \\\n+__i40e_update_vfid_in_stats_strings(stats_extra, ARRAY_SIZE(stats_extra), vf_id)\n+\n /**\n * i40e_get_stat_strings - copy stat strings into supplied buffer\n * @netdev: the netdev to collect strings for\n@@ -2354,6 +2498,11 @@ static void i40e_get_stat_strings(struct net_device *netdev, u8 *data)\n \tfor (i = 0; i < I40E_MAX_USER_PRIORITY; i++)\n \t\ti40e_add_stat_strings(&data, i40e_gstrings_pfc_stats, i);\n \n+\tfor (i = 0; i < I40E_STATS_EXTRA_COUNT; i++) {\n+\t\ti40e_update_vfid_in_stats(i40e_gstrings_eth_stats_extra, i);\n+\t\ti40e_add_stat_strings(&data, i40e_gstrings_eth_stats_extra);\n+\t}\n+\n check_data_pointer:\n \tWARN_ONCE(data - p != i40e_get_stats_count(netdev) * ETH_GSTRING_LEN,\n \t\t \"stat strings count mismatch!\");\n", "prefixes": [ "next", "S10", "02/10" ] }