Skip to contentSkip to conversation

jme: fix irq storm after suspend/resume

PATCH Applied Clemens Buchacher 4 participants 4 messages Oct 22, 2011 – Oct 24, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 jme: fix irq storm after suspend/resume

If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".

Instead, check that the device is up before touching it in the suspend/resume code.

Fixes https://bugzilla.kernel.org/show_bug.cgi?id=39112

---

Unfortunately, bugzilla.kernel.org is still down. There is at least one other person who reported the issue, and I don't have their email address. So for now, I am the only one who tested this fix.

The patch applies to current tip (2efd7c0) of Linus' tree. I also tested it based on v3.0 and it worked the same.

Many thanks to Adrian and Mohammed for helping me debug this issue. See this thread for the history:
http://mid.gmane.org/20110827113253.GA1444@ecki

 drivers/net/jme.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/net/jme.c +6 -0
index 3ac262f..7a8a3b6 100644
@@ -3131,6 +3131,9 @@ jme_suspend(struct device *dev)
 	struct net_device *netdev = pci_get_drvdata(pdev);
 	struct jme_adapter *jme = netdev_priv(netdev);
 
+	if (!netif_running(netdev))
+		return 0;
+
 	atomic_dec(&jme->link_changing);
 
 	netif_device_detach(netdev);
@@ -3171,6 +3174,9 @@ jme_resume(struct device *dev)
 	struct net_device *netdev = pci_get_drvdata(pdev);
 	struct jme_adapter *jme = netdev_priv(netdev);
 
+	if (!netif_running(netdev))
+		return 0;
+
 	jme_clear_pm(jme);
 	jme_phy_on(jme);
 	if (test_bit(JME_FLAG_SSET, &jme->flags))
Signature · 1 line
1.7.7
#1 lore raw
Quoted 4 lines · Clemens Buchacher

If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".

thank you so much for fixing this. incredible persistence from your side!

Quoted 53 lines

Instead, check that the device is up before touching it in the suspend/resume code.

Fixes https://bugzilla.kernel.org/show_bug.cgi?id=39112

---

Unfortunately, bugzilla.kernel.org is still down. There is at least one other person who reported the issue, and I don't have their email address. So for now, I am the only one who tested this fix.

The patch applies to current tip (2efd7c0) of Linus' tree. I also tested it based on v3.0 and it worked the same.

Many thanks to Adrian and Mohammed for helping me debug this issue. See this thread for the history:
 http://mid.gmane.org/20110827113253.GA1444@ecki

 drivers/net/jme.c |    6 ++++++

 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/net/jme.c +6 -1
index 3ac262f..7a8a3b6 100644
@@ -3131,6 +3131,9 @@ jme_suspend(struct device *dev)
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct jme_adapter *jme = netdev_priv(netdev);
 
+       if (!netif_running(netdev))
+               return 0;
+
        atomic_dec(&jme->link_changing);
 
        netif_device_detach(netdev);
@@ -3171,6 +3174,9 @@ jme_resume(struct device *dev)
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct jme_adapter *jme = netdev_priv(netdev);
 
+       if (!netif_running(netdev))
+               return 0;
+
        jme_clear_pm(jme);
        jme_phy_on(jme);
        if (test_bit(JME_FLAG_SSET, &jme->flags))
--

1.7.7

Signature · 1 line
shafi
#2 lore raw
In reply to Clemens Buchacher
Quoted 9 lines · Clemens Buchacher

If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".

Instead, check that the device is up before touching it in the suspend/resume code.

Fixes https://bugzilla.kernel.org/show_bug.cgi?id=39112

Just tested the patch, suspend/resume works well.

Signature · 1 line
Mantas M.
maintainer Applied
#3 lore raw

From: "Mantas M." <[email protected]>
Date: Sat, 22 Oct 2011 19:27:09 +0300

Quoted 6 lines · Clemens Buchacher
Quoted 5 lines

If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".

Quoted 6 lines
Quoted 4 lines

Instead, check that the device is up before touching it in the suspend/resume code.

Fixes https://bugzilla.kernel.org/show_bug.cgi?id=39112

Just tested the patch, suspend/resume works well.

Applied, thanks.