diff options
author | Takashi Iwai | 2006-06-01 14:47:29 +0200 |
---|---|---|
committer | Jaroslav Kysela | 2006-06-22 21:34:08 +0200 |
commit | 0a50d2b2951cb7ae12726814f9a198e1c699aa0b (patch) | |
tree | 38197874a92ead9bf652732d2dc03ecafe3bfdaf /sound/pci | |
parent | [ALSA] hda-intel - Fix race in remove (diff) | |
download | kernel-qcow2-linux-0a50d2b2951cb7ae12726814f9a198e1c699aa0b.tar.gz kernel-qcow2-linux-0a50d2b2951cb7ae12726814f9a198e1c699aa0b.tar.xz kernel-qcow2-linux-0a50d2b2951cb7ae12726814f9a198e1c699aa0b.zip |
[ALSA] Fix possible races in PCI driver removal
Call free_irq() before releasing others to avoid races when
shared irq is issued.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/cs46xx/cs46xx_lib.c | 5 | ||||
-rw-r--r-- | sound/pci/riptide/riptide.c | 4 |
2 files changed, 5 insertions, 4 deletions
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 69dbf542a6de..5c2114439204 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c @@ -2877,14 +2877,15 @@ static int snd_cs46xx_free(struct snd_cs46xx *chip) if (chip->region.idx[0].resource) snd_cs46xx_hw_stop(chip); + if (chip->irq >= 0) + free_irq(chip->irq, chip); + for (idx = 0; idx < 5; idx++) { struct snd_cs46xx_region *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, chip); if (chip->active_ctrl) chip->active_ctrl(chip, -chip->amplifier); diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index c27cd4999777..5618ec9740bd 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -1836,11 +1836,11 @@ static int snd_riptide_free(struct snd_riptide *chip) UNSET_GRESET(cif->hwport); kfree(chip->cif); } + if (chip->irq >= 0) + free_irq(chip->irq, chip); if (chip->fw_entry) release_firmware(chip->fw_entry); release_and_free_resource(chip->res_port); - if (chip->irq >= 0) - free_irq(chip->irq, chip); kfree(chip); return 0; } |