Page MenuHomeFreeBSD

D46700.id143467.diff
No OneTemporary

D46700.id143467.diff

diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c
--- a/sys/dev/sound/pcm/channel.c
+++ b/sys/dev/sound/pcm/channel.c
@@ -59,8 +59,11 @@
return err;
if (val < CHN_LATENCY_MIN || val > CHN_LATENCY_MAX)
err = EINVAL;
- else
+ else {
+ bus_topo_lock();
chn_latency = val;
+ bus_topo_unlock();
+ }
return err;
}
@@ -82,8 +85,11 @@
return err;
if (val < CHN_LATENCY_PROFILE_MIN || val > CHN_LATENCY_PROFILE_MAX)
err = EINVAL;
- else
+ else {
+ bus_topo_lock();
chn_latency_profile = val;
+ bus_topo_unlock();
+ }
return err;
}
@@ -105,8 +111,11 @@
return err;
if (val < CHN_TIMEOUT_MIN || val > CHN_TIMEOUT_MAX)
err = EINVAL;
- else
+ else {
+ bus_topo_lock();
chn_timeout = val;
+ bus_topo_unlock();
+ }
return err;
}
@@ -128,6 +137,7 @@
struct pcm_channel *c;
int i;
+ bus_topo_lock();
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
d = devclass_get_softc(pcm_devclass, i);
@@ -146,6 +156,7 @@
PCM_RELEASE(d);
PCM_UNLOCK(d);
}
+ bus_topo_unlock();
}
static int
@@ -160,13 +171,16 @@
if (val < SND_VOL_0DB_MIN || val > SND_VOL_0DB_MAX)
return (EINVAL);
+ bus_topo_lock();
chn_vol_0db_pcm = val;
+ bus_topo_unlock();
+
chn_vpc_proc(0, val);
return (0);
}
SYSCTL_PROC(_hw_snd, OID_AUTO, vpc_0db,
- CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NEEDGIANT, 0, sizeof(int),
+ CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 0, sizeof(int),
sysctl_hw_snd_vpc_0db, "I",
"0db relative level");
@@ -180,13 +194,16 @@
if (err != 0 || req->newptr == NULL || val == 0)
return (err);
+ bus_topo_lock();
chn_vol_0db_pcm = SND_VOL_0DB_PCM;
+ bus_topo_unlock();
+
chn_vpc_proc(1, SND_VOL_0DB_PCM);
return (0);
}
SYSCTL_PROC(_hw_snd, OID_AUTO, vpc_reset,
- CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, 0, sizeof(int),
+ CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, 0, sizeof(int),
sysctl_hw_snd_vpc_reset, "I",
"reset volume on all channels");
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -2068,6 +2068,7 @@
if (ai->dev == -1 && i_dev->si_devsw != &dsp_cdevsw)
return (EINVAL);
+ bus_topo_lock();
for (unit = 0; pcm_devclass != NULL &&
unit < devclass_get_maxunit(pcm_devclass); unit++) {
d = devclass_get_softc(pcm_devclass, unit);
@@ -2075,6 +2076,7 @@
if ((ai->dev == -1 && unit == snd_unit) ||
ai->dev == unit) {
dsp_oss_audioinfo_unavail(ai, unit);
+ bus_topo_unlock();
return (0);
} else {
d = NULL;
@@ -2093,6 +2095,7 @@
d = NULL;
}
}
+ bus_topo_unlock();
/* Exhausted the search -- nothing is locked, so return. */
if (d == NULL)
@@ -2252,6 +2255,7 @@
* Search for the requested audio device (channel). Start by
* iterating over pcm devices.
*/
+ bus_topo_lock();
for (unit = 0; pcm_devclass != NULL &&
unit < devclass_get_maxunit(pcm_devclass); unit++) {
d = devclass_get_softc(pcm_devclass, unit);
@@ -2406,9 +2410,12 @@
PCM_UNLOCK(d);
- if (devname != NULL)
+ if (devname != NULL) {
+ bus_topo_unlock();
return (0);
+ }
}
+ bus_topo_unlock();
/* Exhausted the search -- nothing is locked, so return. */
return (EINVAL);
diff --git a/sys/dev/sound/pcm/feeder_rate.c b/sys/dev/sound/pcm/feeder_rate.c
--- a/sys/dev/sound/pcm/feeder_rate.c
+++ b/sys/dev/sound/pcm/feeder_rate.c
@@ -179,7 +179,9 @@
if (!(Z_FACTOR_SAFE(val) && val < feeder_rate_max))
return (EINVAL);
+ bus_topo_lock();
feeder_rate_min = val;
+ bus_topo_unlock();
return (0);
}
@@ -202,7 +204,9 @@
if (!(Z_FACTOR_SAFE(val) && val > feeder_rate_min))
return (EINVAL);
+ bus_topo_lock();
feeder_rate_max = val;
+ bus_topo_unlock();
return (0);
}
@@ -225,7 +229,9 @@
if (val < Z_ROUNDHZ_MIN || val > Z_ROUNDHZ_MAX)
return (EINVAL);
+ bus_topo_lock();
feeder_rate_round = val - (val % Z_ROUNDHZ);
+ bus_topo_unlock();
return (0);
}
@@ -251,6 +257,7 @@
if (val < Z_QUALITY_MIN || val > Z_QUALITY_MAX)
return (EINVAL);
+ bus_topo_lock();
feeder_rate_quality = val;
/*
@@ -280,10 +287,12 @@
PCM_UNLOCK(d);
}
+ bus_topo_unlock();
+
return (0);
}
SYSCTL_PROC(_hw_snd, OID_AUTO, feeder_rate_quality,
- CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NEEDGIANT, 0, sizeof(int),
+ CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 0, sizeof(int),
sysctl_hw_snd_feeder_rate_quality, "I",
"sample rate converter quality ("__XSTRING(Z_QUALITY_MIN)"=low .. "
__XSTRING(Z_QUALITY_MAX)"=high)");
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -1444,12 +1444,14 @@
* There's a 1:1 relationship between mixers and PCM devices, so
* begin by iterating over PCM devices and search for our mixer.
*/
+ bus_topo_lock();
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
d = devclass_get_softc(pcm_devclass, i);
if (!PCM_REGISTERED(d) || PCM_DETACHING(d)) {
if ((mi->dev == -1 && i == snd_unit) || mi->dev == i) {
mixer_oss_mixerinfo_unavail(mi, i);
+ bus_topo_unlock();
return (0);
} else
continue;
@@ -1470,6 +1472,7 @@
if (d->mixer_dev->si_drv1 == NULL) {
mixer_oss_mixerinfo_unavail(mi, i);
PCM_UNLOCK(d);
+ bus_topo_unlock();
return (0);
}
@@ -1550,8 +1553,10 @@
PCM_UNLOCK(d);
+ bus_topo_unlock();
return (0);
}
+ bus_topo_unlock();
return (EINVAL);
}
diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c
--- a/sys/dev/sound/pcm/sndstat.c
+++ b/sys/dev/sound/pcm/sndstat.c
@@ -133,8 +133,11 @@
if (error == 0 && req->newptr != NULL) {
if (verbose < 0 || verbose > 4)
error = EINVAL;
- else
+ else {
+ bus_topo_lock();
snd_verbose = verbose;
+ bus_topo_unlock();
+ }
}
return (error);
}
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -178,17 +178,21 @@
unit = snd_unit;
error = sysctl_handle_int(oidp, &unit, 0, req);
if (error == 0 && req->newptr != NULL) {
+ bus_topo_lock();
d = devclass_get_softc(pcm_devclass, unit);
- if (!PCM_REGISTERED(d) || CHN_EMPTY(d, channels.pcm))
+ if (!PCM_REGISTERED(d) || CHN_EMPTY(d, channels.pcm)) {
+ bus_topo_unlock();
return EINVAL;
+ }
snd_unit = unit;
snd_unit_auto = 0;
+ bus_topo_unlock();
}
return (error);
}
/* XXX: do we need a way to let the user change the default unit? */
SYSCTL_PROC(_hw_snd, OID_AUTO, default_unit,
- CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_ANYBODY | CTLFLAG_NEEDGIANT, 0,
+ CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, 0,
sizeof(int), sysctl_hw_snd_default_unit, "I",
"default sound device");
@@ -337,6 +341,7 @@
best = -1;
bestprio = -100;
+ bus_topo_lock();
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
d = devclass_get_softc(pcm_devclass, i);
@@ -352,6 +357,8 @@
bestprio = prio;
}
}
+ bus_topo_unlock();
+
return (best);
}
@@ -713,6 +720,7 @@
j = 0;
+ bus_topo_lock();
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
d = devclass_get_softc(pcm_devclass, i);
@@ -739,6 +747,7 @@
PCM_UNLOCK(d);
}
+ bus_topo_unlock();
si->numsynths = 0; /* OSSv4 docs: this field is obsolete */
/**
@@ -759,9 +768,11 @@
* break if they try to loop through all mixers and some of them are
* not available.
*/
+ bus_topo_lock();
si->nummixers = devclass_get_maxunit(pcm_devclass);
si->numcards = devclass_get_maxunit(pcm_devclass);
si->numaudios = devclass_get_maxunit(pcm_devclass);
+ bus_topo_unlock();
/* OSSv4 docs: Intended only for test apps; API doesn't
really have much of a concept of cards. Shouldn't be
used by applications. */
@@ -787,6 +798,7 @@
struct snddev_info *d;
int i;
+ bus_topo_lock();
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
d = devclass_get_softc(pcm_devclass, i);
@@ -814,8 +826,11 @@
PCM_UNLOCK(d);
}
+ bus_topo_unlock();
return (0);
}
+ bus_topo_unlock();
+
return (ENXIO);
}
diff --git a/sys/dev/sound/pcm/vchan.c b/sys/dev/sound/pcm/vchan.c
--- a/sys/dev/sound/pcm/vchan.c
+++ b/sys/dev/sound/pcm/vchan.c
@@ -1064,6 +1064,7 @@
v = 0;
if (v > SND_MAXVCHANS)
v = SND_MAXVCHANS;
+ bus_topo_lock();
snd_maxautovchans = v;
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
@@ -1074,11 +1075,12 @@
vchan_setmaxauto(d, v);
PCM_RELEASE_QUICK(d);
}
+ bus_topo_unlock();
}
return (error);
}
SYSCTL_PROC(_hw_snd, OID_AUTO, maxautovchans,
- CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NEEDGIANT, 0, sizeof(int),
+ CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 0, sizeof(int),
sysctl_hw_snd_maxautovchans, "I", "maximum virtual channel");
void

File Metadata

Mime Type
text/plain
Expires
Mon, Sep 30, 10:17 PM (41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13203971
Default Alt Text
D46700.id143467.diff (8 KB)

Event Timeline