[patch] MSI-X: fix resume crash

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Ingo Molnar
Date: Wednesday, March 28, 2007 - 6:06 am

* Ingo Molnar <mingo@elte.hu> wrote:


Eric's patch seems to have done the trick on my T60: i've done 10 
suspend+resumes and each worked fine. I've tidied up the description 
part of Eric's patch a bit for upstream application - find it below.

	Ingo

---------------------->
Subject: [patch] MSI-X: fix resume crash
From: Eric W. Biederman <ebiederm@xmission.com>

I think the right solution is to simply make pci_enable_device just flip 
enable bits and move the rest of the work someplace else.

However a thorough cleanup is a little extreme for this point in the 
release cycle, so I think a quick hack that makes the code not stomp the 
irq when msi irq's are enabled should be the first fix.  Then we can 
later make the code not change the irqs at all.

Tony, Len the way pci_disable_device is being used in a suspend/resume 
path by a few drivers is completely incompatible with the way irqs are 
allocated on ia64.  In particular people the following sequence occurs 
in several drivers.

probe:
  pci_enable_device(pdev);
  request_irq(pdev->irq);
suspend:
  pci_disable_device(pdev);
resume:
  pci_enable_device(pdev);
remove:
  free_irq(pdev->irq);
  pci_disable_device(pdev);

What I'm proposing we do is move the irq allocation code out of 
pci_enable_device and the irq freeing code out of pci_disable_device in 
the future.  If we move ia64 to a model where the irq number equal the 
gsi like we have for x86_64 and are in the middle of for i386 that 
should be pretty straight forward.  It would even be relatively simple 
to delay vector allocation in that context until request_irq, if we 
needed the delayed allocation benefit.  Do you two have any problems 
with moving in that direction?

If fixing the arch code is unacceptable for some reason I'm not aware of 
we need to audit the 10-20 drivers that call pci_disable_device in their 
suspend/resume processing and ensure that they have freed all of the 
irqs before that point.  Given that I have bug reports on the msi path I 
know that isn't true.

From: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 arch/cris/arch-v32/drivers/pci/bios.c |    4 +++-
 arch/frv/mb93090-mb00/pci-vdk.c       |    3 ++-
 arch/i386/pci/common.c                |    6 ++++--
 arch/ia64/pci/pci.c                   |    8 ++++++--
 4 files changed, 15 insertions(+), 6 deletions(-)

Index: linux/arch/cris/arch-v32/drivers/pci/bios.c
===================================================================
--- linux.orig/arch/cris/arch-v32/drivers/pci/bios.c
+++ linux/arch/cris/arch-v32/drivers/pci/bios.c
@@ -100,7 +100,9 @@ int pcibios_enable_device(struct pci_dev
 	if ((err = pcibios_enable_resources(dev, mask)) < 0)
 		return err;
 
-	return pcibios_enable_irq(dev);
+	if (!dev->msi_enabled)
+		pcibios_enable_irq(dev);
+	return 0;
 }
 
 int pcibios_assign_resources(void)
Index: linux/arch/frv/mb93090-mb00/pci-vdk.c
===================================================================
--- linux.orig/arch/frv/mb93090-mb00/pci-vdk.c
+++ linux/arch/frv/mb93090-mb00/pci-vdk.c
@@ -466,6 +466,7 @@ int pcibios_enable_device(struct pci_dev
 
 	if ((err = pcibios_enable_resources(dev, mask)) < 0)
 		return err;
-	pcibios_enable_irq(dev);
+	if (!dev->msi_enabled)
+		pcibios_enable_irq(dev);
 	return 0;
 }
Index: linux/arch/i386/pci/common.c
===================================================================
--- linux.orig/arch/i386/pci/common.c
+++ linux/arch/i386/pci/common.c
@@ -434,11 +434,13 @@ int pcibios_enable_device(struct pci_dev
 	if ((err = pcibios_enable_resources(dev, mask)) < 0)
 		return err;
 
-	return pcibios_enable_irq(dev);
+	if (!dev->msi_enabled)
+		return pcibios_enable_irq(dev);
+	return 0;
 }
 
 void pcibios_disable_device (struct pci_dev *dev)
 {
-	if (pcibios_disable_irq)
+	if (!dev->msi_enabled && pcibios_disable_irq)
 		pcibios_disable_irq(dev);
 }
Index: linux/arch/ia64/pci/pci.c
===================================================================
--- linux.orig/arch/ia64/pci/pci.c
+++ linux/arch/ia64/pci/pci.c
@@ -557,14 +557,18 @@ pcibios_enable_device (struct pci_dev *d
 	if (ret < 0)
 		return ret;
 
-	return acpi_pci_irq_enable(dev);
+	if (!dev->msi_enabled)
+		return acpi_pci_irq_enable(dev);
+	return 0;
 }
 
 void
 pcibios_disable_device (struct pci_dev *dev)
 {
 	BUG_ON(atomic_read(&dev->enable_cnt));
-	acpi_pci_irq_disable(dev);
+	if (!dev->msi_enabled)
+		acpi_pci_irq_disable(dev);
+	return 0;
 }
 
 void
