Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 May 2026 13:02:17 +0000
From:      Christos Margiolis <christos@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: fc9dc8482396 - main - snd_uaudio: Lock usbd_transfer_start() in uaudio_mixer_ctl_set()
Message-ID:  <6a183cd9.47551.25b33885@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=fc9dc848239652ec1e4135adb4833a5f002cef0f

commit fc9dc848239652ec1e4135adb4833a5f002cef0f
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2026-05-28 09:31:52 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2026-05-28 13:02:01 +0000

    snd_uaudio: Lock usbd_transfer_start() in uaudio_mixer_ctl_set()
    
    This section would be previously locked by sound(4)'s mixer lock (see
    e87654db5a09 ("snd_uaudio: Stop using mixer_get_lock()")), but
    snd_uaudio(4) no longer uses it. This particular code path was missed
    during testing, because my sound card does not reach it.
    
    Fixes:          9a00e0b8ca56 ("snd_uaudio: Do not use snd_mixer->lock as mixer_lock")
    Reported by:    netchild
    Tested by:      netchild
    Sponsored by:   The FreeBSD Foundation
    MFC after:      6 days
---
 sys/dev/sound/usb/uaudio.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 27d5009da4fa..eedd52774b70 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -5386,8 +5386,8 @@ uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int val)
 }
 
 static void
-uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
-    uint8_t chan, int val)
+uaudio_mixer_ctl_set(struct uaudio_softc *sc, unsigned index,
+    struct uaudio_mixer_node *mc, uint8_t chan, int val)
 {
 	val = uaudio_mixer_bsd2value(mc, val);
 
@@ -5396,7 +5396,9 @@ uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
 
 	/* start the transfer, if not already started */
 
+	mtx_lock(&sc->sc_child[index].mixer_lock);
 	usbd_transfer_start(sc->sc_mixer_xfer[0]);
+	mtx_unlock(&sc->sc_child[index].mixer_lock);
 }
 
 static void
@@ -5482,7 +5484,7 @@ uaudio_mixer_set(struct uaudio_softc *sc, struct snd_mixer *m,
 	for (mc = sc->sc_mixer_root; mc != NULL; mc = mc->next) {
 		if (mc->ctl == type) {
 			for (chan = 0; chan < mc->nchan; chan++) {
-				uaudio_mixer_ctl_set(sc, mc, chan,
+				uaudio_mixer_ctl_set(sc, index, mc, chan,
 				    chan == 0 ? left : right);
 			}
 		}
@@ -5523,7 +5525,7 @@ uaudio_mixer_setrecsrc(struct uaudio_softc *sc, struct snd_mixer *m, uint32_t sr
 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
 				if (temp != (1U << mc->slctrtype[i - 1]))
 					continue;
-				uaudio_mixer_ctl_set(sc, mc, 0, i);
+				uaudio_mixer_ctl_set(sc, index, mc, 0, i);
 				break;
 			}
 		}


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a183cd9.47551.25b33885>