On 15/01/20(Wed) 20:26, Vadim Zhukov wrote:
> I have a diff or two for that, will send when I'll come home.
After discussing the issue with Peter Stuge, we figured out that
the free should happen *after* calling config_detach() for the child
device (video(4)).
When video(4) is detached it will call:
vdevgone()->videoclose()->uvideo_close()
this last function will sleep until all I/O are finished or cancelled as
part of usbd_pipe_close(9).
Diff below should fix the issue.
Index: dev/video.c
===================================================================
RCS file: /cvs/src/sys/dev/video.c,v
retrieving revision 1.42
diff -u -p -r1.42 video.c
--- dev/video.c 6 Oct 2019 17:13:10 -0000 1.42
+++ dev/video.c 15 Jan 2020 19:11:20 -0000
@@ -463,9 +463,6 @@ videodetach(struct device *self, int fla
struct video_softc *sc = (struct video_softc *)self;
int maj, mn;
- if (sc->sc_fbuffer != NULL)
- free(sc->sc_fbuffer, M_DEVBUF, sc->sc_fbufferlen);
-
/* locate the major number */
for (maj = 0; maj < nchrdev; maj++)
if (cdevsw[maj].d_open == videoopen)
@@ -474,6 +471,8 @@ videodetach(struct device *self, int fla
/* Nuke the vnodes for any open instances (calls close). */
mn = self->dv_unit;
vdevgone(maj, mn, mn, VCHR);
+
+ free(sc->sc_fbuffer, M_DEVBUF, sc->sc_fbufferlen);
return (0);
}
Index: dev/usb/uvideo.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvideo.c,v
retrieving revision 1.205
diff -u -p -r1.205 uvideo.c
--- dev/usb/uvideo.c 14 Oct 2019 09:20:48 -0000 1.205
+++ dev/usb/uvideo.c 15 Jan 2020 19:09:48 -0000
@@ -644,10 +644,10 @@ uvideo_detach(struct device *self, int f
/* Wait for outstanding requests to complete */
usbd_delay_ms(sc->sc_udev, UVIDEO_NFRAMES_MAX);
- uvideo_vs_free_frame(sc);
-
if (sc->sc_videodev != NULL)
rv = config_detach(sc->sc_videodev, flags);
+
+ uvideo_vs_free_frame(sc);
return (rv);
}