aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sound/pcm
diff options
context:
space:
mode:
authorChristos Margiolis <christos@FreeBSD.org>2024-07-06 18:23:22 +0000
committerChristos Margiolis <christos@FreeBSD.org>2024-07-06 18:23:22 +0000
commite850bd36dfda98608432d2459800627d16119fec (patch)
treea3f0c266e37daf28784063a6a7bb3ab7b13c8565 /sys/dev/sound/pcm
parent1a768ea9db3d66941b0dc5340ac028ef548808b8 (diff)
downloadsrc-e850bd36dfda98608432d2459800627d16119fec.tar.gz
src-e850bd36dfda98608432d2459800627d16119fec.zip
sound: Add missing CHN_[UN]LOCKs in sndstat
In sndstat_build_sound4_nvlist(), if we have INVARIANTS or SND_DIAGNOSTIC enabled, we will hit a lock assertion panic when we call CHN_GETVOLUME(). Also lock the channel in the sndstat_prepare_pcm() loop for good measure. Fixes: bbca3a75bb41 ("sound: Include sound(4) channel information in sndstat nvlist") Sponsored by: The FreeBSD Foundation MFC after: 2 days Reviewed by: dev_submerge.ch Differential Revision: https://reviews.freebsd.org/D45898
Diffstat (limited to 'sys/dev/sound/pcm')
-rw-r--r--sys/dev/sound/pcm/sndstat.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c
index 5b770810d19b..753531f3694e 100644
--- a/sys/dev/sound/pcm/sndstat.c
+++ b/sys/dev/sound/pcm/sndstat.c
@@ -456,6 +456,8 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
goto done;
}
+ CHN_LOCK(c);
+
nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_NAME, c->name);
nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_PARENTCHAN,
c->parentchannel != NULL ? c->parentchannel->name : "");
@@ -537,6 +539,8 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
sbuf_printf(&sb, "%s]",
(c->direction == PCMDIR_REC) ? "userland" : "hardware");
+ CHN_UNLOCK(c);
+
sbuf_finish(&sb);
nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_FEEDERCHAIN,
sbuf_data(&sb));
@@ -1230,6 +1234,8 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
KASSERT(c->bufhard != NULL && c->bufsoft != NULL,
("hosed pcm channel setup"));
+ CHN_LOCK(c);
+
sbuf_printf(s, "\n\t");
sbuf_printf(s, "%s[%s]: ",
@@ -1321,6 +1327,8 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
}
sbuf_printf(s, "{%s}",
(c->direction == PCMDIR_REC) ? "userland" : "hardware");
+
+ CHN_UNLOCK(c);
}
return (0);