From nobody Sun Oct 18 08:13:26 2026 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4j6rzB6kmBz6jxkr for ; Sun, 18 Oct 2026 08:13:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j6rzB3bgNz3LNd for ; Sun, 18 Oct 2026 08:13:26 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792311206; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/O/KMCklCHGqYC1hQorLfAhigF14quw6x6ZqSe/L60c=; b=asMvJaF7t1BuYCNpPp5fxjtNPbEvv2V5bTnNZFG0//dfIw3nY5MMADSvCXgjt7WxOUALBT lm3OXxF2SONqG5Pcmfqxhv8XqF+YVU6vPpNvSD2g/tq1SVzknZA/i2jRiv9aHjknLJ5uU+ /SEXumOfQ1vsd6MrAvt+xEYzyH1LD77afqV9kNZtPPvuo6wNibH+YsokGaBTMnp0RsUA/P HIqVkhBXdNWe68h0PcqoQO7VmJ6uFMeUGxH+bQG8/FgWTAMpoh+m1a1wHrw+b8XS+y38a7 7m7+dUHHJpSEEvfxY6rgbp+y9M2zossQISd2gJhynOnm6HfhVJWU831xz2mA2w== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792311206; b=f0VC3v7YjutQT205F4LddQzS6o/IPxYrK82ajotCiAKpSfnqqzpVV2QogRTFC91cBy6gb/ RxSjAPz1AXz7FEJyXAbk1pPpySDEczB9WhvFys3g2bctB6bB07kJjiRoTR5BSClHHXeQK8 NamecVbcG2cfqcn07tb7LWdlBSUw77yvkycdMSslGOzxD/2UI7YDqQmB9RnzhuRQyJJMQ8 T36sM0dtZXjVTlSfoRM6H2jEJtHcR4uaxeRbVZxq5yYpvjAQokjjjq5toR+VcCay+T0wYV ZbVrkibmNZGra9o03Ua0QxLDAoUri2UaVwUqPZQq4/dCo0ifNQvlDaT3PYibeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792311206; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/O/KMCklCHGqYC1hQorLfAhigF14quw6x6ZqSe/L60c=; b=uq/80QgMjbIOcCZbTDB1lpZV+ZUaX2iMVBJCiQbrsfD/lMyelvVOb9WbI1fHcJ4gyzS57n JLZTwyPbQHyQYvuiFNYtOENBiGmvCbhJSFyMxhVYs6RTAjj2mLqEmszJgn7kpAjiRnOXmR avobfTJYlyhISU+odFTHfuRqpWPvgWUJgX+VGueC13H/Hl9aFv9R0XorydwWMnUlloa2NL KXy3vZiIY5vsEZ82JXi+r5e/LV+tkfksVnlsxAIB094bfvBPlyih+D/mypLYXOEK9b0dgZ pDFaoQUrSNidFbmm3VFNGMrhzrIFR3o4SlRcPyfGjufsa5g/DQomAwG0spjOEw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j6rzB0wxgzhNx for ; Sun, 18 Oct 2026 08:13:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3056e by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 18 Oct 2026 08:13:26 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Christos Margiolis Subject: git: de7cd7fe9c91 - stable/15 - sound: Retire mixer_hwvol locked variants List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: Commits to the stable branches of the FreeBSD src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: christos X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: de7cd7fe9c910be9dd1ad6580a080cfe59dcd2cc Auto-Submitted: auto-generated Date: Sun, 18 Oct 2026 08:13:26 +0000 Message-Id: <6ad47fa6.3056e.24423a20@gitrepo.freebsd.org> The branch stable/15 has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=de7cd7fe9c910be9dd1ad6580a080cfe59dcd2cc commit de7cd7fe9c910be9dd1ad6580a080cfe59dcd2cc Author: Christos Margiolis AuthorDate: 2026-09-18 18:16:03 +0000 Commit: Christos Margiolis CommitDate: 2026-10-18 08:10:49 +0000 sound: Retire mixer_hwvol locked variants Prior to 9a00e0b8ca56 ("snd_uaudio: Do not use snd_mixer->lock as mixer_lock"), there was a need for mixer_hwvol_mute_locked() and mixer_hwvol_step_locked(), because the unlocked variants would acquire the lock, but uaudio_hid_rx_callback() would also hold the lock, so this was a measure to avoid recursion on snd_mixer->lock. Now that snd_uaudio(4) has a private mixer lock, the locked variants are not only unnecessary, but wrong, because we now lock the private lock and not the snd_mixer one, which is what mixer_hwvol_mute_locked() and mixer_hwvol_step_locked() expect. Retire the locked variants and call the regular functions instead. The unlocked variants take the mixer lock, which is now the PCM lock, and reach uaudio_mixer_ctl_set(), which takes mixer_lock. Calling them straight from uaudio_hid_rx_callback() would therefore take mixer_lock and the PCM lock in the opposite order to the mixer ioctl path, so record what the HID report asked for and perform the volume change at the end of the callback, with mixer_lock dropped. The USB stack allows a callback to drop its transfer mutex (see usbdi.9). Sponsored by: The FreeBSD Foundation MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D59075 (cherry picked from commit 9548bfa342a71f1ca0ad953bf323086e84a395c3) --- sys/dev/sound/pcm/mixer.c | 24 +++++------------------- sys/dev/sound/pcm/mixer.h | 2 -- sys/dev/sound/usb/uaudio.c | 31 ++++++++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c index 1c76ace34042..bad464538609 100644 --- a/sys/dev/sound/pcm/mixer.c +++ b/sys/dev/sound/pcm/mixer.c @@ -743,12 +743,6 @@ mixer_hwvol_init(device_t dev) return 0; } -void -mixer_hwvol_mute_locked(struct snd_mixer *m) -{ - mix_setmutedevs(m, m->mutedevs ^ (1 << m->hwvol_mixer)); -} - void mixer_hwvol_mute(device_t dev) { @@ -756,17 +750,19 @@ mixer_hwvol_mute(device_t dev) m = mixer_get_devt(dev); mtx_lock(m->lock); - mixer_hwvol_mute_locked(m); + mix_setmutedevs(m, m->mutedevs ^ (1 << m->hwvol_mixer)); mtx_unlock(m->lock); } void -mixer_hwvol_step_locked(struct snd_mixer *m, int left_step, int right_step) +mixer_hwvol_step(device_t dev, int left_step, int right_step) { + struct snd_mixer *m; int level, left, right; + m = mixer_get_devt(dev); + mtx_lock(m->lock); level = mixer_get(m, m->hwvol_mixer); - if (level != -1) { left = level & 0xff; right = (level >> 8) & 0xff; @@ -783,16 +779,6 @@ mixer_hwvol_step_locked(struct snd_mixer *m, int left_step, int right_step) mixer_set(m, m->hwvol_mixer, m->mutedevs, left | right << 8); } -} - -void -mixer_hwvol_step(device_t dev, int left_step, int right_step) -{ - struct snd_mixer *m; - - m = mixer_get_devt(dev); - mtx_lock(m->lock); - mixer_hwvol_step_locked(m, left_step, right_step); mtx_unlock(m->lock); } diff --git a/sys/dev/sound/pcm/mixer.h b/sys/dev/sound/pcm/mixer.h index d26895a41ba0..7c9d120463ca 100644 --- a/sys/dev/sound/pcm/mixer.h +++ b/sys/dev/sound/pcm/mixer.h @@ -72,9 +72,7 @@ int mixer_ioctl_cmd(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi); int mixer_hwvol_init(device_t dev); -void mixer_hwvol_mute_locked(struct snd_mixer *m); void mixer_hwvol_mute(device_t dev); -void mixer_hwvol_step_locked(struct snd_mixer *m, int l_step, int r_step); void mixer_hwvol_step(device_t dev, int left_step, int right_step); int mix_set(struct snd_mixer *m, unsigned int dev, unsigned int left, unsigned int right); diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c index 54404416426c..41d7e1a939a3 100644 --- a/sys/dev/sound/usb/uaudio.c +++ b/sys/dev/sound/usb/uaudio.c @@ -6223,9 +6223,13 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error) struct snd_mixer *m; uint8_t id; int actlen; + bool mute, volume_up, volume_down; usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + m = NULL; + mute = volume_up = volume_down = false; + switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: DPRINTF("actlen=%d\n", actlen); @@ -6247,7 +6251,7 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error) &sc->sc_hid.mute_loc)) { DPRINTF("Mute toggle\n"); - mixer_hwvol_mute_locked(m); + mute = true; } if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_UP) && @@ -6256,7 +6260,7 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error) &sc->sc_hid.volume_up_loc)) { DPRINTF("Volume Up\n"); - mixer_hwvol_step_locked(m, 1, 1); + volume_up = true; } if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_DOWN) && @@ -6265,7 +6269,7 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error) &sc->sc_hid.volume_down_loc)) { DPRINTF("Volume Down\n"); - mixer_hwvol_step_locked(m, -1, -1); + volume_down = true; } case USB_ST_SETUP: @@ -6286,6 +6290,27 @@ tr_setup: } break; } + + if (!mute && !volume_up && !volume_down) + return; + + /* + * The mixer_hwvol_*() functions take the mixer lock, which is the PCM + * lock, and end up in uaudio_mixer_ctl_set(), which takes the + * mixer_lock this callback is entered with. Acquiring the two in that + * order here would reverse the order taken by the mixer ioctl path + * (PCM lock first, then mixer_lock), so drop mixer_lock for the + * duration. The USB stack explicitly allows a callback to drop its + * transfer mutex, and usbd_transfer_drain() accounts for it. + */ + mtx_unlock(&sc->sc_child[0].mixer_lock); + if (mute) + mixer_hwvol_mute(m->dev); + if (volume_up) + mixer_hwvol_step(m->dev, 1, 1); + if (volume_down) + mixer_hwvol_step(m->dev, -1, -1); + mtx_lock(&sc->sc_child[0].mixer_lock); } static int