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

Reply via email to