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 vbox-dev@virtualbox.org https://www.virtualbox.org/mailman/listinfo/vbox-dev