destroy_dev_drain stuck (devscd) after kldload,
ls -l cloned device, kldunload (trying to fix kqemu...)
Kostik Belousov
kostikbel at gmail.com
Sat Apr 19 03:57:42 UTC 2008
On Fri, Apr 18, 2008 at 09:51:50PM +0200, Juergen Lock wrote:
> Using this... after what has been done to /sys/netsmb/smb_dev.c:
>
> Index: Makefile
> ===================================================================
> RCS file: /home/pcvs/ports/emulators/kqemu-kmod/Makefile,v
> retrieving revision 1.21
> diff -u -p -r1.21 Makefile
> --- Makefile 26 Jul 2007 21:46:30 -0000 1.21
> +++ Makefile 18 Apr 2008 18:58:29 -0000
> @@ -7,7 +7,7 @@
>
> PORTNAME= kqemu
> PORTVERSION= 1.3.0.p11
> -PORTREVISION= 2
> +PORTREVISION= 3
> CATEGORIES= emulators kld
> MASTER_SITES= http://fabrice.bellard.free.fr/qemu/ \
> http://qemu.org/ \
> @@ -57,17 +57,6 @@ IGNORE= kqemu requires kernel source to
> CFLAGS+= -DKSE
> .endif
>
> -# XXX the following is wrong if you run a custom SMP kernel on a
> -# singleprocessor machine (but it probably doesn't really matter)
> -KERNCONF!= ${UNAME} -v | ${SED} 's-.*/--' | ${TR} -d ' '
> -NCPU!= ${SYSCTL} -n hw.ncpu 2>/dev/null
> -# we know 7.x GENERIC has SMP
> -.if ${KERNCONF} == "GENERIC" && ${OSVERSION} >= 700000
> -CFLAGS+= -DSMP
> -.elif ${NCPU} > 1
> -CFLAGS+= -DSMP
> -.endif
> -
> post-extract:
> .if ${OSVERSION} >= 700024 && !defined(NOKSE)
> @${ECHO_MSG} "Compiling with -DKSE."
> Index: files/patch-kqemu-freebsd.c
> ===================================================================
> RCS file: /home/pcvs/ports/emulators/kqemu-kmod/files/patch-kqemu-freebsd.c,v
> retrieving revision 1.6
> diff -u -p -r1.6 patch-kqemu-freebsd.c
> --- files/patch-kqemu-freebsd.c 21 Jul 2007 19:38:16 -0000 1.6
> +++ files/patch-kqemu-freebsd.c 18 Apr 2008 18:37:00 -0000
> @@ -17,13 +17,30 @@ Index: kqemu-freebsd.c
> return SIGPENDING(curthread);
> }
> #endif
> -@@ -320,6 +328,9 @@
> +@@ -320,8 +320,15 @@
> #if __FreeBSD_version >= 500000
> dev->si_drv1 = NULL;
> TAILQ_REMOVE(&kqemuhead, ks, kqemu_ent);
> ++#if __FreeBSD_version >= 700051
> ++ destroy_dev_sched(dev);
> ++#else
> +#if __FreeBSD_version >= 700024
> + dev_relthread(dev);
> +#endif
> destroy_dev(dev);
> #endif
> ++#endif
> free(ks, M_KQEMU);
> + --kqemu_ref_count;
> + }
> +@@ -500,6 +507,10 @@
> + while ((ks = TAILQ_FIRST(&kqemuhead)) != NULL) {
> + kqemu_destroy(ks);
> + }
> ++#if __FreeBSD_version >= 700051
> ++ drain_dev_clone_events();
> ++ /* destroy_dev_drain(&kqemu_cdevsw); */
> ++#endif
> + clone_cleanup(&kqemuclones);
> + #endif
> + kqemu_global_delete(kqemu_gs);
The destroy_dev_drain() function waits for the cdevs having the
kqemu_cdevsw cdevsw to be destroyed. I did not looked into the actual
kqemu sources, but assumed that kqemuclones have kqemu_cdevsw as
cdevsw. If this is the case, you shall call clone_cleanup() before
destroy_dev_drain().
>
> (and uncommenting the destroy_dev_drain call) I get a hang when I do:
> kldload kqemu
> ls -l /dev/kqemu
> kldunload kqemu
>
> Am I doing something wrong or is the bug elsewhere?
>
> Oh and does anyone still see qemu hanging using the commented version?
> (Only you shouldn't kldunload too quickly after running qemu I guess... :)
>
> Thanx,
> Juergen
> _______________________________________________
> freebsd-emulation at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-emulation
> To unsubscribe, send any mail to "freebsd-emulation-unsubscribe at freebsd.org"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-emulation/attachments/20080419/36327e51/attachment.pgp
More information about the freebsd-emulation
mailing list