This reverts commit f514248727606b9087bc38a284ff686e0093abf1.

The original patch attempted to acquire the card->controls_rwsem lock in
fsl_xcvr_mode_put(). However, this function is called from the upper ALSA
core function snd_ctl_elem_write(), which already holds the write lock on
controls_rwsem for the whole put operation. So there is no need to simply
hold the lock for fsl_xcvr_activate_ctl() again.

Acquiring the read lock while holding the write lock in the same thread
results in a deadlock and a hung task, as reported by Alexander Stein.

Reported-by: Alexander Stein <[email protected]>
Closes: https://lore.kernel.org/linux-sound/5056506.GXAFRqVoOG@steina-w/
Signed-off-by: Ziyi Guo <[email protected]>
---
 sound/soc/fsl/fsl_xcvr.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/sound/soc/fsl/fsl_xcvr.c b/sound/soc/fsl/fsl_xcvr.c
index 0b9dd64b9a82..a268fb81a2f8 100644
--- a/sound/soc/fsl/fsl_xcvr.c
+++ b/sound/soc/fsl/fsl_xcvr.c
@@ -223,13 +223,10 @@ static int fsl_xcvr_mode_put(struct snd_kcontrol 
*kcontrol,
 
        xcvr->mode = snd_soc_enum_item_to_val(e, item[0]);
 
-       down_read(&card->snd_card->controls_rwsem);
        fsl_xcvr_activate_ctl(dai, fsl_xcvr_arc_mode_kctl.name,
                              (xcvr->mode == FSL_XCVR_MODE_ARC));
        fsl_xcvr_activate_ctl(dai, fsl_xcvr_earc_capds_kctl.name,
                              (xcvr->mode == FSL_XCVR_MODE_EARC));
-       up_read(&card->snd_card->controls_rwsem);
-       
        /* Allow playback for SPDIF only */
        rtd = snd_soc_get_pcm_runtime(card, card->dai_link);
        rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count =
-- 
2.34.1


Reply via email to