mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-27 08:00:11 +00:00
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: bbca3a75bb
("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
This commit is contained in:
parent
1a768ea9db
commit
e850bd36df
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user