VirtualBox

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


Ignore:
Timestamp:
Sep 15, 2021 10:19:31 AM (3 years ago)
Author:
vboxsync
Message:

VMM/PGMPool: Call PGMR0PoolGrow directly from ring-0 instead of going via ring-3. bugref:10093

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r90439 r91243  
    49474947        int rc = PGMR3PoolGrow(pVM, VMMGetCpu(pVM));
    49484948#else
    4949         int rc = VMMRZCallRing3NoCpu(pVM, VMMCALLRING3_PGM_POOL_GROW, 0);
     4949        int rc = PGMR0PoolGrow(pVM, VMMGetCpuId(pVM));
    49504950#endif
    49514951        if (RT_FAILURE(rc))
  • trunk/src/VBox/VMM/VMMR0/PGMR0Pool.cpp

    r86473 r91243  
    3434
    3535
    36 
    3736/**
    38  * Grows the shadow page pool.
    39  *
    40  * I.e. adds more pages to it, assuming that hasn't reached cMaxPages yet.
    41  *
    42  * @returns VBox status code.
    43  * @param   pGVM    The ring-0 VM structure.
     37 * Worker for PGMR0PoolGrow.
    4438 */
    45 VMMR0_INT_DECL(int) PGMR0PoolGrow(PGVM pGVM)
     39static int pgmR0PoolGrowInner(PGVM pGVM, PPGMPOOL pPool)
    4640{
    47     PPGMPOOL pPool = pGVM->pgm.s.pPoolR0;
    48     AssertReturn(pPool->cCurPages < pPool->cMaxPages, VERR_PGM_POOL_MAXED_OUT_ALREADY);
    49     AssertReturn(pPool->pVMR3 == pGVM->pVMR3, VERR_PGM_POOL_IPE);
    50     AssertReturn(pPool->pVMR0 == pGVM, VERR_PGM_POOL_IPE);
     41    int rc;
    5142
    5243    /* With 32-bit guests and no EPT, the CR3 limits the root pages to low
     
    5546     *        required. */
    5647    bool const fCanUseHighMemory = HMIsNestedPagingActive(pGVM);
    57 
    58     STAM_REL_PROFILE_START(&pPool->StatGrow, a);
    59     int rc = RTCritSectEnter(&pGVM->pgmr0.s.PoolGrowCritSect);
    60     AssertRCReturn(rc, rc);
    6148
    6249    /*
     
    7057        if (cNewPages > PGMPOOL_CFG_MAX_GROW)
    7158            cNewPages = PGMPOOL_CFG_MAX_GROW;
    72         LogFlow(("PGMR3PoolGrow: Growing the pool by %u (%#x) pages to %u (%#x) pages. fCanUseHighMemory=%RTbool\n",
     59        LogFlow(("PGMR0PoolGrow: Growing the pool by %u (%#x) pages to %u (%#x) pages. fCanUseHighMemory=%RTbool\n",
    7360                 cNewPages, cNewPages, cCurPages + cNewPages, cCurPages + cNewPages, fCanUseHighMemory));
    7461
     
    7865                      <= RT_ELEMENTS(pGVM->pgmr0.s.ahPoolMemObjs));
    7966        AssertCompile(RT_ELEMENTS(pGVM->pgmr0.s.ahPoolMemObjs) == RT_ELEMENTS(pGVM->pgmr0.s.ahPoolMapObjs));
    80         AssertLogRelMsgReturnStmt(   pGVM->pgmr0.s.ahPoolMemObjs[idxMemHandle] == NIL_RTR0MEMOBJ
    81                                   && pGVM->pgmr0.s.ahPoolMapObjs[idxMemHandle] == NIL_RTR0MEMOBJ,
    82                                   ("idxMemHandle=%#x\n", idxMemHandle), RTCritSectLeave(&pGVM->pgmr0.s.PoolGrowCritSect),
    83                                   VERR_PGM_POOL_IPE);
     67        AssertLogRelMsgReturn(   pGVM->pgmr0.s.ahPoolMemObjs[idxMemHandle] == NIL_RTR0MEMOBJ
     68                              && pGVM->pgmr0.s.ahPoolMapObjs[idxMemHandle] == NIL_RTR0MEMOBJ, ("idxMemHandle=%#x\n", idxMemHandle),
     69                              VERR_PGM_POOL_IPE);
    8470
    8571        /*
     
    120106                    pPage->enmKind          = PGMPOOLKIND_FREE;
    121107                    pPage->idx              = pPage - &pPool->aPages[0];
    122                     LogFlow(("PGMR3PoolGrow: insert page #%#x - %RHp\n", pPage->idx, pPage->Core.Key));
     108                    LogFlow(("PGMR0PoolGrow: insert page #%#x - %RHp\n", pPage->idx, pPage->Core.Key));
    123109                    pPage->iNext            = pPool->iFreeHead;
    124110                    pPage->iUserHead        = NIL_PGMPOOL_USER_INDEX;
     
    135121                }
    136122
    137                 STAM_REL_PROFILE_STOP(&pPool->StatGrow, a);
    138                 RTCritSectLeave(&pGVM->pgmr0.s.PoolGrowCritSect);
    139123                return VINF_SUCCESS;
    140124            }
     
    149133                    rc, cNewPages, cCurPages, cMaxPages, fCanUseHighMemory));
    150134    }
    151     RTCritSectLeave(&pGVM->pgmr0.s.PoolGrowCritSect);
     135    else
     136        rc = VINF_SUCCESS;
    152137    return rc;
    153138}
    154139
     140
     141/**
     142 * Grows the shadow page pool.
     143 *
     144 * I.e. adds more pages to it, assuming that hasn't reached cMaxPages yet.
     145 *
     146 * @returns VBox status code.
     147 * @param   pGVM    The ring-0 VM structure.
     148 * @param   idCpu   The ID of the calling EMT.
     149 * @thread  EMT(idCpu)
     150 */
     151VMMR0_INT_DECL(int) PGMR0PoolGrow(PGVM pGVM, VMCPUID idCpu)
     152{
     153    /*
     154     * Validate input.
     155     */
     156    PPGMPOOL pPool = pGVM->pgm.s.pPoolR0;
     157    AssertReturn(pPool->cCurPages < pPool->cMaxPages, VERR_PGM_POOL_MAXED_OUT_ALREADY);
     158    AssertReturn(pPool->pVMR3 == pGVM->pVMR3, VERR_PGM_POOL_IPE);
     159    AssertReturn(pPool->pVMR0 == pGVM, VERR_PGM_POOL_IPE);
     160
     161    AssertReturn(idCpu < pGVM->cCpus, VERR_VM_THREAD_NOT_EMT);
     162    PGVMCPU const pGVCpu = &pGVM->aCpus[idCpu];
     163
     164    /*
     165     * Enter the grow critical section and call worker.
     166     */
     167    STAM_REL_PROFILE_START(&pPool->StatGrow, a);
     168
     169    VMMR0EMTBLOCKCTX Ctx;
     170    int rc = VMMR0EmtPrepareToBlock(pGVCpu, VINF_SUCCESS, __FUNCTION__, &pGVM->pgmr0.s.PoolGrowCritSect, &Ctx);
     171    AssertRCReturn(rc, rc);
     172
     173    rc = RTCritSectEnter(&pGVM->pgmr0.s.PoolGrowCritSect);
     174    AssertRCReturn(rc, rc);
     175
     176    rc = pgmR0PoolGrowInner(pGVM, pPool);
     177
     178    STAM_REL_PROFILE_STOP(&pPool->StatGrow, a);
     179    RTCritSectLeave(&pGVM->pgmr0.s.PoolGrowCritSect);
     180
     181    VMMR0EmtResumeAfterBlocking(pGVCpu, &Ctx);
     182
     183    return rc;
     184}
     185
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r91016 r91243  
    12881288            switch (pVCpu->vmm.s.enmCallRing3Operation)
    12891289            {
    1290                 case VMMCALLRING3_PGM_POOL_GROW:
    1291                     STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMPoolGrow);
    1292                     break;
    12931290                case VMMCALLRING3_PGM_MAP_CHUNK:
    12941291                    STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMMapChunk);
     
    18831880            if (idCpu == NIL_VMCPUID)
    18841881                return VERR_INVALID_CPU_ID;
    1885             rc = PGMR0PoolGrow(pGVM);
     1882            rc = PGMR0PoolGrow(pGVM, idCpu);
    18861883            break;
    18871884
  • trunk/src/VBox/VMM/VMMR3/VMM.cpp

    r90999 r91243  
    430430    STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchTPR,            STAMTYPE_COUNTER, "/VMM/RZRet/PatchTPR",            STAMUNIT_OCCURENCES, "Number of VINF_EM_HM_PATCH_TPR_INSTR returns.");
    431431    STAM_REG(pVM, &pVM->vmm.s.StatRZRetCallRing3,           STAMTYPE_COUNTER, "/VMM/RZCallR3/Misc",             STAMUNIT_OCCURENCES, "Number of Other ring-3 calls.");
    432     STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMPoolGrow,        STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMPoolGrow",      STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_POOL_GROW calls.");
    433432    STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMMapChunk,        STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMMapChunk",      STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_MAP_CHUNK calls.");
    434433    STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMAllocHandy,      STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMAllocHandy",    STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_ALLOCATE_HANDY_PAGES calls.");
     
    25022501    {
    25032502        /*
    2504          * Grow the PGM pool.
    2505          */
    2506         case VMMCALLRING3_PGM_POOL_GROW:
    2507         {
    2508             pVCpu->vmm.s.rcCallRing3 = PGMR3PoolGrow(pVM, pVCpu);
    2509             break;
    2510         }
    2511 
    2512         /*
    25132503         * Maps an page allocation chunk into ring-3 so ring-0 can use it.
    25142504         */
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