linux/sound/pci/hda
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
..
ca0132_regs.h ALSA: hda: ca0132_regs.h: Fix typo in include guard 2014-08-22 11:24:11 +02:00
dell_wmi_helper.c ALSA: hda - Fix a failure of micmute led when having multi adcs 2016-10-12 20:07:25 +02:00
hda_auto_parser.c ALSA: hda: when comparing pin configurations, ignore assoc in addition to seq 2016-12-06 10:06:48 +01:00
hda_auto_parser.h ALSA: hda - Sort input pins depending on amp caps 2014-09-23 15:57:32 +02:00
hda_beep.c ALSA: hda-beep: Update authors dead email address 2015-06-13 09:13:26 +02:00
hda_beep.h ALSA: hda-beep: Update authors dead email address 2015-06-20 09:24:40 +02:00
hda_bind.c ALSA: hda - Fix missing module loading with model=generic option 2016-01-20 15:56:42 +01:00
hda_codec.c ALSA: hda: fix some klockwork scan warnings 2016-06-16 10:10:12 +02:00
hda_codec.h Merge branch 'topic/hda-modalias' into for-next 2015-10-20 10:19:40 +02:00
hda_controller_trace.h ALSA: hda - rename hda_intel_trace.h to hda_controller_trace.h 2015-05-18 10:06:32 +02:00
hda_controller.c ALSA: constify snd_pcm_ops structures 2016-09-02 11:49:10 +02:00
hda_controller.h ALSA - hda: Add support for parsing new HDA capabilities 2016-08-09 08:53:56 +02:00
hda_eld.c ALSA: hda - Use snd_hdac namespace prefix for chmap exported APIs 2016-03-07 15:46:06 +01:00
hda_generic.c Merge branch 'for-next' into for-linus 2016-07-25 17:01:14 +02:00
hda_generic.h ALSA: hda - Make snd_hda_parse_nid_path() local 2015-12-08 11:48:39 +01:00
hda_hwdep.c ALSA: hda - Add card field to hda_codec struct 2015-03-03 11:25:16 +01:00
hda_intel_trace.h ALSA: hda - add hda_intel_trace.h 2015-05-18 10:06:44 +02:00
hda_intel.c ALSA: hda - Fix deadlock of controller device lock at unbinding 2017-01-04 11:22:55 +01:00
hda_intel.h ALSA: hda - Spell vga_switcheroo consistently 2015-10-19 11:00:45 +02:00
hda_jack.c ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
hda_jack.h ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
hda_local.h ALSA: hda: make use of core codec fns 2015-10-08 19:09:36 +02:00
hda_proc.c ALSA: hda/proc - Fix racy string access for power states 2015-08-17 15:12:04 +02:00
hda_sysfs.c ALSA: hda - Fix broken reconfig 2016-05-10 10:30:13 +02:00
hda_tegra.c ALSA: hda/tegra: iomem fixups for sparse warnings 2016-06-22 15:19:10 +02:00
Kconfig ALSA: hda - Clarify CONFIG_SND_HDA_RECONFIG usages 2016-05-09 17:47:37 +02:00
local.h ALSA: hda - Move a part of hda_codec stuff into hdac_device 2015-03-23 13:17:17 +01:00
Makefile ALSA: replace CONFIG_PROC_FS with CONFIG_SND_PROC_FS 2015-05-27 21:25:19 +02:00
patch_analog.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_ca0110.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_ca0132.c ALSA: hda/ca0132 - Add quirk for Alienware 15 R2 2016 2016-11-25 14:17:38 +01:00
patch_cirrus.c ALSA: hda - Keep powering up ADCs on Cirrus codecs 2016-04-19 22:07:50 +02:00
patch_cmedia.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_conexant.c ALSA: hda - Gate the mic jack on HP Z1 Gen3 AiO 2016-12-06 11:55:17 +01:00
patch_hdmi.c drm/i915/dp: DP audio API changes for MST 2016-09-22 09:01:55 -07:00
patch_realtek.c ALSA: hda/realtek - Add new codec ID ALC299 2017-01-04 08:33:26 +01:00
patch_si3054.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_sigmatel.c ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
patch_via.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
thinkpad_helper.c ALSA: hda - add a new condition to check if it is thinkpad 2016-11-10 09:32:55 +01:00