Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/534990/?format=api
{ "id": 534990, "url": "http://patchwork.ozlabs.org/api/patches/534990/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1445560348-29872-1-git-send-email-bpoirier@suse.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": "<1445560348-29872-1-git-send-email-bpoirier@suse.com>", "list_archive_url": null, "date": "2015-10-23T00:32:26", "name": "[0/2] e1000e msi-x fixes", "commit_ref": null, "pull_url": null, "state": "not-applicable", "archived": false, "hash": "195146095e695732929ac5ab5f30761618b7f1f5", "submitter": { "id": 67008, "url": "http://patchwork.ozlabs.org/api/people/67008/?format=api", "name": "Benjamin Poirier", "email": "bpoirier@suse.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1445560348-29872-1-git-send-email-bpoirier@suse.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/534990/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/534990/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 whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\tby ozlabs.org (Postfix) with ESMTP id 480AF141311\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 24 Oct 2015 00:19:31 +1100 (AEDT)", "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 8FA23889BA;\n\tFri, 23 Oct 2015 13:19:30 +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 h9btKATC+I3X; Fri, 23 Oct 2015 13:19:28 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 26B5F889B4;\n\tFri, 23 Oct 2015 13:19:28 +0000 (UTC)", "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id 2630B1C1F0B\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 23 Oct 2015 00:44:10 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 208DD307CD\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 23 Oct 2015 00:44:10 +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 W6KlsFtHkHCg for <intel-wired-lan@lists.osuosl.org>;\n\tFri, 23 Oct 2015 00:44:09 +0000 (UTC)", "from mx2.suse.de (mx2.suse.de [195.135.220.15])\n\tby silver.osuosl.org (Postfix) with ESMTPS id D03FE303D7\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 23 Oct 2015 00:44:08 +0000 (UTC)", "from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254])\n\tby mx2.suse.de (Postfix) with ESMTP id 8B051AB4B;\n\tFri, 23 Oct 2015 00:32:53 +0000 (UTC)" ], "X-Virus-Scanned": [ "amavisd-new at osuosl.org", "amavisd-new at osuosl.org", "by amavisd-new at test-mx.suse.de" ], "X-Greylist": "delayed 00:11:11 by SQLgrey-1.7.6", "From": "Benjamin Poirier <bpoirier@suse.com>", "To": "Jeff Kirsher <jeffrey.t.kirsher@intel.com>", "Date": "Thu, 22 Oct 2015 17:32:26 -0700", "Message-Id": "<1445560348-29872-1-git-send-email-bpoirier@suse.com>", "X-Mailer": "git-send-email 2.5.0", "X-Mailman-Approved-At": "Fri, 23 Oct 2015 13:19:27 +0000", "Cc": "linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org,\n\tnetdev@vger.kernel.org", "Subject": "[Intel-wired-lan] [PATCH 0/2] e1000e msi-x fixes", "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": "Hi,\n\nFor this series:\n\n\nBenjamin Poirier (2):\n e1000e: remove unreachable code\n e1000e: Fix msi-x interrupt automask\n\n drivers/net/ethernet/intel/e1000e/netdev.c | 18 ++++++------------\n 1 file changed, 6 insertions(+), 12 deletions(-)\n\n\nThe first patch is a cleanup but the second one is the real deal. Please\nconsider reading the description for that patch before proceeding. I\nbelieve that the following simple tracing statements are helpful in\ndetecting the problem fixed by the second patch.\n\n\n-------- 8< --------\n\nWith that patch but without the patches in this series we can see that rx irqs\noccur at unexpected times:\n\n <idle>-0 [000] .Ns. 1986.887517: e1000e_poll: eth1: will enable rxq0 irq\n <idle>-0 [000] d.h. 1986.896654: e1000_intr_msix_rx: eth1: rxq0 irq ims 0x01500004\n <idle>-0 [000] d.h. 1986.896657: e1000_intr_msix_rx: eth1: scheduling napi\n <idle>-0 [000] d.H. 1986.896662: e1000_intr_msix_rx: eth1: rxq0 irq ims 0x01500004\n <idle>-0 [000] ..s. 1986.896667: e1000e_poll: eth1: poll starting ims 0x01500004\nWarning: many interrupts (2) before napi\n <idle>-0 [000] ..s. 1986.896685: e1000e_poll: eth1: will enable rxq0 irq\n\n <idle>-0 [000] d.h. 1990.688870: e1000_intr_msix_rx: eth1: scheduling napi\n <idle>-0 [000] ..s. 1990.688875: e1000e_poll: eth1: poll starting ims 0x01500004\n <idle>-0 [000] dNH. 1990.688913: e1000_intr_msix_rx: eth1: rxq0 irq ims 0x01500004\nWarning: interrupt inside napi\n <idle>-0 [000] .Ns. 1990.688916: e1000e_poll: eth1: will enable rxq0 irq\n <idle>-0 [000] d.h. 1990.729688: e1000_intr_msix_rx: eth1: rxq0 irq ims 0x01500004\n\nHere's a typical sequence after applying the patches in this series. Notice\nthat ims is changed. Another printk at the end of e1000e_poll would show it to\nbe 0x01500004.\n\n <idle>-0 [000] d.h. 3896.134376: e1000_intr_msix_rx: eth1: rxq0 irq ims 0x01400004\n <idle>-0 [000] d.h. 3896.134379: e1000_intr_msix_rx: eth1: scheduling napi\n <idle>-0 [000] ..s. 3896.134384: e1000e_poll: eth1: poll starting ims 0x01400004\n <idle>-0 [000] ..s. 3896.134398: e1000e_poll: eth1: will enable rxq0 irq\n\nFinally, here's the script I used to generate the warnings above:\n\n#!/usr/bin/python3\n\nimport sys\nimport re\nimport pprint\n\n\nclass NaE(Exception):\n \"Not an Event\"\n pass\n\nclass Event:\n def __init__(self, line):\n # sample events:\n # <idle>-0 [000] d.h. 2025.256536: e1000_intr_msix_rx: eth1: rxq0 irq ims 0x01500004\n # <idle>-0 [000] d.h. 2025.256539: e1000_intr_msix_rx: eth1: scheduling napi\n # <idle>-0 [000] ..s. 2025.256544: e1000e_poll: eth1: poll starting ims 0x01500004\n # <idle>-0 [000] ..s. 2025.256558: e1000e_poll: eth1: will enable rxq0 irq\n retval = re.match(\" +<?(?P<comm>.*)>?-(?P<pid>[0-9]+) +\\[(?P<cpu>.*)\\] (?P<flags>[^ ]+) +(?P<time>[0-9.]+): (?P<funcname>[^:]+): (?P<ifname>[^:]+): (?P<args>.*)\", line)\n if retval:\n self.comm = retval.group(\"comm\")\n self.pid = retval.group(\"pid\")\n self.cpu = retval.group(\"cpu\")\n self.flags = retval.group(\"flags\")\n self.time = retval.group(\"time\")\n self.funcname = retval.group(\"funcname\")\n self.ifname = retval.group(\"ifname\")\n self.args = retval.group(\"args\")\n else:\n raise NaE\n\n\nclass Machine:\n pass\n\nclass State:\n def __init__(self, machine):\n self.machine = machine\n\n def entry(self, event):\n pass\n\n def transition(self, event):\n \"self.machine should be considered read-only in transition\"\n return State(self.machine)\n\n def run(self, event):\n pass\n\n def exit(self, event):\n pass\n\n def advance(self, event):\n nextState = self.transition(event)\n if (nextState != self):\n self.exit(event)\n nextState.entry(event)\n nextState.run(event)\n return nextState\n\n# general receive processing machine\ndef enteringNapi(machine, event):\n if event.args.startswith(\"poll starting\"):\n return True\n else:\n return False\n\ndef exitingNapi(machine, event):\n if event.args.startswith(\"will enable\"):\n return True\n else:\n return False\n\nclass OutsideNapi(State):\n def entry(self, event):\n self.machine.intr = []\n\n def transition(self, event):\n if enteringNapi(self.machine, event):\n return InsideNapi(self.machine)\n else:\n return self\n\n def run(self, event):\n if event.args.startswith(\"rxq0 irq\"):\n self.machine.intr.append(event)\n\n def exit(self, event):\n if len(self.machine.intr) > 1:\n print(\"Warning: many interrupts (%d) before napi at %s\" % (\n len(self.machine.intr), event.time,))\n\nclass InsideNapi(State):\n def transition(self, event):\n if exitingNapi(self.machine, event):\n return OutsideNapi(self.machine)\n else:\n return self\n\n def run(self, event):\n if event.args.startswith(\"rxq0 irq\"):\n print(\"Warning: interrupt inside napi\")\n\nclass UnknownState(State):\n def transition(self, event):\n if enteringNapi(self.machine, event):\n return InsideNapi(self.machine)\n elif exitingNapi(self.machine, event):\n return ExitingNapi(self.machine)\n else:\n return self\n\n\nif __name__ == '__main__':\n debug = False\n\n state = UnknownState(Machine())\n\n for line in sys.stdin:\n print(line, end='')\n try:\n event = Event(line)\n except NaE:\n pass\n else:\n if debug:\n pprinter.pprint(event)\n state = state.advance(event)", "diff": "diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c\nindex 8881256..707a525 100644\n--- a/drivers/net/ethernet/intel/e1000e/netdev.c\n+++ b/drivers/net/ethernet/intel/e1000e/netdev.c\n@@ -1952,6 +1952,9 @@ static irqreturn_t e1000_intr_msix_rx(int __always_unused irq, void *data)\n \tstruct net_device *netdev = data;\n \tstruct e1000_adapter *adapter = netdev_priv(netdev);\n \tstruct e1000_ring *rx_ring = adapter->rx_ring;\n+\tstruct e1000_hw *hw = &adapter->hw;\n+\n+\ttrace_printk(\"%s: rxq0 irq ims 0x%08x\\n\", netdev->name, er32(IMS));\n \n \t/* Write the ITR value calculated at the end of the\n \t * previous interrupt.\n@@ -1966,6 +1969,7 @@ static irqreturn_t e1000_intr_msix_rx(int __always_unused irq, void *data)\n \t\tadapter->total_rx_bytes = 0;\n \t\tadapter->total_rx_packets = 0;\n \t\t__napi_schedule(&adapter->napi);\n+\t\ttrace_printk(\"%s: scheduling napi\\n\", netdev->name);\n \t}\n \treturn IRQ_HANDLED;\n }\n@@ -2672,6 +2676,8 @@ static int e1000e_poll(struct napi_struct *napi, int weight)\n \tstruct net_device *poll_dev = adapter->netdev;\n \tint tx_cleaned = 1, work_done = 0;\n \n+\ttrace_printk(\"%s: poll starting ims 0x%08x\\n\", poll_dev->name,\n+\t\t er32(IMS));\n \tadapter = netdev_priv(poll_dev);\n \n \tif (!adapter->msix_entries ||\n@@ -2689,6 +2695,8 @@ static int e1000e_poll(struct napi_struct *napi, int weight)\n \t\t\te1000_set_itr(adapter);\n \t\tnapi_complete_done(napi, work_done);\n \t\tif (!test_bit(__E1000_DOWN, &adapter->state)) {\n+\t\t\ttrace_printk(\"%s: will enable rxq0 irq\\n\",\n+\t\t\t\t poll_dev->name);\n \t\t\tif (adapter->msix_entries)\n \t\t\t\tew32(IMS, adapter->rx_ring->ims_val);\n \t\t\telse\n", "prefixes": [ "0/2" ] }