Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Jan 2011 23:06:51 +0200
From:      Mikolaj Golub <to.my.trociny@gmail.com>
To:        Julian Elischer <julian@freebsd.org>
Cc:        freebsd-emulation@freebsd.org, freebsd-virtualization@freebsd.org
Subject:   Re: VirtualBox + VIMAGE
Message-ID:  <86tygwy9p0.fsf@kopusha.home.net>
In-Reply-To: <4D3D2DE9.2060004@freebsd.org> (Julian Elischer's message of "Sun, 23 Jan 2011 23:44:41 -0800")
References:  <86oc77heqk.fsf@kopusha.home.net> <4D3D2DE9.2060004@freebsd.org>

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


On Sun, 23 Jan 2011 23:44:41 -0800 Julian Elischer wrote:

 JE> On 1/23/11 6:33 AM, Mikolaj Golub wrote:

 >> As a quick fix I added in VBoxNetFlt-freebsd.c in all "problem" functions
 >> CURVNET_SET_QUIET(vnet0) macro, which sets td->td_vnet to default vnet (see the
 >> attached patch). This has fixed the issue for me and now I am happily running
 >> both VNET jails and VirtualBox machines on my desktop.
 >>
 >> But the way I fixed the issue looks hackish for me. Could someone suggest a
 >> better solution?
 JE> this is probably at east partially the correct solution.
 JE> Usually you should also set the value back to its previous value when
 JE> you leave that code as well.

Thank you for the comments. Actually the patch contained CURVNET_RESTORE()
too. I just did not mentioned it :-). So if it looks like right solution here
is an "improved" version of the patch: vnet to switch is taken from thread's
ucred (on interface initialization) or from ifp->if_vnet.

 >> In case someone is interested in trying this patch, below are the instructions
 >> how to build "VIMAGE safe" vbox driver from ports:
 >>
 >> cd /usr/ports/emulators/virtualbox-ose-kmod
 >> make patch
 >> cd work
 >> patch -p0<  /path/to/VirtualBox-3.2.12.VIMAGE.patch
 >> cd ..
 >> VIMAGE=1 make
 >>

-- 
Mikolaj Golub

--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=VirtualBox-3.2.12.VIMAGE.1.patch

diff -rpu VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile
--- VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile	2010-12-01 19:09:33.000000000 +0200
+++ VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile	2011-01-25 22:48:26.000000000 +0200
@@ -26,6 +26,10 @@ CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DI
  CFLAGS += -DRT_ARCH_AMD64
 .endif
 
+.if defined(VIMAGE)
+ CFLAGS += -DVIMAGE
+.endif
+
 SRCS = \
 	VBoxNetFlt-freebsd.c \
 	VBoxNetFlt.c \
diff -rpu VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
--- VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2010-12-01 19:09:33.000000000 +0200
+++ VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2011-01-25 22:48:26.000000000 +0200
@@ -37,6 +37,7 @@
 #include <sys/module.h>
 #include <sys/systm.h>
 #include <sys/errno.h>
+#include <sys/jail.h>
 #include <sys/kernel.h>
 #include <sys/fcntl.h>
 #include <sys/conf.h>
@@ -51,6 +52,7 @@
 #include <net/if_dl.h>
 #include <net/if_types.h>
 #include <net/ethernet.h>
+#include <net/vnet.h>
 
 #include <netgraph/ng_message.h>
 #include <netgraph/netgraph.h>
@@ -322,6 +324,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
     struct m_tag *mtag;
     bool fActive;
 
+    CURVNET_SET_QUIET(ifp->if_vnet);
     fActive = vboxNetFltTryRetainBusyActive(pThis);
 
     NGI_GET_M(item, m);
@@ -346,6 +349,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
             ether_demux(ifp, m);
             if (fActive)
                 vboxNetFltRelease(pThis, true /*fBusy*/);
+            CURVNET_RESTORE();
             return (0);
         }
         mtx_lock_spin(&pThis->u.s.inq.ifq_mtx);
