Hello Mr. Urakov
I have good news and bad news.
Good news:
I have tested your patch and ported it to v5.0-BETA1. (Attached.)
Bad news: performance is the SAME.
Host: Debian 6 x64. + KDE + VBox GUI + Intel Core i7 2600K + 16 GB RAM.
I have created a new VM with interface = Host only adapter "vboxnet0",
then cloned it. Guest RAM = 64 MB.
Guest HDD is empty. So boot fails immediately.
Command to clone 70 VMs:
$ for i in `seq 1 70`; do VBoxManage clonevm "ZeroVM" --mode all
--register --name "ZeroVM Clone $i"; done
70 VMs, Host-only-interface mode:
unpatched:
2:30 min boot. -- 2:33 min (2nd run)
patched: (slower by margin of error)
2:35 min boot. .. 2:34 (2nd run)
NOTE: I have started all VMs by assigning them to VM group: "Hostif
group" and started VM group via GUI.
Timed manually from smartphone, so 1 second mistake is possible. (not
via host OS timer)
--
-Alexey Eromenko "Technologov"
P.S. That's it !
diff -uNr -U 6 vbox-orig/VirtualBox-5.0.0_BETA1//src/VBox/Main/include/HostImpl.h vbox-hostimpl/VirtualBox-5.0.0_BETA1//src/VBox/Main/include/HostImpl.h
--- vbox-orig/VirtualBox-5.0.0_BETA1//src/VBox/Main/include/HostImpl.h 2015-04-01 12:15:10.000000000 -0400
+++ vbox-hostimpl/VirtualBox-5.0.0_BETA1//src/VBox/Main/include/HostImpl.h 2015-04-10 23:28:36.000000000 -0400
@@ -16,12 +16,13 @@
*/
#ifndef ____H_HOSTIMPL
#define ____H_HOSTIMPL
#include "HostWrap.h"
+#include "HostNetworkInterfaceImpl.h"
class HostUSBDeviceFilter;
class USBProxyService;
class SessionMachine;
class Progress;
class PerformanceCollector;
@@ -77,12 +78,13 @@
HRESULT i_onUSBDeviceFilterChange(HostUSBDeviceFilter *aFilter, BOOL aActiveChanged = FALSE);
void i_getUSBFilters(USBDeviceFilterList *aGlobalFiltes);
HRESULT i_checkUSBProxyService();
#endif /* !VBOX_WITH_USB */
+ static HRESULT i_getNetIfList(HostNetworkInterfaceList &list);
static void i_generateMACAddress(Utf8Str &mac);
private:
// wrapped IHost properties
HRESULT getDVDDrives(std::vector<ComPtr<IMedium> > &aDVDDrives);
@@ -158,13 +160,13 @@
#if defined(RT_OS_SOLARIS)
void i_getDVDInfoFromDevTree(std::list< ComObjPtr<Medium> > &list);
void i_parseMountTable(char *mountTable, std::list< ComObjPtr<Medium> > &list);
bool i_validateDevice(const char *deviceNode, bool isCDROM);
#endif
- HRESULT i_updateNetIfList();
+ HRESULT i_updateNetIfList(HostNetworkInterfaceList &list);
#ifndef RT_OS_WINDOWS
HRESULT i_parseResolvConf();
#else
HRESULT i_fetchNameResolvingInformation();
#endif
diff -uNr -U 6 vbox-orig/VirtualBox-5.0.0_BETA1//src/VBox/Main/src-server/HostImpl.cpp vbox-hostimpl/VirtualBox-5.0.0_BETA1//src/VBox/Main/src-server/HostImpl.cpp
--- vbox-orig/VirtualBox-5.0.0_BETA1//src/VBox/Main/src-server/HostImpl.cpp 2015-04-01 12:15:13.000000000 -0400
+++ vbox-hostimpl/VirtualBox-5.0.0_BETA1//src/VBox/Main/src-server/HostImpl.cpp 2015-04-11 00:03:27.000000000 -0400
@@ -294,14 +294,16 @@
#endif /* VBOX_WITH_USB */
#ifdef VBOX_WITH_RESOURCE_USAGE_API
i_registerMetrics(aParent->i_performanceCollector());
#endif /* VBOX_WITH_RESOURCE_USAGE_API */
/* Create the list of network interfaces so their metrics get registered. */
- i_updateNetIfList();
-
+ HostNetworkInterfaceList list;
+ HRESULT rc = i_getNetIfList(list);
+ if (RT_SUCCESS(rc))
+ i_updateNetIfList(list);
m->hostDnsMonitorProxy.init(HostDnsMonitor::getHostDnsMonitor(), m->pParent);
#if defined(RT_OS_WINDOWS)
m->pHostPowerService = new HostPowerServiceWin(m->pParent);
#elif defined(RT_OS_DARWIN)
m->pHostPowerService = new HostPowerServiceDarwin(m->pParent);
@@ -348,13 +350,13 @@
{
if ( (fFeaturesEcx & X86_CPUID_FEATURE_ECX_VMX)
&& (fFeaturesEdx & X86_CPUID_FEATURE_EDX_MSR)
&& (fFeaturesEdx & X86_CPUID_FEATURE_EDX_FXSR)
)
{
- int rc = SUPR3QueryVTxSupported();
+ rc = SUPR3QueryVTxSupported();
if (RT_SUCCESS(rc))
m->fVTSupported = true;
}
}
/* AMD-V */
else if (ASMIsAmdCpuEx(uVendorEBX, uVendorECX, uVendorEDX))
@@ -380,13 +382,13 @@
}
}
/* Check with SUPDrv if VT-x and AMD-V are really supported (may fail). */
if (m->fVTSupported)
{
- int rc = SUPR3InitEx(false /*fUnrestricted*/, NULL);
+ rc = SUPR3InitEx(false /*fUnrestricted*/, NULL);
if (RT_SUCCESS(rc))
{
uint32_t fVTCaps;
rc = SUPR3QueryVTCaps(&fVTCaps);
if (RT_SUCCESS(rc))
{
@@ -610,26 +612,31 @@
* @returns COM status code
* @param drives address of result pointer
*/
HRESULT Host::getNetworkInterfaces(std::vector<ComPtr<IHostNetworkInterface> > &aNetworkInterfaces)
{
#if defined(RT_OS_WINDOWS) || defined(VBOX_WITH_NETFLT) /*|| defined(RT_OS_OS2)*/
+# ifdef VBOX_WITH_HOSTNETIF_API
+ HostNetworkInterfaceList list;
+ HRESULT rc = i_getNetIfList(list);
+
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-# ifdef VBOX_WITH_HOSTNETIF_API
- int rc = i_updateNetIfList();
- if (rc)
+ if (RT_SUCCESS(rc))
+ rc = i_updateNetIfList(list);
+ if (RT_FAILURE(rc))
Log(("Failed to get host network interface list with rc=%Rrc\n", rc));
aNetworkInterfaces.resize(m->llNetIfs.size());
size_t i = 0;
for (HostNetworkInterfaceList::iterator it = m->llNetIfs.begin(); it != m->llNetIfs.end(); ++it, ++i)
(*it).queryInterfaceTo(aNetworkInterfaces[i].asOutParam());
return S_OK;
# else
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
std::list<ComObjPtr<HostNetworkInterface> > list;
# if defined(RT_OS_DARWIN)
PDARWINETHERNIC pEtherNICs = DarwinGetEthernetControllers();
while (pEtherNICs)
{
@@ -1482,18 +1489,22 @@
#ifndef VBOX_WITH_HOSTNETIF_API
return E_NOTIMPL;
#else
if (!aName.length())
return E_INVALIDARG;
- AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
aNetworkInterface = NULL;
ComObjPtr<HostNetworkInterface> found;
- int rc = i_updateNetIfList();
+ HostNetworkInterfaceList list;
+ HRESULT rc = i_getNetIfList(list);
+
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ if (RT_SUCCESS(rc))
+ rc = i_updateNetIfList(list);
if (RT_FAILURE(rc))
{
Log(("Failed to get host network interface list with rc=%Rrc\n", rc));
return E_FAIL;
}
for (HostNetworkInterfaceList::iterator it = m->llNetIfs.begin(); it != m->llNetIfs.end(); ++it)
@@ -1518,18 +1529,22 @@
#ifndef VBOX_WITH_HOSTNETIF_API
return E_NOTIMPL;
#else
if (!aId.isValid())
return E_INVALIDARG;
- AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
aNetworkInterface = NULL;
ComObjPtr<HostNetworkInterface> found;
- int rc = i_updateNetIfList();
+ HostNetworkInterfaceList list;
+ HRESULT rc = i_getNetIfList(list);
+
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ if (RT_SUCCESS(rc))
+ rc = i_updateNetIfList(list);
if (RT_FAILURE(rc))
{
Log(("Failed to get host network interface list with rc=%Rrc\n", rc));
return E_FAIL;
}
HostNetworkInterfaceList::iterator it;
@@ -1550,14 +1565,18 @@
}
HRESULT Host::findHostNetworkInterfacesOfType(HostNetworkInterfaceType_T aType,
std::vector<ComPtr<IHostNetworkInterface> > &aNetworkInterfaces)
{
#ifdef VBOX_WITH_HOSTNETIF_API
+ HostNetworkInterfaceList list;
+ HRESULT rc = i_getNetIfList(list);
+
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- int rc = i_updateNetIfList();
+ if (RT_SUCCESS(rc))
+ rc = i_updateNetIfList(list);
if (RT_FAILURE(rc))
return E_FAIL;
HostNetworkInterfaceList resultList;
for (HostNetworkInterfaceList::iterator it = m->llNetIfs.begin(); it != m->llNetIfs.end(); ++it)
@@ -2944,28 +2963,20 @@
}
return S_OK;
}
#endif /* VBOX_WITH_USB */
-HRESULT Host::i_updateNetIfList()
+HRESULT Host::i_updateNetIfList(HostNetworkInterfaceList &list)
{
#ifdef VBOX_WITH_HOSTNETIF_API
AssertReturn( getObjectState().getState() == ObjectState::InInit
|| isWriteLockOnCurrentThread(), E_FAIL);
-
- HostNetworkInterfaceList list, listCopy;
- int rc = NetIfList(list);
- if (rc)
- {
- Log(("Failed to get host network interface list with rc=%Rrc\n", rc));
- return E_FAIL;
- }
AssertReturn(m->pParent, E_FAIL);
/* Make a copy as the original may be partially destroyed later. */
- listCopy = list;
+ HostNetworkInterfaceList listCopy = list;
HostNetworkInterfaceList::iterator itOld, itNew;
# ifdef VBOX_WITH_RESOURCE_USAGE_API
PerformanceCollector *aCollector = m->pParent->i_performanceCollector();
# endif
for (itOld = m->llNetIfs.begin(); itOld != m->llNetIfs.end(); ++itOld)
{
@@ -3002,13 +3013,13 @@
HostNetworkInterfaceType_T t;
HRESULT hr = (*itNew)->COMGETTER(InterfaceType)(&t);
if (FAILED(hr))
{
Bstr n;
(*itNew)->COMGETTER(Name)(n.asOutParam());
- LogRel(("Host::updateNetIfList: failed to get interface type for %ls\n", n.raw()));
+ LogRel(("Host::i_updateNetIfList: failed to get interface type for %ls\n", n.raw()));
}
else if (t == HostNetworkInterfaceType_Bridged)
{
# ifdef VBOX_WITH_RESOURCE_USAGE_API
(*itNew)->i_registerMetrics(aCollector, this);
# endif
@@ -3018,12 +3029,25 @@
return S_OK;
#else
return E_NOTIMPL;
#endif
}
+/* static */
+HRESULT Host::i_getNetIfList(HostNetworkInterfaceList &list)
+{
+#ifdef VBOX_WITH_HOSTNETIF_API
+ HRESULT rc = NetIfList(list);
+ if (rc)
+ Log(("Failed to get host network interface list with rc=%Rrc\n", rc));
+ return rc;
+#else
+ return E_NOTIMPL;
+#endif
+}
+
#ifdef VBOX_WITH_RESOURCE_USAGE_API
void Host::i_registerDiskMetrics(PerformanceCollector *aCollector)
{
pm::CollectorHAL *hal = aCollector->getHAL();
/* Create sub metrics */
_______________________________________________
vbox-dev mailing list
[email protected]
https://www.virtualbox.org/mailman/listinfo/vbox-dev