Changeset 91243 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Sep 15, 2021 10:19:31 AM (3 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r90439 r91243 4947 4947 int rc = PGMR3PoolGrow(pVM, VMMGetCpu(pVM)); 4948 4948 #else 4949 int rc = VMMRZCallRing3NoCpu(pVM, VMMCALLRING3_PGM_POOL_GROW, 0);4949 int rc = PGMR0PoolGrow(pVM, VMMGetCpuId(pVM)); 4950 4950 #endif 4951 4951 if (RT_FAILURE(rc)) -
trunk/src/VBox/VMM/VMMR0/PGMR0Pool.cpp
r86473 r91243 34 34 35 35 36 37 36 /** 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. 44 38 */ 45 VMMR0_INT_DECL(int) PGMR0PoolGrow(PGVM pGVM)39 static int pgmR0PoolGrowInner(PGVM pGVM, PPGMPOOL pPool) 46 40 { 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; 51 42 52 43 /* With 32-bit guests and no EPT, the CR3 limits the root pages to low … … 55 46 * required. */ 56 47 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);61 48 62 49 /* … … 70 57 if (cNewPages > PGMPOOL_CFG_MAX_GROW) 71 58 cNewPages = PGMPOOL_CFG_MAX_GROW; 72 LogFlow(("PGMR 3PoolGrow: 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", 73 60 cNewPages, cNewPages, cCurPages + cNewPages, cCurPages + cNewPages, fCanUseHighMemory)); 74 61 … … 78 65 <= RT_ELEMENTS(pGVM->pgmr0.s.ahPoolMemObjs)); 79 66 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); 84 70 85 71 /* … … 120 106 pPage->enmKind = PGMPOOLKIND_FREE; 121 107 pPage->idx = pPage - &pPool->aPages[0]; 122 LogFlow(("PGMR 3PoolGrow: insert page #%#x - %RHp\n", pPage->idx, pPage->Core.Key));108 LogFlow(("PGMR0PoolGrow: insert page #%#x - %RHp\n", pPage->idx, pPage->Core.Key)); 123 109 pPage->iNext = pPool->iFreeHead; 124 110 pPage->iUserHead = NIL_PGMPOOL_USER_INDEX; … … 135 121 } 136 122 137 STAM_REL_PROFILE_STOP(&pPool->StatGrow, a);138 RTCritSectLeave(&pGVM->pgmr0.s.PoolGrowCritSect);139 123 return VINF_SUCCESS; 140 124 } … … 149 133 rc, cNewPages, cCurPages, cMaxPages, fCanUseHighMemory)); 150 134 } 151 RTCritSectLeave(&pGVM->pgmr0.s.PoolGrowCritSect); 135 else 136 rc = VINF_SUCCESS; 152 137 return rc; 153 138 } 154 139 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 */ 151 VMMR0_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 1288 1288 switch (pVCpu->vmm.s.enmCallRing3Operation) 1289 1289 { 1290 case VMMCALLRING3_PGM_POOL_GROW:1291 STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMPoolGrow);1292 break;1293 1290 case VMMCALLRING3_PGM_MAP_CHUNK: 1294 1291 STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMMapChunk); … … 1883 1880 if (idCpu == NIL_VMCPUID) 1884 1881 return VERR_INVALID_CPU_ID; 1885 rc = PGMR0PoolGrow(pGVM );1882 rc = PGMR0PoolGrow(pGVM, idCpu); 1886 1883 break; 1887 1884 -
trunk/src/VBox/VMM/VMMR3/VMM.cpp
r90999 r91243 430 430 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchTPR, STAMTYPE_COUNTER, "/VMM/RZRet/PatchTPR", STAMUNIT_OCCURENCES, "Number of VINF_EM_HM_PATCH_TPR_INSTR returns."); 431 431 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.");433 432 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMMapChunk, STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMMapChunk", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_MAP_CHUNK calls."); 434 433 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMAllocHandy, STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMAllocHandy", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_ALLOCATE_HANDY_PAGES calls."); … … 2502 2501 { 2503 2502 /* 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 /*2513 2503 * Maps an page allocation chunk into ring-3 so ring-0 can use it. 2514 2504 */
Note:
See TracChangeset
for help on using the changeset viewer.