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>