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
[-- Attachment #1 --]
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
[-- Attachment #2 --]
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>
