VirtualBox

Changeset 108460 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Mar 5, 2025 5:33:56 PM (2 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167834
Message:

VMM/PDMAsyncCompletion: Use 64-bit types for the bandwidth group limits, ticketref:22328

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PDMAsyncCompletion.cpp

    r106061 r108460  
    139139    char                                       *pszId;
    140140    /** Maximum number of bytes the endpoints are allowed to transfer (Max is 4GB/s currently) */
    141     volatile uint32_t                           cbTransferPerSecMax;
     141    volatile uint64_t                           cbTransferPerSecMax;
    142142    /** Number of bytes we start with */
    143     volatile uint32_t                           cbTransferPerSecStart;
     143    volatile uint64_t                           cbTransferPerSecStart;
    144144    /** Step after each update */
    145     volatile uint32_t                           cbTransferPerSecStep;
     145    volatile uint64_t                           cbTransferPerSecStep;
    146146    /** Number of bytes we are allowed to transfer till the next update.
    147147     * Reset by the refresh timer. */
    148     volatile uint32_t                           cbTransferAllowed;
     148    volatile uint64_t                           cbTransferAllowed;
    149149    /** Timestamp of the last update */
    150150    volatile uint64_t                           tsUpdatedLast;
     
    655655
    656656/** Lazy coder. */
    657 static int pdmacAsyncCompletionBwMgrCreate(PPDMASYNCCOMPLETIONEPCLASS pEpClass, const char *pszBwMgr, uint32_t cbTransferPerSecMax,
    658                                            uint32_t cbTransferPerSecStart, uint32_t cbTransferPerSecStep)
    659 {
    660     LogFlowFunc(("pEpClass=%#p pszBwMgr=%#p{%s} cbTransferPerSecMax=%u cbTransferPerSecStart=%u cbTransferPerSecStep=%u\n",
     657static int pdmacAsyncCompletionBwMgrCreate(PPDMASYNCCOMPLETIONEPCLASS pEpClass, const char *pszBwMgr, uint64_t cbTransferPerSecMax,
     658                                           uint64_t cbTransferPerSecStart, uint64_t cbTransferPerSecStep)
     659{
     660    LogFlowFunc(("pEpClass=%#p pszBwMgr=%#p{%s} cbTransferPerSecMax=%RU64 cbTransferPerSecStart=%RU64 cbTransferPerSecStep=%RU64\n",
    661661                 pEpClass, pszBwMgr, pszBwMgr, cbTransferPerSecMax, cbTransferPerSecStart, cbTransferPerSecStep));
    662662
     
    732732 *                                    Only set if false is returned.
    733733 */
    734 bool pdmacEpIsTransferAllowed(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint32_t cbTransfer, RTMSINTERVAL *pmsWhenNext)
     734bool pdmacEpIsTransferAllowed(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t cbTransfer, RTMSINTERVAL *pmsWhenNext)
    735735{
    736736    bool        fAllowed = true;
    737737    PPDMACBWMGR pBwMgr = ASMAtomicReadPtrT(&pEndpoint->pBwMgr, PPDMACBWMGR);
    738738
    739     LogFlowFunc(("pEndpoint=%p pBwMgr=%p cbTransfer=%u\n", pEndpoint, pBwMgr, cbTransfer));
     739    LogFlowFunc(("pEndpoint=%p pBwMgr=%p cbTransfer=%RU64\n", pEndpoint, pBwMgr, cbTransfer));
    740740
    741741    if (pBwMgr)
    742742    {
    743         uint32_t cbOld = ASMAtomicSubU32(&pBwMgr->cbTransferAllowed, cbTransfer);
     743        uint64_t cbOld = ASMAtomicSubU64(&pBwMgr->cbTransferAllowed, cbTransfer);
    744744        if (RT_LIKELY(cbOld >= cbTransfer))
    745745            fAllowed = true;
     
    759759                    {
    760760                       pBwMgr->cbTransferPerSecStart = RT_MIN(pBwMgr->cbTransferPerSecMax, pBwMgr->cbTransferPerSecStart + pBwMgr->cbTransferPerSecStep);
    761                        LogFlow(("AIOMgr: Increasing maximum bandwidth to %u bytes/sec\n", pBwMgr->cbTransferPerSecStart));
     761                       LogFlow(("AIOMgr: Increasing maximum bandwidth to %RU64 bytes/sec\n", pBwMgr->cbTransferPerSecStart));
    762762                    }
    763763
    764764                    /* Update */
    765                     uint32_t cbTransferAllowedNew =   pBwMgr->cbTransferPerSecStart > cbTransfer
     765                    uint64_t cbTransferAllowedNew =   pBwMgr->cbTransferPerSecStart > cbTransfer
    766766                                                    ? pBwMgr->cbTransferPerSecStart - cbTransfer
    767767                                                    : 0;
    768                     ASMAtomicWriteU32(&pBwMgr->cbTransferAllowed, cbTransferAllowedNew);
     768                    ASMAtomicWriteU64(&pBwMgr->cbTransferAllowed, cbTransferAllowedNew);
    769769                    fAllowed = true;
    770770                    LogFlow(("AIOMgr: Refreshed bandwidth\n"));
     
    773773            else
    774774            {
    775                 ASMAtomicAddU32(&pBwMgr->cbTransferAllowed, cbTransfer);
     775                ASMAtomicAddU64(&pBwMgr->cbTransferAllowed, cbTransfer);
    776776                *pmsWhenNext = ((1000*1000*1000) - (tsNow - tsUpdatedLast)) / (1000*1000);
    777777            }
     
    883883                                if (RT_SUCCESS(rc))
    884884                                {
    885                                     uint32_t cbMax;
    886                                     rc = CFGMR3QueryU32(pCur, "Max", &cbMax);
     885                                    uint64_t cbMax;
     886                                    rc = CFGMR3QueryU64(pCur, "Max", &cbMax);
    887887                                    if (RT_SUCCESS(rc))
    888888                                    {
    889                                         uint32_t cbStart;
    890                                         rc = CFGMR3QueryU32Def(pCur, "Start", &cbStart, cbMax);
     889                                        uint64_t cbStart;
     890                                        rc = CFGMR3QueryU64Def(pCur, "Start", &cbStart, cbMax);
    891891                                        if (RT_SUCCESS(rc))
    892892                                        {
    893                                             uint32_t cbStep;
    894                                             rc = CFGMR3QueryU32Def(pCur, "Step", &cbStep, 0);
     893                                            uint64_t cbStep;
     894                                            rc = CFGMR3QueryU64Def(pCur, "Step", &cbStep, 0);
    895895                                            if (RT_SUCCESS(rc))
    896896                                                rc = pdmacAsyncCompletionBwMgrCreate(pEndpointClass, pszBwGrpId,
     
    13041304            {
    13051305                LogRel(("AIOMgr:     Id:    %s\n", pBwMgr->pszId));
    1306                 LogRel(("AIOMgr:     Max:   %u B/s\n", pBwMgr->cbTransferPerSecMax));
    1307                 LogRel(("AIOMgr:     Start: %u B/s\n", pBwMgr->cbTransferPerSecStart));
    1308                 LogRel(("AIOMgr:     Step:  %u B/s\n", pBwMgr->cbTransferPerSecStep));
     1306                LogRel(("AIOMgr:     Max:   %RU64 B/s\n", pBwMgr->cbTransferPerSecMax));
     1307                LogRel(("AIOMgr:     Start: %RU64 B/s\n", pBwMgr->cbTransferPerSecStart));
     1308                LogRel(("AIOMgr:     Step:  %RU64 B/s\n", pBwMgr->cbTransferPerSecStep));
    13091309                LogRel(("AIOMgr:     Endpoints:\n"));
    13101310
     
    17811781 * @param   cbMaxNew        The new maximum for the bandwidth manager in bytes/sec.
    17821782 */
    1783 VMMR3DECL(int) PDMR3AsyncCompletionBwMgrSetMaxForFile(PUVM pUVM, const char *pszBwMgr, uint32_t cbMaxNew)
     1783VMMR3DECL(int) PDMR3AsyncCompletionBwMgrSetMaxForFile(PUVM pUVM, const char *pszBwMgr, uint64_t cbMaxNew)
    17841784{
    17851785    UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
     
    17971797         * the new limit immediately.
    17981798         */
    1799         ASMAtomicWriteU32(&pBwMgr->cbTransferPerSecMax, cbMaxNew);
    1800         ASMAtomicWriteU32(&pBwMgr->cbTransferPerSecStart, cbMaxNew);
     1799        ASMAtomicWriteU64(&pBwMgr->cbTransferPerSecMax, cbMaxNew);
     1800        ASMAtomicWriteU64(&pBwMgr->cbTransferPerSecStart, cbMaxNew);
    18011801    }
    18021802    else
  • trunk/src/VBox/VMM/VMMR3/PDMAsyncCompletionFileFailsafe.cpp

    r106061 r108460  
    7979        PPDMACTASKFILE pCurr = pTasks;
    8080
    81         if (!pdmacEpIsTransferAllowed(&pEndpoint->Core, (uint32_t)pCurr->DataSeg.cbSeg, &msWhenNext))
     81        if (!pdmacEpIsTransferAllowed(&pEndpoint->Core, pCurr->DataSeg.cbSeg, &msWhenNext))
    8282        {
    8383            pAioMgr->msBwLimitExpired = RT_MIN(pAioMgr->msBwLimitExpired, msWhenNext);
  • trunk/src/VBox/VMM/VMMR3/PDMAsyncCompletionFileNormal.cpp

    r106061 r108460  
    999999        PPDMACTASKFILE pCurr = pTaskHead;
    10001000
    1001         if (!pdmacEpIsTransferAllowed(&pEndpoint->Core, (uint32_t)pCurr->DataSeg.cbSeg, &msWhenNext))
     1001        if (!pdmacEpIsTransferAllowed(&pEndpoint->Core, pCurr->DataSeg.cbSeg, &msWhenNext))
    10021002        {
    10031003            pAioMgr->msBwLimitExpired = RT_MIN(pAioMgr->msBwLimitExpired, msWhenNext);
  • trunk/src/VBox/VMM/include/PDMAsyncCompletionInternal.h

    r106061 r108460  
    282282
    283283void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask, int rc, bool fCallCompletionHandler);
    284 bool pdmacEpIsTransferAllowed(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint32_t cbTransfer, RTMSINTERVAL *pmsWhenNext);
     284bool pdmacEpIsTransferAllowed(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t cbTransfer, RTMSINTERVAL *pmsWhenNext);
    285285
    286286RT_C_DECLS_END
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