Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/758160/?format=api
{ "id": 758160, "url": "http://patchwork.ozlabs.org/api/patches/758160/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20170503172904.9788-2-jacob.e.keller@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": "<20170503172904.9788-2-jacob.e.keller@intel.com>", "list_archive_url": null, "date": "2017-05-03T17:28:50", "name": "[v4,01/15] e1000e: fix race condition around skb_tstamp_tx()", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "102be03591dfabb962fc0c90a2bbafbe1c4e9f8d", "submitter": { "id": 9784, "url": "http://patchwork.ozlabs.org/api/people/9784/?format=api", "name": "Jacob Keller", "email": "jacob.e.keller@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/20170503172904.9788-2-jacob.e.keller@intel.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/758160/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/758160/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 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 3wJ4sH5dTSz9rxm\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 4 May 2017 03:29:23 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 20F6B89AED;\n\tWed, 3 May 2017 17:29: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 vbOBFKgQGqwT; Wed, 3 May 2017 17:29:19 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id A50BF89B23;\n\tWed, 3 May 2017 17:29:18 +0000 (UTC)", "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id ECBEB1C2B0D\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 3 May 2017 17:29:14 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id E92EB2FD97\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 3 May 2017 17:29:14 +0000 (UTC)", "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id iXTJb0pVHS7K for <intel-wired-lan@lists.osuosl.org>;\n\tWed, 3 May 2017 17:29:12 +0000 (UTC)", "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby silver.osuosl.org (Postfix) with ESMTPS id 7C37E2FC9E\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 3 May 2017 17:29:12 +0000 (UTC)", "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t03 May 2017 10:29:11 -0700", "from jekeller-desk.amr.corp.intel.com (HELO\n\tjekeller-desk.jekeller.internal) ([10.166.35.158])\n\tby orsmga002.jf.intel.com with ESMTP; 03 May 2017 10:29:11 -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.38,284,1491289200\"; d=\"scan'208\";a=\"82070996\"", "From": "Jacob Keller <jacob.e.keller@intel.com>", "To": "Intel Wired LAN <intel-wired-lan@lists.osuosl.org>", "Date": "Wed, 3 May 2017 10:28:50 -0700", "Message-Id": "<20170503172904.9788-2-jacob.e.keller@intel.com>", "X-Mailer": "git-send-email 2.13.0.rc0.317.gcc792a6cad5a", "In-Reply-To": "<20170503172904.9788-1-jacob.e.keller@intel.com>", "References": "<20170503172904.9788-1-jacob.e.keller@intel.com>", "Cc": "Richard Cochran <richardcochran@gmail.com>", "Subject": "[Intel-wired-lan] [PATCH v4 01/15] e1000e: fix race condition\n\taround skb_tstamp_tx()", "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": "The e1000e driver and related hardware has a limitation on Tx PTP\npackets which requires we limit to timestamping a single packet at once.\nWe do this by verifying that we never request a new Tx timestamp while\nwe still have a tx_hwtstamp_skb pointer.\n\nUnfortunately the driver suffers from a race condition around this. The\ntx_hwtstamp_skb pointer is not set to NULL until after skb_tstamp_tx()\nis called. This function notifies the stack and applications of a new\ntimestamp. Even a well behaved application that only sends a new request\nwhen the first one is finished might be woken up and possibly send\na packet before we can free the timestamp in the driver again. The\nresult is that we needlessly ignore some Tx timestamp requests in this\ncorner case.\n\nFix this by assigning the tx_hwtstamp_skb pointer prior to calling\nskb_tstamp_tx() and use a temporary pointer to hold the timestamped skb\nuntil that function finishes. This ensures that the application is not\nwoken up until the driver is ready to begin timestamping a new packet.\n\nThis ensures that well behaved applications do not accidentally race\nwith condition to skip Tx timestamps. Obviously an application which\nsends multiple Tx timestamp requests at once will still only timestamp\none packet at a time. Unfortunately there is nothing we can do about\nthis.\n\nReported-by: David Mirabito <davidm@metamako.com>\nSigned-off-by: Jacob Keller <jacob.e.keller@intel.com>\n---\n drivers/net/ethernet/intel/e1000e/netdev.c | 10 ++++++++--\n 1 file changed, 8 insertions(+), 2 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c\nindex b3679728caac..ec9a50a72550 100644\n--- a/drivers/net/ethernet/intel/e1000e/netdev.c\n+++ b/drivers/net/ethernet/intel/e1000e/netdev.c\n@@ -1183,6 +1183,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)\n \tstruct e1000_hw *hw = &adapter->hw;\n \n \tif (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) {\n+\t\tstruct sk_buff *skb = adapter->tx_hwtstamp_skb;\n \t\tstruct skb_shared_hwtstamps shhwtstamps;\n \t\tu64 txstmp;\n \n@@ -1191,9 +1192,14 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)\n \n \t\te1000e_systim_to_hwtstamp(adapter, &shhwtstamps, txstmp);\n \n-\t\tskb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);\n-\t\tdev_kfree_skb_any(adapter->tx_hwtstamp_skb);\n+\t\t/* Clear the global tx_hwtstamp_skb pointer and force writes\n+\t\t * prior to notifying the stack of a Tx timestamp.\n+\t\t */\n \t\tadapter->tx_hwtstamp_skb = NULL;\n+\t\twmb(); /* force write prior to skb_tstamp_tx */\n+\n+\t\tskb_tstamp_tx(skb, &shhwtstamps);\n+\t\tdev_kfree_skb_any(skb);\n \t} else if (time_after(jiffies, adapter->tx_hwtstamp_start\n \t\t\t + adapter->tx_timeout_factor * HZ)) {\n \t\tdev_kfree_skb_any(adapter->tx_hwtstamp_skb);\n", "prefixes": [ "v4", "01/15" ] }