Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 01 Apr 2012 15:25:03 +0300
From:      Mikolaj Golub <trociny@freebsd.org>
To:        Bernhard Froehlich <decke@FreeBSD.org>
Cc:        freebsd-emulation@freebsd.org, freebsd-virtualization@freebsd.org
Subject:   Re: [patch] VirtualBox-4.0.14 + FreeBSD/CURRENT + VIMAGE: crash on vm shutdown
Message-ID:  <86iphjiqqo.fsf@kopusha.home.net>
In-Reply-To: <12f5de744d0ca920d3b204aa291b4084@bluelife.at> (Bernhard Froehlich's message of "Fri, 30 Mar 2012 10:13:57 %2B0200")
References:  <867gyg77h0.fsf@kopusha.home.net> <12f5de744d0ca920d3b204aa291b4084@bluelife.at>

next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-=

Hi,

On Fri, 30 Mar 2012 10:13:57 +0200 Bernhard Froehlich wrote:

 BF> Sorry for the late response and thanks for the patch. Is this patch
 BF> still required for 4.1.8? My guess is yes but it would be great if you
 BF> could confirm that with the latest port.

Sorry, it required some time to check -- I upgraded my box to the latest
current and had some instabilities to fix before testing vbox.

So on the recent current and VirtualBox-4.1.10 (the latest version I have
found in the ports) the VBoxNetFlt patch is still required but VBoxNetAdp also
needs patching: I had a crash on vm start:

#0  doadump (textdump=-2022600704) at pcpu.h:244
#1  0x8051af69 in db_fncall (dummy1=1, dummy2=0, dummy3=-2127583648, dummy4=0xdcb61838 "")
    at /home/golub/freebsd/base/head/sys/ddb/db_command.c:573
#2  0x8051b361 in db_command (last_cmdp=0x811221fc, cmd_table=0x0, dopager=1)
    at /home/golub/freebsd/base/head/sys/ddb/db_command.c:449
#3  0x8051b4ba in db_command_loop () at /home/golub/freebsd/base/head/sys/ddb/db_command.c:502
#4  0x8051d4ad in db_trap (type=12, code=0)
    at /home/golub/freebsd/base/head/sys/ddb/db_main.c:229
#5  0x80a81d96 in kdb_trap (type=12, code=0, tf=0xdcb61ad4)
    at /home/golub/freebsd/base/head/sys/kern/subr_kdb.c:629
#6  0x80dd22af in trap_fatal (frame=0xdcb61ad4, eva=24)
    at /home/golub/freebsd/base/head/sys/i386/i386/trap.c:1014
#7  0x80dd2387 in trap_pfault (frame=0xdcb61ad4, usermode=0, eva=24)
    at /home/golub/freebsd/base/head/sys/i386/i386/trap.c:835
#8  0x80dd3451 in trap (frame=0xdcb61ad4)
    at /home/golub/freebsd/base/head/sys/i386/i386/trap.c:547
#9  0x80dbccac in calltrap () at /home/golub/freebsd/base/head/sys/i386/i386/exception.s:169
#10 0x80b0633e in ifindex_alloc_locked (idxp=0xdcb61b56)
    at /home/golub/freebsd/base/head/sys/net/if.c:279
#11 0x80b09172 in if_alloc (type=6 '\006') at /home/golub/freebsd/base/head/sys/net/if.c:435
#12 0x8b01e8e7 in vboxNetAdpOsCreate () from /boot/modules/vboxnetadp.ko
#13 0x8b01ef00 in vboxNetAdpCreate () from /boot/modules/vboxnetadp.ko
#14 0x8b01ecd8 in VBoxNetAdpFreeBSDCtrlioctl () from /boot/modules/vboxnetadp.ko
#15 0x8095c6bb in devfs_ioctl_f (fp=0x8b6f8118, com=3223352833, data=0x8b022360, 
    cred=0x87759b00, td=0x89fdf2e0)
    at /home/golub/freebsd/base/head/sys/fs/devfs/devfs_vnops.c:757
#16 0x80a9b4ed in kern_ioctl (td=0x89fdf2e0, fd=3, com=3223352833, data=0x8b022360 "vboxnet0")
    at file.h:287
#17 0x80a9b674 in sys_ioctl (td=0x89fdf2e0, uap=0xdcb61cec)
    at /home/golub/freebsd/base/head/sys/kern/sys_generic.c:691
#18 0x80dd29ae in syscall (frame=0xdcb61d28) at subr_syscall.c:135

