VirtualBox

Changeset 106129 in vbox


Ignore:
Timestamp:
Sep 23, 2024 11:46:42 PM (5 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164907
Message:

Devices/Network: Fix windows slow packet throughput by kicking NAT thread more regularly. bugref:10268

Location:
trunk/src/VBox/Devices
Files:
2 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Makefile.kmk

    r106061 r106129  
    777777  VBoxDD_DEFS   += VBOX_WITH_LIBSLIRP
    778778  VBoxDD_SOURCES += \
    779         Network/DrvNATlibslirp.cpp
     779        Network/DrvNATlibslirp.cpp \
     780        Network/RTWinPollLibslirp.cpp
    780781  Network/DrvNATlibslirp.cpp_INCS   += \
    781782        $(PATH_ROOT)/src/libs/libslirp-4.8.0/src \
  • trunk/src/VBox/Devices/Network/DrvNATlibslirp.cpp

    r106061 r106129  
    5858#ifdef RT_OS_WINDOWS
    5959# include <iprt/win/winsock2.h>
     60# include "winpoll.h"
    6061# define inet_aton(x, y) inet_pton(2, x, y)
    6162# define AF_INET6 23
     
    9394#define DRVNAT_MAXFRAMESIZE (16 * 1024)
    9495#define DRVNAT_DEFAULT_TIMEOUT (3600*1000)
    95 
    96 /**
    97  * @todo: This is a bad hack to prevent freezing the guest during high network
    98  *        activity. Windows host only. This needs to be fixed properly.
    99  */
    100 #define VBOX_NAT_DELAY_HACK
    10196
    10297#define GET_EXTRADATA(pdrvins, node, name, rc, type, type_name, var)                                  \
     
    609604    rc = RTPipeWrite(pThis->hPipeWrite, "", 1, &cbIgnored);
    610605#else
    611     RT_NOREF(pThis);
     606    /* kick WSAWaitForMultipleEvents */
     607    rc = WSASetEvent(pThis->hWakeupEvent);
    612608#endif
    613609    AssertRC(rc);
     
    708704{
    709705    PDRVNAT pThis = PDMINS_2_DATA(pDrvIns, PDRVNAT);
    710 #ifdef RT_OS_WINDOWS
     706#ifdef VBOX_NAT_DELAY_HACK
    711707    unsigned int cBreak = 0;
    712 #else /* RT_OS_WINDOWS */
     708#endif
     709#ifndef RT_OS_WINDOWS
    713710    unsigned int cPollNegRet = 0;
    714711    drvNAT_AddPollCb(RTPipeToNative(pThis->hPipeRead), SLIRP_POLL_IN | SLIRP_POLL_HUP, pThis);
     
    789786        drvNAT_UpdateTimeout(&uTimeout, pThis);
    790787
    791         int cChangedFDs = WSAPoll(pThis->pNATState->polls, pThis->pNATState->nsock, uTimeout /* timeout */);
    792         int error = WSAGetLastError();
    793 
    794         if (cChangedFDs < 0)
     788        int cChangedFDs;
     789        int error = RTWinPoll(pThis->pNATState->polls, pThis->pNATState->nsock, uTimeout /* timeout */, &cChangedFDs, pThis->hWakeupEvent);
     790
     791        if (error != 0)
    795792        {
    796793            LogFlow(("NAT: WSAPoll returned %d (error %d)\n", cChangedFDs, error));
    797794            LogFlow(("NSOCK = %d\n", pThis->pNATState->nsock));
    798 
    799             if (error == 10022)
    800                 RTThreadSleep(100);
    801795        }
    802796
     
    16991693
    17001694#ifndef RT_OS_WINDOWS
    1701     /**
    1702      * Create the control pipe.
    1703      */
     1695    // Create the control pipe.
    17041696    rc = RTPipeCreate(&pThis->hPipeRead, &pThis->hPipeWrite, 0 /*fFlags*/);
    17051697    AssertRCReturn(rc, rc);
     1698#else
     1699    // Create the wakeup event handle.
     1700    pThis->hWakeupEvent = NULL;
     1701    pThis->hWakeupEvent = CreateEvent(NULL, FALSE, FALSE, NULL); /* auto-reset event */
     1702    Assert(pThis->hWakeupEvent != NULL);
    17061703#endif
    17071704
  • trunk/src/VBox/Devices/Network/RTWinPollLibslirp.cpp

    r106112 r106129  
    2525 * SPDX-License-Identifier: GPL-3.0-only
    2626 */
    27 #define LOG_GROUP LOG_GROUP_NAT_SERVICE
     27#define LOG_GROUP LOG_GROUP_DRV_NAT
    2828
    2929#include <iprt/asm.h>
     
    4242static HANDLE g_hNetworkEvent;
    4343
    44 int
    45 RTWinPoll(struct pollfd *pFds, unsigned int nfds, int timeout, int *pNready)
     44int RTWinPoll(struct pollfd *pFds, unsigned int nfds, int timeout, int *pNready, HANDLE phControl)
    4645{
    4746    AssertPtrReturn(pFds, VERR_INVALID_PARAMETER);
     47    HANDLE pHandleArr[] = {phControl, g_hNetworkEvent};
    4848
    4949    if (g_hNetworkEvent == WSA_INVALID_EVENT)
     
    8989    }
    9090
    91     DWORD index = WSAWaitForMultipleEvents(1,
    92                                            &g_hNetworkEvent,
     91    DWORD index = WSAWaitForMultipleEvents(2,
     92                                           pHandleArr,
    9393                                           FALSE,
    9494                                           timeout == RT_INDEFINITE_WAIT ? WSA_INFINITE : timeout,
  • trunk/src/VBox/Devices/Network/winpoll.h

    r106112 r106129  
    5959#endif
    6060RT_C_DECLS_BEGIN
    61 int RTWinPoll(struct pollfd *pFds, unsigned int nfds, int timeout, int *pNready);
     61int RTWinPoll(struct pollfd *pFds, unsigned int nfds, int timeout, int *pNready, HANDLE phControl);
    6262RT_C_DECLS_END
    6363#endif /* !VBOX_INCLUDED_SRC_NAT_winpoll_h */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette