summaryrefslogtreecommitdiff
path: root/sound/hda/hdac_bus.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-04-10 12:49:55 +0200
committerTakashi Iwai <tiwai@suse.de>2019-04-10 15:23:36 +0200
commitd7a181da2dfa3190487c446042ba01e07d851c74 (patch)
treec2c281018d0a0dd56e792e0fca49af8313d5a30b /sound/hda/hdac_bus.c
parentcae30527901d9590db0e12ace994c1d58bea87fd (diff)
ALSA: hda: Fix racy display power access
snd_hdac_display_power() doesn't handle the concurrent calls carefully enough, and it may lead to the doubly get_power or put_power calls, when a runtime PM and an async work get called in racy way. This patch addresses it by reusing the bus->lock mutex that has been used for protecting the link state change in ext bus code, so that it can protect against racy display state changes. The initialization of bus->lock was moved from snd_hdac_ext_bus_init() to snd_hdac_bus_init() as well accordingly. Testcase: igt/i915_pm_rpm/module-reload #glk-dsi Reported-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Imre Deak <imre.deak@intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/hda/hdac_bus.c')
-rw-r--r--sound/hda/hdac_bus.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/sound/hda/hdac_bus.c b/sound/hda/hdac_bus.c
index 012305177f68..ad8eee08013f 100644
--- a/sound/hda/hdac_bus.c
+++ b/sound/hda/hdac_bus.c
@@ -38,6 +38,7 @@ int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
INIT_WORK(&bus->unsol_work, snd_hdac_bus_process_unsol_events);
spin_lock_init(&bus->reg_lock);
mutex_init(&bus->cmd_mutex);
+ mutex_init(&bus->lock);
bus->irq = -1;
return 0;
}