[PATCH] [UBUNTU:sound/pci/{cs46xx, hda}/] Fix race in removing device

crimsun at fungus.sh.nu crimsun at fungus.sh.nu
Fri Jun 2 21:22:32 UTC 2006


Subject: [PATCH] [UBUNTU:sound/pci/{cs46xx,hda}/] Fix race in removing device

UpstreamStatus: Added in upstream alsa-kernel hg changesets
                89652d0c1446 and 609ed891f23e;
                http://hg-mirror.alsa-project.org/alsa-kernel?cmd=changeset;node=89652d0c144633754e168cc075b5a515ce22d0d6;style=raw ,
                http://hg-mirror.alsa-project.org/alsa-kernel?cmd=changeset;node=609ed891f23e1b27945b15c643c3b72e427fbfd4;style=raw

Takashi Iwai committed the above fixes to avoid invalid accesses in
shared irq after a device is removed.

cf. https://bugzilla.novell.com/show_bug.cgi?id=167869 [requires login]

Signed-off-by: Daniel T Chen <crimsun at ubuntu.com>

---

 sound/pci/cs46xx/cs46xx_lib.c |    5 +++--
 sound/pci/hda/hda_intel.c     |    4 ++--
 2 files changed, 5 insertions(+), 4 deletions(-)

0a5208e0ccc60341e9eabedf671320c0c1df64f4
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c
index 9b8af5b..b89450f 100644
--- a/sound/pci/cs46xx/cs46xx_lib.c
+++ b/sound/pci/cs46xx/cs46xx_lib.c
@@ -2902,14 +2902,15 @@ static int snd_cs46xx_free(cs46xx_t *chi
 	if (chip->region.idx[0].resource)
 		snd_cs46xx_hw_stop(chip);
 
+	if (chip->irq >= 0)
+		free_irq(chip->irq, (void *)chip);
+
 	for (idx = 0; idx < 5; idx++) {
 		snd_cs46xx_region_t *region = &chip->region.idx[idx];
 		if (region->remap_addr)
 			iounmap(region->remap_addr);
 		release_and_free_resource(region->resource);
 	}
-	if (chip->irq >= 0)
-		free_irq(chip->irq, (void *)chip);
 
 	if (chip->active_ctrl)
 		chip->active_ctrl(chip, -chip->amplifier);
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index ec5708e..829d561 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1395,10 +1395,10 @@ static int azx_free(azx_t *chip)
 		msleep(1);
 	}
 
-	if (chip->remap_addr)
-		iounmap(chip->remap_addr);
 	if (chip->irq >= 0)
 		free_irq(chip->irq, (void*)chip);
+	if (chip->remap_addr)
+		iounmap(chip->remap_addr);
 
 	if (chip->bdl.area)
 		snd_dma_free_pages(&chip->bdl);
-- 
1.1.3


-- 
Daniel T. Chen            crimsun at ubuntu.com
GPG key:   www.sh.nu/~crimsun/pubkey.gpg.asc
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20060602/2ac48f65/attachment.sig>


More information about the kernel-team mailing list