Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 03 Jun 2026 08:23:27 +0000
From:      Christos Margiolis <christos@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: d608731d556d - stable/15 - snd_uaudio: Do not use snd_mixer->lock as mixer_lock
Message-ID:  <6a1fe47f.3b73e.60092e2@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by christos:

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

commit d608731d556df49572f347db6663d5a53609b6f1
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2026-04-16 12:15:21 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2026-06-03 08:22:58 +0000

    snd_uaudio: Do not use snd_mixer->lock as mixer_lock
    
    In similar fashion to c234740c9d34 ("snd_uaudio: Do not use
    pcm_channel->lock to protect uaudio_chan"), stop this layering
    violation, and introduce a snd_uaudio(4)-internal mixer_lock.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Pull Request:   https://ron-dev.freebsd.org/FreeBSD/src/pulls/18
    
    (cherry picked from commit 9a00e0b8ca566b6942874eb08c03baf035a17702)
    (cherry picked from commit fc9dc848239652ec1e4135adb4833a5f002cef0f)
---
 sys/dev/sound/usb/uaudio.c | 41 +++++++++++++++++------------------------
 1 file changed, 17 insertions(+), 24 deletions(-)

diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index f477eb768fde..eedd52774b70 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -356,7 +356,7 @@ struct uaudio_hid {
 
 struct uaudio_softc_child {
 	device_t pcm_device;
-	struct mtx *mixer_lock;
+	struct mtx mixer_lock;
 	struct snd_mixer *mixer_dev;
 
 	uint32_t mix_info;
@@ -2955,12 +2955,9 @@ uaudio_mixer_sysctl_handler(SYSCTL_HANDLER_ARGS)
 	sc = (struct uaudio_softc *)oidp->oid_arg1;
 	hint = oidp->oid_arg2;
 
-	if (sc->sc_child[0].mixer_lock == NULL)
-		return (ENXIO);
-
 	/* lookup mixer node */
 
-	mtx_lock(sc->sc_child[0].mixer_lock);
+	mtx_lock(&sc->sc_child[0].mixer_lock);
 	for (pmc = sc->sc_mixer_root; pmc != NULL; pmc = pmc->next) {
 		for (chan = 0; chan != (int)pmc->nchan; chan++) {
 			if (pmc->wValue[chan] != -1 &&
@@ -2971,7 +2968,7 @@ uaudio_mixer_sysctl_handler(SYSCTL_HANDLER_ARGS)
 		}
 	}
 found:
-	mtx_unlock(sc->sc_child[0].mixer_lock);
+	mtx_unlock(&sc->sc_child[0].mixer_lock);
 
 	error = sysctl_handle_int(oidp, &temp, 0, req);
 	if (error != 0 || req->newptr == NULL)
@@ -2979,7 +2976,7 @@ found:
 
 	/* update mixer value */
 
-	mtx_lock(sc->sc_child[0].mixer_lock);
+	mtx_lock(&sc->sc_child[0].mixer_lock);
 	if (pmc != NULL &&
 	    temp >= pmc->minval &&
 	    temp <= pmc->maxval) {
@@ -2989,7 +2986,7 @@ found:
 		/* start the transfer, if not already started */
 		usbd_transfer_start(sc->sc_mixer_xfer[0]);
 	}
-	mtx_unlock(sc->sc_child[0].mixer_lock);
+	mtx_unlock(&sc->sc_child[0].mixer_lock);
 
 	return (0);
 }
@@ -3220,10 +3217,7 @@ uaudio_mixer_reload_all(struct uaudio_softc *sc)
 	struct uaudio_mixer_node *pmc;
 	int chan;
 
-	if (sc->sc_child[0].mixer_lock == NULL)
-		return;
-
-	mtx_lock(sc->sc_child[0].mixer_lock);
+	mtx_lock(&sc->sc_child[0].mixer_lock);
 	for (pmc = sc->sc_mixer_root; pmc != NULL; pmc = pmc->next) {
 		/* use reset defaults for non-oss controlled settings */
 		if (pmc->ctl == SOUND_MIXER_NRDEVICES)
@@ -3235,7 +3229,7 @@ uaudio_mixer_reload_all(struct uaudio_softc *sc)
 
 	/* start HID volume keys, if any */
 	usbd_transfer_start(sc->sc_hid.xfer[0]);
-	mtx_unlock(sc->sc_child[0].mixer_lock);
+	mtx_unlock(&sc->sc_child[0].mixer_lock);
 }
 
 static void
@@ -5392,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);
 
@@ -5402,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
@@ -5439,13 +5435,13 @@ uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m)
 
 	DPRINTF("child=%u\n", i);
 
-	sc->sc_child[i].mixer_lock = mixer_get_lock(m);
+	mtx_init(&sc->sc_child[i].mixer_lock, "uaudio mixer lock", NULL, MTX_DEF);
 	sc->sc_child[i].mixer_dev = m;
 
 	if (i == 0 &&
 	    usbd_transfer_setup(sc->sc_udev, &sc->sc_mixer_iface_index,
 	    sc->sc_mixer_xfer, uaudio_mixer_config, 1, sc,
-	    sc->sc_child[i].mixer_lock)) {
+	    &sc->sc_child[i].mixer_lock)) {
 		DPRINTFN(0, "could not allocate USB transfer for mixer!\n");
 		return (ENOMEM);
 	}
@@ -5470,7 +5466,7 @@ uaudio_mixer_uninit_sub(struct uaudio_softc *sc, struct snd_mixer *m)
 	if (index == 0)
 		usbd_transfer_unsetup(sc->sc_mixer_xfer, 1);
 
-	sc->sc_child[index].mixer_lock = NULL;
+	mtx_destroy(&sc->sc_child[index].mixer_lock);
 
 	return (0);
 }
@@ -5488,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);
 			}
 		}
@@ -5529,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;
 			}
 		}
@@ -6186,9 +6182,6 @@ uaudio_hid_attach(struct uaudio_softc *sc,
 	if (!(sc->sc_hid.flags & UAUDIO_HID_VALID))
 		return (-1);
 
-	if (sc->sc_child[0].mixer_lock == NULL)
-		return (-1);
-
 	/* Get HID descriptor */
 	error = usbd_req_get_hid_desc(uaa->device, NULL, &d_ptr,
 	    &d_len, M_TEMP, sc->sc_hid.iface_index);
@@ -6247,7 +6240,7 @@ uaudio_hid_attach(struct uaudio_softc *sc,
 	/* allocate USB transfers */
 	error = usbd_transfer_setup(uaa->device, &sc->sc_hid.iface_index,
 	    sc->sc_hid.xfer, uaudio_hid_config, UAUDIO_HID_N_TRANSFER,
-	    sc, sc->sc_child[0].mixer_lock);
+	    sc, &sc->sc_child[0].mixer_lock);
 	if (error) {
 		DPRINTF("error=%s\n", usbd_errstr(error));
 		return (-1);


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a1fe47f.3b73e.60092e2>