Browse Source

[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>
Takashi Iwai 19 years ago
parent
commit
0a50d2b295
2 changed files with 5 additions and 4 deletions
  1. 3 2
      sound/pci/cs46xx/cs46xx_lib.c
  2. 2 2
      sound/pci/riptide/riptide.c

+ 3 - 2
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);

+ 2 - 2
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;
 }