I am attaching two patches: the first one is for VBoxNetFlt (the same I sent
to the list but against 4.1.10) and the second one for VBoxNetAdp (a fix for
the panic above).

 BF> Do you aggree that this patch is under MIT License so that I can push
 BF> it upstream?

Sure for both patches. Thanks for taking it!

-- 
Mikolaj Golub


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
	filename=VirtualBox-4.1.10.VBoxNetFlt.freebsd.VIMAGE.patch

diff -rpu VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
--- VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2012-03-13 15:15:44.000000000 +0200
+++ VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2012-04-01 13:43:02.000000000 +0300
@@ -651,13 +651,13 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
         ng_rmnode_self(pThis->u.s.node);
         pThis->u.s.node = NULL;
     }
+    VBOXCURVNET_RESTORE();
 
     if (ifp0 != NULL)
     {
         vboxNetFltOsDeleteInstance(pThis);
         vboxNetFltOsInitInstance(pThis, NULL);
     }
-    VBOXCURVNET_RESTORE();
 
     return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost);
 }
@@ -671,8 +671,10 @@ void vboxNetFltOsDeleteInstance(PVBOXNET
     mtx_destroy(&pThis->u.s.inq.ifq_mtx);
     mtx_destroy(&pThis->u.s.outq.ifq_mtx);
 
+    VBOXCURVNET_SET_FROM_UCRED();
     if (pThis->u.s.node != NULL)
         ng_rmnode_self(pThis->u.s.node);
+    VBOXCURVNET_RESTORE();
     pThis->u.s.node = NULL;
 }

--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
	filename=VirtualBox-4.1.10.VBoxNetAdp.freebsd.VIMAGE.patch

diff -rpu VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile
--- VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile	2012-03-13 15:15:44.000000000 +0200
+++ VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile	2012-04-01 13:27:16.000000000 +0300
@@ -18,7 +18,7 @@
 
 KMOD = vboxnetadp
 
-CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING
+CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING -DVIMAGE
 
 .if (${MACHINE_ARCH} == "i386")
  CFLAGS += -DRT_ARCH_X86
diff -rpu VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
--- VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c	2012-03-13 15:15:44.000000000 +0200
+++ VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c	2012-04-01 13:23:58.000000000 +0300
@@ -68,6 +68,22 @@
 #define VBOXNETADP_OS_SPECFIC 1
 #include "../VBoxNetAdpInternal.h"
 
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 800500
+# include <sys/jail.h>
+# include <net/vnet.h>
+
+# define VBOXCURVNET_SET(arg)           CURVNET_SET_QUIET(arg)
+# define VBOXCURVNET_SET_FROM_UCRED()   VBOXCURVNET_SET(CRED_TO_VNET(curthread->td_ucred))
+# define VBOXCURVNET_RESTORE()          CURVNET_RESTORE()
+
+#else /* !defined(__FreeBSD_version) || __FreeBSD_version < 800500 */
+
+# define VBOXCURVNET_SET(arg)
+# define VBOXCURVNET_SET_FROM_UCRED()
+# define VBOXCURVNET_RESTORE()
+
+#endif /* !defined(__FreeBSD_version) || __FreeBSD_version < 800500 */
+
 static int VBoxNetAdpFreeBSDCtrlioctl(struct cdev *, u_long, caddr_t, int flags,
     struct thread *);
 static struct cdevsw vboxnetadp_cdevsw =
@@ -260,6 +276,7 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis
 {
     struct ifnet *ifp;
 
+    VBOXCURVNET_SET_FROM_UCRED();
     ifp = if_alloc(IFT_ETHER);
     if (ifp == NULL)
         return VERR_NO_MEMORY;
@@ -279,6 +296,7 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis
 
     strncpy(pThis->szName, ifp->if_xname, VBOXNETADP_MAX_NAME_LEN);
     pThis->u.s.ifp = ifp;
+    VBOXCURVNET_RESTORE();
     return 0;
 }
 
@@ -286,7 +304,9 @@ void vboxNetAdpOsDestroy(PVBOXNETADP pTh
 {
     struct ifnet *ifp;
 
+    VBOXCURVNET_SET(ifp->if_vnet);
     ifp = pThis->u.s.ifp;
     ether_ifdetach(ifp);
     if_free(ifp);
+    VBOXCURVNET_RESTORE();
 }

--=-=-=--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86iphjiqqo.fsf>