VirtualBox

Changeset 7266 in vbox


Ignore:
Timestamp:
Mar 4, 2008 10:00:24 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
28604
Message:

Experiment with send buffering. (disabled)

File:
1 edited

Legend:

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

    r7230 r7266  
    249249    bool                                afAlignment[1];
    250250    uint32_t                            u32LinkSpeed;
     251
     252/* #define PCNET_QUEUE_SEND_PACKETS */
     253#ifdef PCNET_QUEUE_SEND_PACKETS
     254    #define PCNET_MAX_XMIT_SLOTS         128
     255    #define PCNET_MAX_XMIT_SLOTS_MASK    (PCNET_MAX_XMIT_SLOTS-1)
     256
     257    uint32_t                            ulXmitRingBufProd;
     258    uint32_t                            ulXmitRingBufCons;
     259    uint16_t                            cbXmitRingBuffer[PCNET_MAX_XMIT_SLOTS];
     260    R3PTRTYPE(char *)                   pXmitRingBuffer[PCNET_MAX_XMIT_SLOTS];
     261#endif
    251262
    252263    STAMCOUNTER                         StatReceiveBytes;
     
    578589        (R)->rmd2.rcc, (R)->rmd2.rpc, (R)->rmd2.mcnt,   \
    579590        (R)->rmd2.zeros))
     591
     592#ifdef PCNET_QUEUE_SEND_PACKETS
     593static int pcnetSyncTransmit(PCNetState *pData);
     594#endif
    580595
    581596/**
     
    18301845    /* Clear counter .*/
    18311846    ASMAtomicAndU32(&pData->cPendingSends, 0);
     1847#ifdef PCNET_QUEUE_SEND_PACKETS
     1848    pcnetSyncTransmit(pData);
     1849#else
    18321850    int rc = RTSemEventSignal(pData->hSendEventSem);
    18331851    AssertRC(rc);
     1852#endif
    18341853    return true;
    18351854}
     
    18921911DECLINLINE(int) pcnetXmitCompleteFrame(PCNetState *pData)
    18931912{
     1913#ifdef PCNET_QUEUE_SEND_PACKETS
     1914    Assert(!pData->cbXmitRingBuffer[pData->ulXmitRingBufProd]);
     1915    memcpy(pData->pXmitRingBuffer[pData->ulXmitRingBufProd], pData->SendFrame.pvBuf, pData->SendFrame.cb);
     1916    pData->cbXmitRingBuffer[pData->ulXmitRingBufProd] = (uint16_t)pData->SendFrame.cb;
     1917    pData->ulXmitRingBufProd                          = (pData->ulXmitRingBufProd+1) & PCNET_MAX_XMIT_SLOTS_MASK;
     1918
     1919    int rc = RTSemEventSignal(pData->hSendEventSem);
     1920    AssertRC(rc);
     1921
     1922    return VINF_SUCCESS;
     1923#else
    18941924    /* Don't hold the critical section while transmitting data. */
    18951925    /** @note also avoids deadlocks with NAT as it can call us right back. */
     
    18991929    if (pData->SendFrame.cb > 70) /* unqualified guess */
    19001930        pData->Led.Asserted.s.fWriting = pData->Led.Actual.s.fWriting = 1;
     1931
    19011932    pData->pDrv->pfnSend(pData->pDrv, pData->SendFrame.pvBuf, pData->SendFrame.cb);
    19021933    STAM_REL_COUNTER_ADD(&pData->StatTransmitBytes, pData->SendFrame.cb);
     
    19051936
    19061937    return PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED);
     1938#endif
    19071939}
    19081940
     
    20122044 * Try to transmit frames
    20132045 */
     2046#ifdef PCNET_QUEUE_SEND_PACKETS
    20142047static int pcnetAsyncTransmit(PCNetState *pData)
     2048{
     2049    Assert(PDMCritSectIsOwner(&pData->CritSect));
     2050
     2051    while (pData->cbXmitRingBuffer[pData->ulXmitRingBufCons])
     2052    {
     2053        /* Don't hold the critical section while transmitting data. */
     2054        /** @note also avoids deadlocks with NAT as it can call us right back. */
     2055        PDMCritSectLeave(&pData->CritSect);
     2056
     2057        STAM_PROFILE_ADV_START(&pData->StatTransmitSend, a);
     2058        if (pData->SendFrame.cb > 70) /* unqualified guess */
     2059            pData->Led.Asserted.s.fWriting = pData->Led.Actual.s.fWriting = 1;
     2060
     2061        pData->pDrv->pfnSend(pData->pDrv, pData->pXmitRingBuffer[pData->ulXmitRingBufCons], pData->cbXmitRingBuffer[pData->ulXmitRingBufCons]);
     2062        STAM_REL_COUNTER_ADD(&pData->StatTransmitBytes, pData->cbXmitRingBuffer[pData->ulXmitRingBufCons]);
     2063        pData->Led.Actual.s.fWriting = 0;
     2064        STAM_PROFILE_ADV_STOP(&pData->StatTransmitSend, a);
     2065
     2066        PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED);
     2067
     2068        pData->cbXmitRingBuffer[pData->ulXmitRingBufCons] = 0;
     2069        pData->ulXmitRingBufCons                          = (pData->ulXmitRingBufCons+1) & PCNET_MAX_XMIT_SLOTS_MASK;
     2070    }
     2071    return VINF_SUCCESS;
     2072}
     2073
     2074static int pcnetSyncTransmit(PCNetState *pData)
     2075#else
     2076static int pcnetAsyncTransmit(PCNetState *pData)
     2077#endif
    20152078{
    20162079    unsigned cFlushIrq = 0;
     
    42804343        PDMR3CritSectDelete(&pData->CritSect);
    42814344    }
     4345#ifdef PCNET_QUEUE_SEND_PACKETS
     4346    if (pData->pXmitRingBuffer)
     4347        RTMemFree(pData->pXmitRingBuffer[0]);
     4348#endif
    42824349    return VINF_SUCCESS;
    42834350}
     
    45704637    AssertRCReturn(rc, rc);
    45714638
     4639    unsigned i;
     4640#ifdef PCNET_QUEUE_SEND_PACKETS
     4641    pData->ulXmitRingBufProd   = 0;
     4642    pData->ulXmitRingBufCons   = 0;
     4643    pData->pXmitRingBuffer[0]  = (char *)RTMemAlloc(PCNET_MAX_XMIT_SLOTS * 1536);
     4644    pData->cbXmitRingBuffer[0] = 0;
     4645    for (i=1;i<PCNET_MAX_XMIT_SLOTS;i++)
     4646    {
     4647        pData->pXmitRingBuffer[i]  = pData->pXmitRingBuffer[i-1] + 1536;
     4648        pData->cbXmitRingBuffer[i] = 0;
     4649    }
     4650#endif
     4651
    45724652#ifdef VBOX_WITH_STATISTICS
    45734653    PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatMMIOReadGC,         STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling MMIO reads in GC",         "/Devices/PCNet%d/MMIO/ReadGC", iInstance);
     
    45994679    PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatTmdStoreHC,         STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling PCNet TmdStore in HC",     "/Devices/PCNet%d/TmdStoreHC", iInstance);
    46004680
    4601     unsigned i;
    46024681    for (i = 0; i < ELEMENTS(pData->aStatXmitFlush) - 1; i++)
    46034682        PDMDevHlpSTAMRegisterF(pDevIns, &pData->aStatXmitFlush[i],  STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES, "",                                       "/Devices/PCNet%d/XmitFlushIrq/%d", iInstance, i + 1);
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