VirtualBox

Changeset 31764 in vbox


Ignore:
Timestamp:
Aug 18, 2010 2:00:39 PM (14 years ago)
Author:
vboxsync
Message:

virtio-net: removed TX buffer along with redundant memcpy call

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

Legend:

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

    r31755 r31764  
    130130#endif
    131131
    132     /** transmit buffer */
    133     R3PTRTYPE(uint8_t*)     pTxBuf;
    134132    /**< Link Up(/Restore) Timer. */
    135133    PTMTIMERR3              pLinkUpTimer;
     
    962960        else
    963961        {
     962            unsigned int uSize = 0;
    964963            STAM_PROFILE_ADV_START(&pState->StatTransmit, a);
    965             /* Assemble a complete frame. */
    966             for (unsigned int i = 1; i < elem.nOut && uOffset < VNET_MAX_FRAME_SIZE; i++)
    967             {
    968                 unsigned int uSize = elem.aSegsOut[i].cb;
    969                 if (uSize > VNET_MAX_FRAME_SIZE - uOffset)
    970                 {
    971                     Log(("%s vnetQueueTransmit: Packet is too big (>64k), truncating...\n", INSTANCE(pState)));
    972                     uSize = VNET_MAX_FRAME_SIZE - uOffset;
    973                 }
    974                 PDMDevHlpPhysRead(pState->VPCI.CTX_SUFF(pDevIns), elem.aSegsOut[i].addr,
    975                                   pState->pTxBuf + uOffset, uSize);
    976                 uOffset += uSize;
    977             }
     964            /* Compute total frame size. */
     965            for (unsigned int i = 1; i < elem.nOut; i++)
     966                uSize += elem.aSegsOut[i].cb;
     967            Assert(uSize <= VNET_MAX_FRAME_SIZE);
    978968            if (pState->pDrv)
    979969            {
     
    986976                STAM_REL_COUNTER_INC(&pState->StatTransmitPackets);
    987977
    988                 vnetPacketDump(pState, pState->pTxBuf, uOffset, "--> Outgoing");
    989 
    990978                STAM_PROFILE_START(&pState->StatTransmitSend, a);
    991979
    992980                pGso = vnetSetupGsoCtx(&Gso, &Hdr);
    993                 if (pGso)
    994                     STAM_REL_COUNTER_INC(&pState->StatTransmitGSO);
    995                 else if (Hdr.u8Flags & VNETHDR_F_NEEDS_CSUM)
    996                 {
    997                     STAM_REL_COUNTER_INC(&pState->StatTransmitCSum);
    998                     /*
    999                      * This is not GSO frame but checksum offloading is requested.
    1000                      */
    1001                     vnetCompleteChecksum(pState->pTxBuf, uOffset, Hdr.u16CSumStart, Hdr.u16CSumOffset);
    1002                 }
    1003981                /** @todo Optimize away the extra copying! (lazy bird) */
    1004982                PPDMSCATTERGATHER pSgBuf;
    1005                 int rc = pState->pDrv->pfnAllocBuf(pState->pDrv, uOffset, pGso, &pSgBuf);
     983                int rc = pState->pDrv->pfnAllocBuf(pState->pDrv, uSize, pGso, &pSgBuf);
    1006984                if (RT_SUCCESS(rc))
    1007985                {
    1008986                    Assert(pSgBuf->cSegs == 1);
    1009                     memcpy(pSgBuf->aSegs[0].pvSeg, pState->pTxBuf, uOffset);
    1010                     pSgBuf->cbUsed = uOffset;
     987                    /* Assemble a complete frame. */
     988                    for (unsigned int i = 1; i < elem.nOut; i++)
     989                        PDMDevHlpPhysRead(pState->VPCI.CTX_SUFF(pDevIns), elem.aSegsOut[i].addr,
     990                                          ((uint8_t*)pSgBuf->aSegs[0].pvSeg) + uOffset,
     991                                          elem.aSegsOut[i].cb);
     992                    pSgBuf->cbUsed = uSize;
     993                    vnetPacketDump(pState, (uint8_t*)pSgBuf->aSegs[0].pvSeg, uSize, "--> Outgoing");
     994                    if (pGso)
     995                        STAM_REL_COUNTER_INC(&pState->StatTransmitGSO);
     996                    else if (Hdr.u8Flags & VNETHDR_F_NEEDS_CSUM)
     997                    {
     998                        STAM_REL_COUNTER_INC(&pState->StatTransmitCSum);
     999                        /*
     1000                         * This is not GSO frame but checksum offloading is requested.
     1001                         */
     1002                        vnetCompleteChecksum((uint8_t*)pSgBuf->aSegs[0].pvSeg, uSize,
     1003                                             Hdr.u16CSumStart, Hdr.u16CSumOffset);
     1004                    }
     1005
    10111006                    rc = pState->pDrv->pfnSendBuf(pState->pDrv, pSgBuf, false);
    10121007                }
     1008                else
     1009                    LogRel(("virtio-net: failed to allocate SG buffer: size=%u rc=%Rrc\n", uSize, rc));
    10131010
    10141011                STAM_PROFILE_STOP(&pState->StatTransmitSend, a);
     
    17561753    }
    17571754
    1758     if (pState->pTxBuf)
    1759     {
    1760         RTMemFree(pState->pTxBuf);
    1761         pState->pTxBuf = NULL;
    1762     }
    17631755    // if (PDMCritSectIsInitialized(&pState->csRx))
    17641756    //     PDMR3CritSectDelete(&pState->csRx);
     
    18221814    pState->INetworkConfig.pfnGetLinkState   = vnetGetLinkState;
    18231815    pState->INetworkConfig.pfnSetLinkState   = vnetSetLinkState;
    1824 
    1825     pState->pTxBuf = (uint8_t *)RTMemAllocZ(VNET_MAX_FRAME_SIZE);
    1826     AssertMsgReturn(pState->pTxBuf,
    1827                     ("Cannot allocate TX buffer for virtio-net device\n"), VERR_NO_MEMORY);
    18281816
    18291817    /* Initialize critical section. */
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp

    r30850 r31764  
    13781378    GEN_CHECK_OFF(VNETSTATE, pCanRxQueueR0);
    13791379    GEN_CHECK_OFF(VNETSTATE, pCanRxQueueRC);
    1380     GEN_CHECK_OFF(VNETSTATE, pTxBuf);
    13811380    GEN_CHECK_OFF(VNETSTATE, pLinkUpTimer);
    13821381# ifdef VNET_TX_DELAY
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