| From b51abed8355e5556886623b2772fa6b7598d2282 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Thu, 29 Nov 2018 08:02:49 +0100 |
| Subject: ALSA: pcm: Call snd_pcm_unlink() conditionally at closing |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit b51abed8355e5556886623b2772fa6b7598d2282 upstream. |
| |
| Currently the PCM core calls snd_pcm_unlink() always unconditionally |
| at closing a stream. However, since snd_pcm_unlink() invokes the |
| global rwsem down, the lock can be easily contended. More badly, when |
| a thread runs in a high priority RT-FIFO, it may stall at spinning. |
| |
| Basically the call of snd_pcm_unlink() is required only for the linked |
| streams that are already rare occasion. For normal use cases, this |
| code path is fairly superfluous. |
| |
| As an optimization (and also as a workaround for the RT problem |
| above in normal situations without linked streams), this patch adds a |
| check before calling snd_pcm_unlink() and calls it only when needed. |
| |
| Reported-by: Chanho Min <chanho.min@lge.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/core/pcm_native.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/sound/core/pcm_native.c |
| +++ b/sound/core/pcm_native.c |
| @@ -2193,7 +2193,8 @@ int snd_pcm_hw_constraints_complete(stru |
| |
| static void pcm_release_private(struct snd_pcm_substream *substream) |
| { |
| - snd_pcm_unlink(substream); |
| + if (snd_pcm_stream_linked(substream)) |
| + snd_pcm_unlink(substream); |
| } |
| |
| void snd_pcm_release_substream(struct snd_pcm_substream *substream) |