@@ -363,6 +367,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
             int rc = ether_output_frame(ifp, m);
             if (fActive)
                 vboxNetFltRelease(pThis, true /*fBusy*/);
+            CURVNET_RESTORE();
             return rc;
         }
         mtx_lock_spin(&pThis->u.s.outq.ifq_mtx);
@@ -377,6 +382,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
 
     if (fActive)
         vboxNetFltRelease(pThis, true /*fBusy*/);
+    CURVNET_RESTORE();
     return (0);
 }
 
@@ -409,6 +415,7 @@ static void vboxNetFltFreeBSDinput(void 
     bool fDropIt = false, fActive;
     PINTNETSG pSG;
 
+    CURVNET_SET_QUIET(ifp->if_vnet);
     vboxNetFltRetain(pThis, true /* fBusy */);
     for (;;)
     {
@@ -438,6 +445,7 @@ static void vboxNetFltFreeBSDinput(void 
             ether_demux(ifp, m);
     }
     vboxNetFltRelease(pThis, true /* fBusy */);
+    CURVNET_RESTORE();
 }
 
 /**
@@ -452,6 +460,7 @@ static void vboxNetFltFreeBSDoutput(void
     bool fDropIt = false, fActive;
     PINTNETSG pSG;
 
+    CURVNET_SET_QUIET(ifp->if_vnet);
     vboxNetFltRetain(pThis, true /* fBusy */);
     for (;;)
     {
@@ -481,6 +490,7 @@ static void vboxNetFltFreeBSDoutput(void
             ether_output_frame(ifp, m);
     }
     vboxNetFltRelease(pThis, true /* fBusy */);
+    CURVNET_RESTORE();
 }
 
 /**
@@ -498,6 +508,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS 
     int error;
 
     ifp = (void *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.ifp);
+    CURVNET_SET_QUIET(ifp->if_vnet);
 
     if (fDst & INTNETTRUNKDIR_WIRE)
     {
@@ -539,6 +550,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS 
         m->m_pkthdr.rcvif = ifp;
         ifp->if_input(ifp, m);
     }
+    CURVNET_RESTORE();
     return VINF_SUCCESS;
 }
 
@@ -556,6 +568,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLT
     node_p node;
     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
 
+    CURVNET_SET(CRED_TO_VNET(curthread->td_ucred));
     NOREF(pvContext);
     ifp = ifunit(pThis->szName);
     if (ifp == NULL)
@@ -602,6 +615,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLT
         pThis->pSwitchPort->pfnReportNoPreemptDsts(pThis->pSwitchPort, 0 /* none */);
         vboxNetFltRelease(pThis, true /*fBusy*/);
     }
+    CURVNET_RESTORE();
 
     return VINF_SUCCESS;
 }
@@ -611,6 +625,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
     struct ifnet *ifp, *ifp0;
 
     ifp = (struct ifnet *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.ifp);
+    CURVNET_SET_QUIET(ifp->if_vnet);
     /*
      * Attempt to check if the interface is still there and re-initialize if
      * something has changed.
@@ -628,6 +643,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
         vboxNetFltOsDeleteInstance(pThis);
         vboxNetFltOsInitInstance(pThis, NULL);
     }
+    CURVNET_RESTORE()
 
     return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost);
 }
@@ -669,6 +685,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
     Log(("%s: fActive:%d\n", __func__, fActive));
 
     ifp = (struct ifnet *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.ifp);
+    CURVNET_SET_QUIET(ifp->if_vnet);
     node = (node_p)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.node);
 
     memset(&ifreq, 0, sizeof(struct ifreq));
@@ -742,6 +759,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
         strlcpy(rm->ourhook, "output", NG_HOOKSIZ);
         NG_SEND_MSG_PATH(error, node, msg, path, 0);
     }
+    CURVNET_RESTORE();
 }
 
 int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)

--=-=-=--



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