VirtualBox

Changeset 30421 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 24, 2010 11:59:49 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63055
Message:

NAT: small performance enhancement (allocate intermediate buffer only if it's required).

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

Legend:

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

    r30349 r30421  
    284284    AssertRC(rc);
    285285
    286     slirp_ext_m_free(pThis->pNATState, m);
    287     RTMemFree(pu8Buf);
     286    slirp_ext_m_free(pThis->pNATState, m, pu8Buf);
    288287    if (ASMAtomicDecU32(&pThis->cUrgPkts) == 0)
    289288    {
     
    329328
    330329done_unlocked:
    331     slirp_ext_m_free(pThis->pNATState, m);
    332     RTMemFree(pu8Buf);
     330    slirp_ext_m_free(pThis->pNATState, m, pu8Buf);
    333331    ASMAtomicDecU32(&pThis->cPkts);
    334332
     
    352350    {
    353351        Assert(!pSgBuf->pvUser);
    354         slirp_ext_m_free(pThis->pNATState, (struct mbuf *)pSgBuf->pvAllocator);
     352        slirp_ext_m_free(pThis->pNATState, (struct mbuf *)pSgBuf->pvAllocator, NULL);
    355353        pSgBuf->pvAllocator = NULL;
    356354    }
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r30016 r30421  
    127127
    128128struct mbuf *slirp_ext_m_get(PNATState pData, size_t cbMin, void **ppvBuf, size_t *pcbBuf);
    129 void slirp_ext_m_free(PNATState pData, struct mbuf *);
     129void slirp_ext_m_free(PNATState pData, struct mbuf *, uint8_t *pu8Buf);
    130130
    131131/*
  • trunk/src/VBox/Devices/Network/slirp/misc.c

    r30016 r30421  
    418418}
    419419
    420 void slirp_ext_m_free(PNATState pData, struct mbuf *m)
    421 {
     420void slirp_ext_m_free(PNATState pData, struct mbuf *m, uint8_t *pu8Buf)
     421{
     422   
     423    if (   !pu8Buf
     424        && pu8Buf != mtod(m, uint8_t *))
     425        RTMemFree(pu8Buf); /* This buffer was allocated on heap */
    422426    m_freem(pData, m);
    423427}
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r30363 r30421  
    15381538    struct ethhdr *eh;
    15391539    uint8_t *buf = NULL;
     1540    uint8_t *mbuf = NULL;
    15401541    size_t mlen = 0;
    15411542    STAM_PROFILE_START(&pData->StatIF_encap, a);
     
    15451546    m->m_len += ETH_HLEN;
    15461547    eh = mtod(m, struct ethhdr *);
     1548    mlen = m_length(m, NULL);
    15471549
    15481550    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) != 0)
     
    15581560        }
    15591561    }
    1560     mlen = m_length(m, NULL);
    1561     buf = RTMemAlloc(mlen);
    1562     if (!buf)
    1563     {
    1564         LogRel(("NAT: Can't alloc memory for outgoing buffer\n"));
    1565         m_freem(pData, m);
    1566         goto done;
    1567     }
     1562    if (m->m_next)
     1563    {
     1564        buf = RTMemAlloc(mlen);
     1565        if (!buf)
     1566        {
     1567            LogRel(("NAT: Can't alloc memory for outgoing buffer\n"));
     1568            m_freem(pData, m);
     1569            goto done;
     1570        }
     1571        mbuf = buf;
     1572        m_copydata(m, 0, mlen, (char *)buf);
     1573    }
     1574    else
     1575        mbuf = mtod(m, uint8_t *);
    15681576    eh->h_proto = RT_H2N_U16(eth_proto);
    1569     m_copydata(m, 0, mlen, (char *)buf);
    15701577    if (flags & ETH_ENCAP_URG)
    1571         slirp_urg_output(pData->pvUser, m, buf, mlen);
     1578        slirp_urg_output(pData->pvUser, m, mbuf, mlen);
    15721579    else
    1573         slirp_output(pData->pvUser, m, buf, mlen);
     1580        slirp_output(pData->pvUser, m, mbuf, mlen);
    15741581done:
    15751582    STAM_PROFILE_STOP(&pData->StatIF_encap, a);
Note: See TracChangeset for help on using the changeset viewer.

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