VirtualBox

Changeset 40712 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 29, 2012 3:33:43 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77171
Message:

NetShaper: Online bandwidth limit setting (#5582)

Location:
trunk/src/VBox
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/ConsoleImpl.cpp

    r40633 r40712  
    9696# include <VBox/vmm/pdmusb.h>
    9797#endif
     98#ifdef VBOX_WITH_NETSHAPER
     99# include <VBox/vmm/pdmnetshaper.h>
     100#endif /* VBOX_WITH_NETSHAPER */
    98101#include <VBox/vmm/mm.h>
    99102#include <VBox/vmm/ftm.h>
     
    51525155            ULONG cMax;
    51535156            Bstr strName;
     5157            BandwidthGroupType_T enmType;
    51545158            rc = aBandwidthGroup->COMGETTER(Name)(strName.asOutParam());
    51555159            if (SUCCEEDED(rc))
    51565160                rc = aBandwidthGroup->COMGETTER(MaxMbPerSec)(&cMax);
     5161            if (SUCCEEDED(rc))
     5162                rc = aBandwidthGroup->COMGETTER(Type)(&enmType);
    51575163
    51585164            if (SUCCEEDED(rc))
    51595165            {
    5160                 int vrc;
    5161                 vrc = PDMR3AsyncCompletionBwMgrSetMaxForFile(ptrVM, Utf8Str(strName).c_str(),
    5162                                                              cMax * _1M);
     5166                int vrc = VINF_SUCCESS;
     5167                if (enmType == BandwidthGroupType_Disk)
     5168                    vrc = PDMR3AsyncCompletionBwMgrSetMaxForFile(ptrVM, Utf8Str(strName).c_str(),
     5169                                                                 cMax * _1M);
     5170                else if (enmType == BandwidthGroupType_Network)
     5171                    vrc = PDMR3NsBwGroupSetLimit(ptrVM, Utf8Str(strName).c_str(),
     5172                                                                 cMax * 1000);
     5173                else
     5174                    rc = E_NOTIMPL;
    51635175                AssertRC(vrc);
    51645176            }
  • trunk/src/VBox/VMM/VMMR3/PDMNetShaper.cpp

    r40706 r40712  
    152152#endif
    153153
     154static void pdmNsBwGroupSetLimit(PPDMNSBWGROUP pBwGroup, uint32_t cbTransferPerSecMax)
     155{
     156    pBwGroup->cbTransferPerSecMax = cbTransferPerSecMax;
     157    pBwGroup->cbBucketSize        = RT_MAX(PDM_NETSHAPER_MIN_BUCKET_SIZE,
     158                                           cbTransferPerSecMax * PDM_NETSHAPER_MAX_LATENCY / 1000);
     159    LogFlowFunc(("New rate limit is %d bytes per second, adjusted bucket size to %d bytes\n",
     160                 pBwGroup->cbTransferPerSecMax, pBwGroup->cbBucketSize));
     161}
     162
    154163static int pdmNsBwGroupCreate(PPDMNETSHAPER pShaper, const char *pcszBwGroup, uint32_t cbTransferPerSecMax)
    155164{
     
    179188                    pBwGroup->cRefs                 = 0;
    180189
    181                     pBwGroup->cbTransferPerSecMax   = cbTransferPerSecMax;
    182                     pBwGroup->cbBucketSize          = RT_MAX(PDM_NETSHAPER_MIN_BUCKET_SIZE,
    183                                                              cbTransferPerSecMax * PDM_NETSHAPER_MAX_LATENCY / 1000);
     190                    pdmNsBwGroupSetLimit(pBwGroup, cbTransferPerSecMax);
     191;
    184192                    pBwGroup->cbTokensLast          = pBwGroup->cbBucketSize;
    185193                    pBwGroup->tsUpdatedLast         = RTTimeSystemNanoTS();
     
    231239    {
    232240        bool fChoked = ASMAtomicXchgBool(&pFilter->fChoked, false);
    233         LogFlowFunc(("pFilter=%#p fChoked=%RTbool\n", pFilter, fChoked));
     241        Log3((LOG_FN_FMT ": pFilter=%#p fChoked=%RTbool\n", __PRETTY_FUNCTION__, pFilter, fChoked));
    234242        if (fChoked && pFilter->pIDrvNet)
    235243        {
     
    337345}
    338346
    339 bool PDMR3NsAllocateBandwidth(PPDMNSFILTER pFilter, uint32_t cbTransfer)
     347VMMR3DECL(bool) PDMR3NsAllocateBandwidth(PPDMNSFILTER pFilter, uint32_t cbTransfer)
    340348{
    341349    AssertPtrReturn(pFilter, VERR_INVALID_POINTER);
     
    363371
    364372    rc = RTCritSectLeave(&pBwGroup->cs); AssertRC(rc);
    365     LogFlowFunc(("BwGroup=%#p{%s} cbTransfer=%u uTokens=%u uTokensAdded=%u fAllowed=%RTbool\n",
    366                 pBwGroup, pBwGroup->pszName, cbTransfer, uTokens, uTokensAdded, fAllowed));
     373    Log2((LOG_FN_FMT "BwGroup=%#p{%s} cbTransfer=%u uTokens=%u uTokensAdded=%u fAllowed=%RTbool\n",
     374          __PRETTY_FUNCTION__, pBwGroup, pBwGroup->pszName, cbTransfer, uTokens, uTokensAdded, fAllowed));
    367375    return fAllowed;
    368376}
     377
     378VMMR3DECL(int) PDMR3NsBwGroupSetLimit(PVM pVM, const char *pcszBwGroup, uint32_t cbTransferPerSecMax)
     379{
     380    PUVM pUVM = pVM->pUVM;
     381    PPDMNETSHAPER pShaper = pUVM->pdm.s.pNetShaper;
     382
     383    int rc = RTCritSectEnter(&pShaper->cs); AssertRC(rc);
     384    if (RT_SUCCESS(rc))
     385    {
     386        PPDMNSBWGROUP pBwGroup = pdmNsBwGroupFindById(pShaper, pcszBwGroup);
     387        if (pBwGroup)
     388        {
     389            rc = RTCritSectEnter(&pBwGroup->cs); AssertRC(rc);
     390            pdmNsBwGroupSetLimit(pBwGroup, cbTransferPerSecMax);
     391            /* Drop extra tokens */
     392            if (pBwGroup->cbTokensLast > pBwGroup->cbBucketSize)
     393                pBwGroup->cbTokensLast = pBwGroup->cbBucketSize;
     394            rc = RTCritSectLeave(&pBwGroup->cs); AssertRC(rc);
     395        }
     396        rc = RTCritSectLeave(&pShaper->cs); AssertRC(rc);
     397    }
     398    return rc;
     399}
     400
    369401
    370402/**
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