| From d21b96c8ed2aea7e6b7bf4735e1d2503cfbf4072 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Thu, 19 Nov 2020 13:14:40 +0100 |
| Subject: ALSA: mixart: Fix mutex deadlock |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit d21b96c8ed2aea7e6b7bf4735e1d2503cfbf4072 upstream. |
| |
| The code change for switching to non-atomic mode brought the |
| unexpected mutex deadlock in get_msg(). It converted the spinlock |
| with the existing mutex, but there were calls with the already holding |
| the mutex. Since the only place that needs the extra lock is the code |
| path from snd_mixart_send_msg(), remove the mutex lock in get_msg() |
| and apply in the caller side for fixing the mutex deadlock. |
| |
| Fixes: 8d3a8b5cb57d ("ALSA: mixart: Use nonatomic PCM ops") |
| Reported-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20201119121440.18945-1-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/mixart/mixart_core.c | 5 ++--- |
| 1 file changed, 2 insertions(+), 3 deletions(-) |
| |
| --- a/sound/pci/mixart/mixart_core.c |
| +++ b/sound/pci/mixart/mixart_core.c |
| @@ -83,7 +83,6 @@ static int get_msg(struct mixart_mgr *mg |
| unsigned int i; |
| #endif |
| |
| - mutex_lock(&mgr->msg_lock); |
| err = 0; |
| |
| /* copy message descriptor from miXart to driver */ |
| @@ -132,8 +131,6 @@ static int get_msg(struct mixart_mgr *mg |
| writel_be(headptr, MIXART_MEM(mgr, MSG_OUTBOUND_FREE_HEAD)); |
| |
| _clean_exit: |
| - mutex_unlock(&mgr->msg_lock); |
| - |
| return err; |
| } |
| |
| @@ -271,7 +268,9 @@ int snd_mixart_send_msg(struct mixart_mg |
| resp.data = resp_data; |
| resp.size = max_resp_size; |
| |
| + mutex_lock(&mgr->msg_lock); |
| err = get_msg(mgr, &resp, msg_frame); |
| + mutex_unlock(&mgr->msg_lock); |
| |
| if( request->message_id != resp.message_id ) |
| dev_err(&mgr->pci->dev, "RESPONSE ERROR!\n"); |