Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/758159/?format=api
{ "id": 758159, "url": "http://patchwork.ozlabs.org/api/patches/758159/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20170503172904.9788-4-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-4-jacob.e.keller@intel.com>", "list_archive_url": null, "date": "2017-05-03T17:28:52", "name": "[v4,03/15] igb: fix race condition with PTP_TX_IN_PROGRESS bits", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "927f911a6c2c386aafce96ae168eff4a541f606b", "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-4-jacob.e.keller@intel.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/758159/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/758159/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 3wJ4sH4dt7z9rvt\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 2B5D789B1A;\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 P+i749BYDcMZ; 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 2DA1F89ABF;\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 D34A41C0F65\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 C38A32FD97\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 aTjL8lAfAe2e 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 C668130148\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=\"82071005\"", "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:52 -0700", "Message-Id": "<20170503172904.9788-4-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 03/15] igb: fix race condition with\n\tPTP_TX_IN_PROGRESS bits", "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": "Hardware related to the igb driver has a limiation of only handling one\nTx timestamp at a time. Thus, the driver uses a state bit lock to\nenforce that only one timestamp request is honored at a time.\n\nUnfortunately this suffers from a simple race condition. The bit lock is\nnot cleared until after skb_tstamp_tx() is called notifying the stack of\na new Tx timestamp. Even a well behaved application which sends only one\ntimestamp request at once and waits for a response might wake up and\nsend a new packet before the bit lock is cleared. This results in\nneedlessly dropping some Tx timestamp requests.\n\nWe can fix this by unlocking the state bit as soon as we read the\nTimestamp register, as this is the first point at which it is safe to\nunlock.\n\nTo avoid issues with the skb pointer, we'll use a copy of the pointer\nand set the global variable in the driver structure to NULL first. This\nensures that the next timestamp request does not modify our local copy\nof the skb pointer.\n\nThis ensures that well behaved applications do not accidentally race\nwith the unlock bit. Obviously an application which sends multiple Tx\ntimestamp requests at once will still only timestamp one packet at\na time. Unfortunately there is nothing we can do about this.\n\nReported-by: David Mirabito <davidm@metamako.com>\nSigned-off-by: Jacob Keller <jacob.e.keller@intel.com>\n---\n drivers/net/ethernet/intel/igb/igb_ptp.c | 12 ++++++++++--\n 1 file changed, 10 insertions(+), 2 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c\nindex 7a3fd4d74592..a2da5738bfb5 100644\n--- a/drivers/net/ethernet/intel/igb/igb_ptp.c\n+++ b/drivers/net/ethernet/intel/igb/igb_ptp.c\n@@ -721,6 +721,7 @@ void igb_ptp_rx_hang(struct igb_adapter *adapter)\n **/\n static void igb_ptp_tx_hwtstamp(struct igb_adapter *adapter)\n {\n+\tstruct sk_buff *skb = adapter->ptp_tx_skb;\n \tstruct e1000_hw *hw = &adapter->hw;\n \tstruct skb_shared_hwtstamps shhwtstamps;\n \tu64 regval;\n@@ -748,10 +749,17 @@ static void igb_ptp_tx_hwtstamp(struct igb_adapter *adapter)\n \tshhwtstamps.hwtstamp =\n \t\tktime_add_ns(shhwtstamps.hwtstamp, adjust);\n \n-\tskb_tstamp_tx(adapter->ptp_tx_skb, &shhwtstamps);\n-\tdev_kfree_skb_any(adapter->ptp_tx_skb);\n+\t/* Clear the lock early before calling skb_tstamp_tx so that\n+\t * applications are not woken up before the lock bit is clear. We use\n+\t * a copy of the skb pointer to ensure other threads can't change it\n+\t * while we're notifying the stack.\n+\t */\n \tadapter->ptp_tx_skb = NULL;\n \tclear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state);\n+\n+\t/* Notify the stack and free the skb after we've unlocked */\n+\tskb_tstamp_tx(skb, &shhwtstamps);\n+\tdev_kfree_skb_any(skb);\n }\n \n /**\n", "prefixes": [ "v4", "03/15" ] }