linux-sg2042/sound/pci
Takashi Iwai ab949d5196 ALSA: hda - Fix deadlock of controller device lock at unbinding
Imre Deak reported a deadlock of HD-audio driver at unbinding while
it's still in probing.  Since we probe the codecs asynchronously in a
work, the codec driver probe may still be kicked off while the
controller itself is being unbound.  And, azx_remove() tries to
process all pending tasks via cancel_work_sync() for fixing the other
races (see commit [0b8c82190c12: ALSA: hda - Cancel probe work instead
of flush at remove]), now we may meet a bizarre deadlock:

Unbind snd_hda_intel via sysfs:
  device_release_driver() ->
    device_lock(snd_hda_intel) ->
      azx_remove() ->
        cancel_work_sync(azx_probe_work)

azx_probe_work():
  codec driver probe() ->
     __driver_attach() ->
       device_lock(snd_hda_intel)

This deadlock is caused by the fact that both device_release_driver()
and driver_probe_device() take both the device and its parent locks at
the same time.  The codec device sets the controller device as its
parent, and this lock is taken before the probe() callback is called,
while the controller remove() callback gets called also with the same
lock.

In this patch, as an ugly workaround, we unlock the controller device
temporarily during cancel_work_sync() call.  The race against another
bind call should be still suppressed by the parent's device lock.

Reported-by: Imre Deak <imre.deak@intel.com>
Fixes: 0b8c82190c ("ALSA: hda - Cancel probe work instead of flush at remove")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2017-01-04 11:22:55 +01:00
..
ac97 ALSA: ac97: Fix kernel-doc error with sphinx formatter 2016-11-15 07:28:12 +01:00
ali5451 ALSA: ali5451: Fix out-of-bound position reporting 2016-09-21 14:38:02 +02:00
asihpi ALSA: asihpi: fix kernel memory disclosure 2016-10-18 14:08:25 +02:00
au88x0 ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
aw2 ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
ca0106 ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
cs46xx ALSA: cs46xx: add a new line 2016-12-07 12:35:03 +01:00
cs5535audio ALSA: cs5535audio: fix unused warnings on resume/suspend 2016-12-28 16:05:12 +01:00
ctxfi ALSA: pci: constify local structures 2016-09-12 08:17:19 +02:00
echoaudio ALSA: echoaudio: Fix improper return value in function load_asic 2016-11-29 19:59:57 +01:00
emu10k1 ALSA: emu10k1: Use workqueue instead of kthread for emu1010 fw polling 2016-11-15 08:21:19 +01:00
hda ALSA: hda - Fix deadlock of controller device lock at unbinding 2017-01-04 11:22:55 +01:00
ice1712 ALSA: squash lines for simple wrapper functions 2016-09-07 20:35:29 +02:00
korg1212 ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
lola ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
lx6464es ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
mixart ALSA: mixart: fix a comment typo 2016-12-28 16:11:34 +01:00
nm256 ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
oxygen ALSA: oxygen: constify snd_pcm_ops structures 2016-09-02 11:50:42 +02:00
pcxhr ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
riptide ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
rme9652 ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
trident ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
vx222 ALSA: Include linux/io.h instead of asm/io.h 2015-01-28 16:49:33 +01:00
ymfpci ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
Kconfig ALSA: jack: Allow building the jack layer without input device 2016-02-23 09:03:07 +01:00
Makefile ALSA: Add the driver for Digigram Lola PCI-e boards 2011-05-03 16:31:05 +02:00
ad1889.c ALSA: ad1889: constify snd_pcm_ops structures 2016-09-02 11:50:24 +02:00
ad1889.h
ak4531_codec.c ALSA: pci: Drop superfluous ifdef CONFIG_PROC_FS 2015-05-29 08:00:06 +02:00
als300.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
als4000.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
atiixp.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
atiixp_modem.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
azt3328.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
azt3328.h ALSA: azt3328: fix previous breakage, improve suspend, cleanups 2009-07-15 12:03:26 +02:00
bt87x.c ALSA: bt87x: constify snd_pcm_ops structures 2016-09-02 11:51:03 +02:00
cmipci.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
cs4281.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
cs5530.c ASoC: sb16: Simplify snd_sb16dsp_pcm() 2015-01-02 16:28:35 +01:00
ens1370.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
ens1371.c
es1938.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
es1968.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
fm801.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
intel8x0.c ALSA: intel8x0: Drop superfluous VM checks 2016-04-06 07:46:28 +02:00
intel8x0m.c ALSA: pci: Drop superfluous ifdef CONFIG_PROC_FS 2015-05-29 08:00:06 +02:00
maestro3.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
rme32.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
rme96.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
sis7019.c ALSA: remove deprecated use of pci api 2015-04-16 12:19:52 +02:00
sis7019.h trivial: fix typos s/paramter/parameter/ and s/excute/execute/ in documentation and source comments. 2009-06-12 18:01:46 +02:00
sonicvibes.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
via82xx.c ALSA: pci: don't opencode IS_REACHABLE() 2016-11-13 21:33:41 +01:00
via82xx_modem.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00