VirtualBox

Changeset 14196 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Nov 14, 2008 7:30:48 AM (16 years ago)
Author:
vboxsync
Message:

NAT: Linux build fix; added some perfcounters

Location:
trunk/src/VBox/Devices/Network
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r14195 r14196  
    179179{
    180180    PDRVNAT pThis = PDMINETWORKCONNECTOR_2_DRVNAT(pInterface);
     181    int rc;
    181182
    182183    LogFlow(("drvNATNotifyLinkChanged: enmLinkState=%d\n", enmLinkState));
     
    184185    LogRel(("drvNATNotifyLinkChanged\n"));
    185186#ifndef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
    186     int rc = RTCritSectEnter(&pThis->CritSect);
     187    rc = RTCritSectEnter(&pThis->CritSect);
    187188    AssertReleaseRC(rc);
    188189#endif
     
    196197#ifdef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
    197198# ifndef RT_OS_WINDOWS
    198             int rc = RTFileWrite(pThis->PipeWrite, "2", 2, NULL);
     199            rc = RTFileWrite(pThis->PipeWrite, "2", 2, NULL);
    199200            AssertRC(rc);
    200201# else
     
    210211#ifdef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
    211212# ifndef RT_OS_WINDOWS
    212             int rc = RTFileWrite(pThis->PipeWrite, "2", 2, NULL);
     213            rc = RTFileWrite(pThis->PipeWrite, "2", 2, NULL);
    213214            AssertRC(rc);
    214215# else
     
    267268    HANDLE  *phEvents;
    268269# endif
    269     const struct timeval TimeWait   = { 0, 2000 }; /* 2ms for the fast timer */
    270     const struct timeval TimeNoWait = { 0,    0 }; /* return immediately */
    271270
    272271    LogFlow(("drvNATAsyncIoThread: pThis=%p\n", pThis));
     
    284283    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    285284    {
    286         bool fWait = true;
    287285
    288286        FD_ZERO(&ReadFDs);
     
    296294        slirp_select_fill(pThis->pNATState, &nFDs, &ReadFDs, &WriteFDs, &XcptFDs);
    297295# ifndef RT_OS_WINDOWS
    298         struct timeval tv = fWait ? TimeWait : TimeNoWait;
    299         FD_SET(pThis->PipeRead, &ReadFDs); /* Linux only */
     296        struct timeval tv = { 0, 2000 }; /* 2ms */
     297        FD_SET(pThis->PipeRead, &ReadFDs);
    300298        nFDs = ((int)pThis->PipeRead < nFDs ? nFDs : pThis->PipeRead);
    301299        int cChangedFDs = select(nFDs + 1, &ReadFDs, &WriteFDs, &XcptFDs, &tv);
     
    315313                        slirp_input(pThis->pNATState, (uint8_t *)pThis->cBuffer, pThis->sBufferSize);
    316314                        RTSemEventSignal(pThis->semSndMutex);
    317                         fWait = 1;
    318315                        break;
    319316                    case '2':
     
    697694    if (RT_SUCCESS(rc))
    698695    {
     696        slirp_register_timers(pThis->pNATState, pDrvIns);
    699697        int rc2 = drvNATConstructRedir(pDrvIns->iInstance, pThis, pCfgHandle, Network);
    700698        if (RT_SUCCESS(rc2))
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r14194 r14196  
    2828
    2929int slirp_init(PNATState *, const char *, uint32_t, bool, const char *, const char *, void *);
     30void slirp_register_timers(PNATState pData, PPDMDRVINS pDrvIns);
    3031void slirp_term(PNATState);
    3132void slirp_link_up(PNATState);
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r14194 r14196  
    44#endif
    55
     6/* disable these counters for the final release */
     7/* #define VBOX_WITHOUT_RELEASE_STATISTICS */
     8
    69#include <VBox/err.h>
     10#include <VBox/stam.h>
     11#include <VBox/pdmdrv.h>
    712#include <iprt/assert.h>
    813
     
    250255
    251256/**
     257 * Statistics counters.
     258 */
     259void slirp_register_timers(PNATState pData, PPDMDRVINS pDrvIns)
     260{
     261#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
     262    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatFill, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS,
     263                           STAMUNIT_TICKS_PER_CALL, "Profiling slirp fills", "/Drivers/NAT%d/Fill", pDrvIns->iInstance);
     264    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatPoll, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS,
     265                           STAMUNIT_TICKS_PER_CALL, "Profiling slirp polls", "/Drivers/NAT%d/Poll", pDrvIns->iInstance);
     266    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatFastTimer, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS,
     267                           STAMUNIT_TICKS_PER_CALL, "Profiling slirp fast timer", "/Drivers/NAT%d/TimerFast", pDrvIns->iInstance);
     268    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatSlowTimer, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS,
     269                           STAMUNIT_TICKS_PER_CALL, "Profiling slirp slow timer", "/Drivers/NAT%d/TimerSlow", pDrvIns->iInstance);
     270    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatTCP, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS,
     271                           STAMUNIT_COUNT, "TCP sockets", "/Drivers/NAT%d/SockTCP", pDrvIns->iInstance);
     272    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatTCPHot, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS,
     273                           STAMUNIT_COUNT, "TCP sockets active", "/Drivers/NAT%d/SockTCPHot", pDrvIns->iInstance);
     274    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatUDP, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS,
     275                           STAMUNIT_COUNT, "UDP sockets", "/Drivers/NAT%d/SockUDP", pDrvIns->iInstance);
     276    PDMDrvHlpSTAMRegisterF(pDrvIns, &pData->StatTCPHot, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS,
     277                           STAMUNIT_COUNT, "UDP sockets active", "/Drivers/NAT%d/SockUDPHot", pDrvIns->iInstance);
     278#endif /* VBOX_WITHOUT_RELEASE_STATISTICS */
     279}
     280
     281/**
    252282 * Marks the link as up, making it possible to establish new connections.
    253283 */
     
    358388#endif
    359389
     390    STAM_REL_PROFILE_START(&pData->StatFill, a);
     391
    360392    nfds = *pnfds;
    361393        /*
     
    371403                               ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *)));
    372404
     405                STAM_REL_COUNTER_RESET(&pData->StatTCP);
     406                STAM_REL_COUNTER_RESET(&pData->StatTCPHot);
     407
    373408                for (so = tcb.so_next; so != &tcb; so = so_next) {
    374409                        so_next = so->so_next;
     410
     411                        STAM_REL_COUNTER_INC(&pData->StatTCP);
    375412
    376413                        /*
     
    391428                         */
    392429                        if (so->so_state & SS_FACCEPTCONN) {
     430                                STAM_REL_COUNTER_INC(&pData->StatTCPHot);
    393431#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    394432                                FD_SET(so->s, readfds);
     
    410448                         */
    411449                        if (so->so_state & SS_ISFCONNECTING) {
     450                                STAM_REL_COUNTER_INC(&pData->StatTCPHot);
    412451#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    413452                                FD_SET(so->s, writefds);
     
    426465                         */
    427466                        if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) {
     467                                STAM_REL_COUNTER_INC(&pData->StatTCPHot);
    428468#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    429469                                FD_SET(so->s, writefds);
     
    442482                         */
    443483                        if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) {
     484                                STAM_REL_COUNTER_INC(&pData->StatTCPHot);
    444485#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    445486                                FD_SET(so->s, readfds);
     
    463504                 * UDP sockets
    464505                 */
     506                STAM_REL_COUNTER_RESET(&pData->StatUDP);
     507                STAM_REL_COUNTER_RESET(&pData->StatUDPHot);
     508
    465509                for (so = udb.so_next; so != &udb; so = so_next) {
    466510                        so_next = so->so_next;
     511
     512                        STAM_REL_COUNTER_INC(&pData->StatUDP);
    467513
    468514                        /*
     
    488534                         */
    489535                        if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) {
     536                                STAM_REL_COUNTER_INC(&pData->StatUDPHot);
    490537#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    491538                                FD_SET(so->s, readfds);
     
    497544                                continue;
    498545#endif
     546                                STAM_REL_COUNTER_INC(&pData->StatUDPHot);
    499547                        }
    500548#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     
    547595        *pnfds = VBOX_EVENT_COUNT;
    548596#endif
     597
     598    STAM_REL_PROFILE_STOP(&pData->StatFill, a);
    549599}
    550600
     
    559609        int timer_update = (readfds == NULL && writefds == NULL && xfds == NULL);
    560610#endif
     611        STAM_REL_PROFILE_START(&pData->StatPoll, a);
    561612
    562613        /* Update time */
     
    568619        if (link_up) {
    569620                if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) {
     621                        STAM_REL_PROFILE_START(&pData->StatFastTimer, a);
    570622                        tcp_fasttimo(pData);
    571623                        time_fasttimo = 0;
     624                        STAM_REL_PROFILE_STOP(&pData->StatFastTimer, a);
    572625                }
    573626                if (do_slowtimo && ((curtime - last_slowtimo) >= 499)) {
     627                        STAM_REL_PROFILE_START(&pData->StatSlowTimer, a);
    574628                        ip_slowtimo(pData);
    575629                        tcp_slowtimo(pData);
    576630                        last_slowtimo = curtime;
     631                        STAM_REL_PROFILE_STOP(&pData->StatSlowTimer, a);
    577632                }
    578633        }
     
    598653                           continue;
    599654#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    600                         rc = WSAEnumNetworkEvents(so->s, VBOX_SOCKET_EVENT, &NetworkEvents);   
     655                        rc = WSAEnumNetworkEvents(so->s, so->hNetworkEvent, &NetworkEvents);
    601656                        if (rc == SOCKET_ERROR)
    602657                        {
     
    615670                        if (FD_ISSET(so->s, xfds))
    616671#else
     672                        /* out-of-band data */
    617673                        if ((NetworkEvents.lNetworkEvents & FD_OOB) && NetworkEvents.iErrorCode[FD_OOB_BIT] == 0)
    618674#endif
     
    761817        if (if_queued && link_up)
    762818           if_start(pData);
     819
     820        STAM_REL_PROFILE_STOP(&pData->StatPoll, a);
    763821}
    764822
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r14194 r14196  
    2121#ifndef _slirp_state_h_
    2222#define _slirp_state_h_
     23
     24#include <VBox/stam.h>
    2325
    2426/** Number of DHCP clients supported by NAT. */
     
    121123    HANDLE phEvents[VBOX_EVENT_COUNT];
    122124#endif
     125    STAMPROFILE StatFill;
     126    STAMPROFILE StatPoll;
     127    STAMPROFILE StatFastTimer;
     128    STAMPROFILE StatSlowTimer;
     129    STAMCOUNTER StatTCP;
     130    STAMCOUNTER StatUDP;
     131    STAMCOUNTER StatTCPHot;
     132    STAMCOUNTER StatUDPHot;
    123133} NATState;
    124134
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