tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
closing pad(4) before audio(4) causes panic
Closing /dev/pad before closing /dev/audio causes panic.
It is filed as PR kern/54427. It can be reproduced with attached
sample code on -current and netbsd-9.
Would someone take look?
pad_close()
calls audiodetach() (via config_detach_children())
-> this detaches audio device (without closing descriptors).
then calls pad_detach()
-> this detaches pad device.
audioclose()
panics. Because it cannot acquire mutex (sc->sc_lock). This mutex
is provided by pad, and the pad has already been detached.
According to audio.c comment, vdevgone() calls close(). But it is
not called actually.
sys/dev/audio/audio.c
1224 audiodetach(device_t self, int flags)
1225 {
:
1257 /*
1258 * Nuke the vnodes for any open instances (calls close).
1259 * Will wait until any activity on the device nodes has ceased.
1260 */
1261 mn = device_unit(self);
1262 vdevgone(maj, mn | SOUND_DEVICE, mn | SOUND_DEVICE, VCHR);
1263 vdevgone(maj, mn | AUDIO_DEVICE, mn | AUDIO_DEVICE, VCHR);
1264 vdevgone(maj, mn | AUDIOCTL_DEVICE, mn | AUDIOCTL_DEVICE, VCHR);
1265 vdevgone(maj, mn | MIXER_DEVICE, mn | MIXER_DEVICE, VCHR);
# By the way, this panic didn't occur until merging isaki-audio2.
# Because previous audio driver aborted audioclose() without refering
# this destroyed mutex (that is, it had a resource leak). In result,
# you had never encountered this panic before.
Thanks,
---
Tetsuya Isaki <isaki%pastel-flower.jp@localhost / isaki%NetBSD.org@localhost>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int ac, char *av[])
{
const char *devaudio = "/dev/audio1"; /* set your device */
int fdpad;
int fdaudio;
int r;
fdpad = open("/dev/pad", O_RDONLY);
if (fdpad == -1)
err(1, "open: dev/pad");
fdaudio = open(devaudio, O_WRONLY);
if (fdaudio == -1)
err(1, "open: dev/audio");
close(fdpad);
close(fdaudio);
return 0;
}
Home |
Main Index |
Thread Index |
Old Index