[PATCH 24/24] snd/hda: Protect concurrent display_power_status with a mutex
Chris Wilson
chris at chris-wilson.co.uk
Mon Jan 14 08:52:01 UTC 2019
Just in case the audio linkage is swapped between components during the
runtime pm sequence, we need to protect the rpm tracking with a mutex.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Takashi Iwai <tiwai at suse.de>
Cc: Jani Nikula <jani.nikula at intel.com>
---
include/sound/hdaudio.h | 3 ++-
sound/hda/hdac_component.c | 16 +++++++++++++---
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
index a438ec8e535b..497335b24e18 100644
--- a/include/sound/hdaudio.h
+++ b/include/sound/hdaudio.h
@@ -366,8 +366,9 @@ struct hdac_bus {
/* DRM component interface */
struct drm_audio_component *audio_component;
- long display_power_status;
+ unsigned long display_power_status;
unsigned long display_power_active;
+ struct mutex display_power_lock;
/* parameters required for enhanced capabilities */
int num_streams;
diff --git a/sound/hda/hdac_component.c b/sound/hda/hdac_component.c
index 2702548b788a..f40def1e2ca0 100644
--- a/sound/hda/hdac_component.c
+++ b/sound/hda/hdac_component.c
@@ -69,13 +69,15 @@ void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable)
dev_dbg(bus->dev, "display power %s\n",
enable ? "enable" : "disable");
+
+ mutex_lock(&bus->display_power_lock);
if (enable)
- set_bit(idx, &bus->display_power_status);
+ __set_bit(idx, &bus->display_power_status);
else
- clear_bit(idx, &bus->display_power_status);
+ __clear_bit(idx, &bus->display_power_status);
if (!acomp || !acomp->ops)
- return;
+ goto unlock;
if (bus->display_power_status) {
if (!bus->display_power_active) {
@@ -98,6 +100,9 @@ void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable)
bus->display_power_active = 0;
}
}
+
+unlock:
+ mutex_unlock(&bus->display_power_lock);
}
EXPORT_SYMBOL_GPL(snd_hdac_display_power);
@@ -290,6 +295,9 @@ int snd_hdac_acomp_init(struct hdac_bus *bus,
GFP_KERNEL);
if (!acomp)
return -ENOMEM;
+
+ mutex_init(&bus->display_power_lock);
+
acomp->audio_ops = aops;
bus->audio_component = acomp;
devres_add(dev, acomp);
@@ -336,6 +344,8 @@ int snd_hdac_acomp_exit(struct hdac_bus *bus)
bus->display_power_active = 0;
bus->display_power_status = 0;
+ mutex_destroy(&bus->display_power_lock);
+
component_master_del(dev, &hdac_component_master_ops);
bus->audio_component = NULL;
--
2.20.1
More information about the Intel-gfx-trybot
mailing list