linux_dsm_epyc7002/sound
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 [0b8c82190c: 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
..
aoa powerpc updates for 4.9 2016-10-07 20:19:31 -07:00
arm ALSA: arm: Fix empty menuconfig SND_ARM 2016-08-01 16:07:53 +02:00
atmel
core ktime: Get rid of the union 2016-12-25 17:21:22 +01:00
drivers ktime: Cleanup ktime_set() usage 2016-12-25 17:21:22 +01:00
firewire Merge branch 'for-linus' into for-next 2017-01-03 11:39:30 +01:00
hda clocksource: Use a plain u64 instead of cycle_t 2016-12-25 11:04:12 +01:00
i2c ALSA: ak4114: remove redundant check on err being < 0 2016-07-12 12:28:04 +02:00
isa ALSA: adlib: Utilize the module_isa_driver macro 2016-06-01 07:35:52 +02:00
mips ALSA: Remove deprecated AU1X00 AC97 driver 2016-02-08 08:17:15 +01:00
oss Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
parisc
pci ALSA: hda - Fix deadlock of controller device lock at unbinding 2017-01-04 11:22:55 +01:00
pcmcia
ppc powerpc updates for 4.9 2016-10-07 20:19:31 -07:00
sh ktime: Cleanup ktime_set() usage 2016-12-25 17:21:22 +01:00
soc sound updates for 4.10-rc1 2016-12-14 11:14:28 -08:00
sparc dbri: move dereference after check for NULL 2016-12-06 12:18:22 -05:00
spi ALSA: at73c213: manage SSC clock 2016-01-20 09:59:27 +01:00
synth ALSA: synth: use designated initializers 2016-12-28 16:06:16 +01:00
usb ALSA: usb-audio: Support both DSD LE/BE Amanero firmware versions 2016-12-28 16:07:11 +01:00
ac97_bus.c ASoC: Updates for v4.3 2015-08-31 16:25:22 +02:00
Kconfig
last.c
Makefile sound: oss: Use kernel_read_file_from_path() for mod_firmware_load() 2016-07-26 10:38:03 +02:00
sound_core.c sound: fix check for error condition of register_chrdev() 2015-11-07 11:14:30 +01:00