Re: 2.6.17-rc5-mm3

From: Takashi Iwai
Date: Tue Jun 06 2006 - 06:14:57 EST


At Mon, 5 Jun 2006 13:06:26 -0700,
Andrew Morton wrote:
>
> On Mon, 5 Jun 2006 15:48:45 -0400
> Dave Jones <davej@xxxxxxxxxx> wrote:
>
> > On Sat, Jun 03, 2006 at 11:20:04PM -0700, Andrew Morton wrote:
> > >
> > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.17-rc5/2.6.17-rc5-mm3/
> > >
> > > - Lots of PCI and USB updates
> > >
> > > - The various lock validator, stack backtracing and IRQ management problems
> > > are converging, but we're not quite there yet.
> >
> > Thought I'd try my bi-annual "poke at -mm". Results were less
> > than spectacular.
> >
> > http://www.codemonkey.org.uk/junk/DSC00347.JPG
> > First the sound driver oopsed.
>
> That's a bug in sound/pci/cs4281.c.
>
> There's a debug patch in -mm
> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.17-rc5/2.6.17-rc5-mm3/broken-out/debug-shared-irqs.patch
> which trips up drivers which request an IRQ before their IRQ handler is
> ready to accept IRQs (they'll crash in real life if the IRQ is shared).

I guess that the bug in cs4281 is ioremap too lately issued after the
registration of irq handler.

Does the patch below fix the problem?

Takashi


[PATCH] Fix possible Oops in cs4281 irq handler

Call ioremap before request_irq for avoiding possible Oops
in cs4281 driver.

Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
---
diff -r 84d14cbbd713 sound/pci/cs4281.c
--- a/sound/pci/cs4281.c Fri Jun 02 09:15:44 2006 +0200
+++ b/sound/pci/cs4281.c Tue Jun 06 12:11:56 2006 +0200
@@ -1379,6 +1379,13 @@ static int __devinit snd_cs4281_create(s
chip->ba0_addr = pci_resource_start(pci, 0);
chip->ba1_addr = pci_resource_start(pci, 1);

+ chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0));
+ chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1));
+ if (!chip->ba0 || !chip->ba1) {
+ snd_cs4281_free(chip);
+ return -ENOMEM;
+ }
+
if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ,
"CS4281", chip)) {
snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
@@ -1387,13 +1394,6 @@ static int __devinit snd_cs4281_create(s
}
chip->irq = pci->irq;

- chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0));
- chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1));
- if (!chip->ba0 || !chip->ba1) {
- snd_cs4281_free(chip);
- return -ENOMEM;
- }
-
tmp = snd_cs4281_chip_init(chip);
if (tmp) {
snd_cs4281_free(chip);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/