-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Linux 2.6.21-rc5, Linus Torvalds, (Sun Mar 25, 4:08 pm)
Re: Linux 2.6.21-rc5, Ayaz Abdulla, (Mon Mar 26, 1:17 am)
Re: Linux 2.6.21-rc5, Ingo Molnar, (Mon Mar 26, 1:31 am)
Re: Linux 2.6.21-rc5, Ingo Molnar, (Mon Mar 26, 1:39 am)
Re: Linux 2.6.21-rc5, Thomas Gleixner, (Mon Mar 26, 1:55 am)
-rc5: e1000 resume weirdness, Ingo Molnar, (Mon Mar 26, 3:11 am)
Re: Linux 2.6.21-rc5, Bob Tracy, (Mon Mar 26, 5:25 am)
Re: Linux 2.6.21-rc5, Thomas Gleixner, (Mon Mar 26, 5:30 am)
Re: -rc5: e1000 resume weirdness, Kok, Auke, (Mon Mar 26, 8:39 am)
Re: -rc5: e1000 resume weirdness, Jesse Brandeburg, (Mon Mar 26, 8:50 am)
Re: -rc5: e1000 resume weirdness, Kok, Auke, (Mon Mar 26, 8:55 am)
Re: -rc5: e1000 resume weirdness, Ingo Molnar, (Mon Mar 26, 10:39 am)
Re: 2.6.21-rc5: maxcpus=1 crash in cpufreq: kernel BUG at ..., Venki Pallipadi, (Mon Mar 26, 11:12 am)
Re: 2.6.21-rc5: maxcpus=1 crash in cpufreq: kernel BUG at ..., Venki Pallipadi, (Mon Mar 26, 12:03 pm)
[1/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Mon Mar 26, 6:59 pm)
[2/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Mon Mar 26, 6:59 pm)
[3/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Mon Mar 26, 6:59 pm)
[4/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Mon Mar 26, 6:59 pm)
[5/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Mon Mar 26, 6:59 pm)
ATA ACPI (was Re: Linux 2.6.21-rc5), Jeff Garzik, (Mon Mar 26, 10:51 pm)
Re: ATA ACPI (was Re: Linux 2.6.21-rc5), Tejun Heo, (Mon Mar 26, 10:54 pm)
Re: Linux 2.6.21-rc5, Andrew Morton, (Mon Mar 26, 11:17 pm)
Re: Linux 2.6.21-rc5, Greg KH, (Mon Mar 26, 11:20 pm)
[PATCH] i386: Fix bogus return value in hpet_next_event(), Thomas Gleixner, (Tue Mar 27, 12:08 am)
Re: [4/5] 2.6.21-rc5: known regressions, Marcus Better, (Tue Mar 27, 1:00 am)
Re: Linux 2.6.21-rc5, Takashi Iwai, (Tue Mar 27, 2:49 am)
Re: [4/5] 2.6.21-rc5: known regressions, Rafael J. Wysocki, (Tue Mar 27, 3:09 am)
Re: Linux 2.6.21-rc5, Andi Kleen, (Tue Mar 27, 5:25 am)
Re: Linux 2.6.21-rc5, Dmitry Torokhov, (Tue Mar 27, 5:43 am)
Re: [4/5] 2.6.21-rc5: known regressions, Eric W. Biederman, (Tue Mar 27, 6:25 am)
Re: Linux 2.6.21-rc5, Andrew Morton, (Tue Mar 27, 9:33 am)
Re: Linux 2.6.21-rc5, Jesse Barnes, (Tue Mar 27, 9:49 am)
Re: [4/5] 2.6.21-rc5: known regressions, Marcus Better, (Tue Mar 27, 9:53 am)
Re: ATA ACPI (was Re: Linux 2.6.21-rc5), Linus Torvalds, (Tue Mar 27, 10:07 am)
Re: Linux 2.6.21-rc5, Michal Piotrowski, (Tue Mar 27, 11:34 am)
Re: ATA ACPI (was Re: Linux 2.6.21-rc5), Jeff Garzik, (Tue Mar 27, 11:48 am)
Re: Linux 2.6.21-rc5, Michal Piotrowski, (Tue Mar 27, 11:53 am)
Re: [4/5] 2.6.21-rc5: known regressions, Eric W. Biederman, (Tue Mar 27, 1:50 pm)
Re: ATA ACPI (was Re: Linux 2.6.21-rc5), Pavel Machek, (Tue Mar 27, 2:32 pm)
Re: [4/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Tue Mar 27, 3:29 pm)
Re: Linux 2.6.21-rc5, Pavel Machek, (Tue Mar 27, 3:29 pm)
Re: [4/5] 2.6.21-rc5: known regressions, Thomas Meyer, (Tue Mar 27, 3:45 pm)
Re: Linux 2.6.21-rc5, Michal Piotrowski, (Tue Mar 27, 3:55 pm)
Re: ATA ACPI (was Re: Linux 2.6.21-rc5), Tejun Heo, (Wed Mar 28, 2:51 am)
Re: [4/5] 2.6.21-rc5: known regressions, Ingo Molnar, (Wed Mar 28, 5:19 am)
Re: [4/5] 2.6.21-rc5: known regressions, Ingo Molnar, (Wed Mar 28, 5:41 am)
Re: [4/5] 2.6.21-rc5: known regressions, Ingo Molnar, (Wed Mar 28, 6:03 am)
[patch] MSI-X: fix resume crash, Ingo Molnar, (Wed Mar 28, 6:06 am)
Re: [patch] MSI-X: fix resume crash, Eric W. Biederman, (Wed Mar 28, 6:31 am)
Re: [patch] MSI-X: fix resume crash, Ingo Molnar, (Wed Mar 28, 6:36 am)
Re: Linux 2.6.21-rc5, Andi Kleen, (Wed Mar 28, 7:30 am)
Re: Linux 2.6.21-rc5, Michal Piotrowski, (Wed Mar 28, 7:56 am)
Re: Linux 2.6.21-rc5, Jiri Kosina, (Wed Mar 28, 9:12 am)
Re: Linux 2.6.21-rc5, Michal Piotrowski, (Wed Mar 28, 9:51 am)
Re: Linux 2.6.21-rc5, Linus Torvalds, (Wed Mar 28, 10:56 am)
Re: [1/5] 2.6.21-rc5: known regressions, Kok, Auke, (Wed Mar 28, 11:54 am)
Re: [1/5] 2.6.21-rc5: known regressions, Ingo Molnar, (Wed Mar 28, 12:23 pm)
Re: [2/5] 2.6.21-rc5: known regressions, Laurent Riffard, (Wed Mar 28, 12:46 pm)
Re: Linux 2.6.21-rc5, Tilman Schmidt, (Wed Mar 28, 3:32 pm)
Re: [patch] MSI-X: fix resume crash, Len Brown, (Wed Mar 28, 9:30 pm)
Re: [patch] MSI-X: fix resume crash, Eric W. Biederman, (Wed Mar 28, 9:57 pm)
Re: [2/5] 2.6.21-rc5: known regressions, Fabio Comolli, (Thu Mar 29, 12:02 pm)
Re: [1/5] 2.6.21-rc5: known regressions, Adrian Bunk, (Fri Mar 30, 11:04 am)
[1/4] 2.6.21-rc5: known regressions (v2), Adrian Bunk, (Fri Mar 30, 2:32 pm)
[2/4] 2.6.21-rc5: known regressions (v2), Adrian Bunk, (Fri Mar 30, 2:32 pm)
[3/4] 2.6.21-rc5: known regressions (v2), Adrian Bunk, (Fri Mar 30, 2:32 pm)
Re: [1/4] 2.6.21-rc5: known regressions (v2), Greg KH, (Fri Mar 30, 2:38 pm)
[4/4] 2.6.21-rc5: known regressions (v2), Adrian Bunk, (Fri Mar 30, 2:49 pm)
Re: [1/4] 2.6.21-rc5: known regressions (v2), Michal Jaegermann, (Fri Mar 30, 5:23 pm)
Re: [4/4] 2.6.21-rc5: known regressions (v2), Jeff Chua, (Fri Mar 30, 7:41 pm)
Re: [3/4] 2.6.21-rc5: known regressions (v2), Jeff Chua, (Fri Mar 30, 7:52 pm)
Re: [3/4] 2.6.21-rc5: known regressions (v2), Adrian Bunk, (Fri Mar 30, 8:16 pm)
Re: [4/4] 2.6.21-rc5: known regressions (v2), Frédéric, (Fri Mar 30, 11:44 pm)
Re: [3/4] 2.6.21-rc5: known regressions (v2), Jens Axboe, (Sat Mar 31, 4:08 am)
Re: [1/4] 2.6.21-rc5: known regressions (v2), Adrian Bunk, (Sat Mar 31, 8:01 am)
Re: [1/4] 2.6.21-rc5: known regressions (v2), Michal Jaegermann, (Sat Mar 31, 9:42 am)
[patch] driver core: fix built-in drivers sysfs links, Ingo Molnar, (Sat Mar 31, 9:51 am)
2.6.21-rc5: known regressions with patches (v2), Adrian Bunk, (Sat Mar 31, 11:19 am)
Re: [3/4] 2.6.21-rc5: known regressions (v2), Jeremy Fitzhardinge, (Sat Mar 31, 10:39 pm)
Re: [4/4] 2.6.21-rc5: known regressions (v2), Michael S. Tsirkin, (Sun Apr 1, 12:04 am)
Re: [4/4] 2.6.21-rc5: known regressions (v2), Michael S. Tsirkin, (Sun Apr 1, 1:37 pm)
[patch] forcedeth: improve NAPI logic, Ingo Molnar, (Mon Apr 2, 4:56 am)
Re: [3/4] 2.6.21-rc5: known regressions (v2), Michal Piotrowski, (Fri Apr 13, 9:32 am)