Changeset 18974 in vbox for trunk/src/VBox/VMM/VMMR0
- Timestamp:
- Apr 17, 2009 7:13:31 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/PGMR0DynMap.cpp
r18955 r18974 1185 1185 static uint32_t pgmR0DynMapPageSlow(PPGMR0DYNMAP pThis, RTHCPHYS HCPhys, uint32_t iPage, PVM pVM) 1186 1186 { 1187 #ifdef VBOX_WITH_STATISTICS 1188 PVMCPU pVCpu = VMMGetCpu(pVM); 1189 #endif 1190 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageSlow); 1187 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlow); 1191 1188 1192 1189 /* … … 1216 1213 if (paPages[iFreePage].HCPhys == HCPhys) 1217 1214 { 1218 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageSlowLoopHits);1215 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLoopHits); 1219 1216 return iFreePage; 1220 1217 } … … 1227 1224 return UINT32_MAX; 1228 1225 } 1229 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageSlowLoopMisses);1226 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLoopMisses); 1230 1227 #ifdef VBOX_WITH_STATISTICS 1231 1228 fLooped = true; … … 1239 1236 for (uint32_t iPage2 = (iPage + 3) % cPages; iPage2 != iPage; iPage2 = (iPage2 + 1) % cPages) 1240 1237 if (paPages[iPage2].HCPhys == HCPhys) 1241 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageSlowLostHits);1238 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLostHits); 1242 1239 #endif 1243 1240 … … 1287 1284 DECLINLINE(uint32_t) pgmR0DynMapPage(PPGMR0DYNMAP pThis, RTHCPHYS HCPhys, int32_t iRealCpu, PVM pVM, void **ppvPage) 1288 1285 { 1289 #ifdef VBOX_WITH_STATISTICS1290 PVMCPU pVCpu = VMMGetCpu(pVM);1291 #endif1292 1286 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1293 1287 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 1294 1288 AssertMsg(!(HCPhys & PAGE_OFFSET_MASK), ("HCPhys=%RHp\n", HCPhys)); 1295 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPage);1289 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPage); 1296 1290 1297 1291 /* … … 1307 1301 PPGMR0DYNMAPENTRY paPages = pThis->paPages; 1308 1302 if (RT_LIKELY(paPages[iPage].HCPhys == HCPhys)) 1309 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageHits0);1303 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHits0); 1310 1304 else 1311 1305 { … … 1314 1308 { 1315 1309 iPage = iPage2; 1316 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageHits1);1310 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHits1); 1317 1311 } 1318 1312 else … … 1322 1316 { 1323 1317 iPage = iPage2; 1324 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageHits2);1318 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHits2); 1325 1319 } 1326 1320 else … … 1371 1365 if (RT_UNLIKELY(fInvalidateIt)) 1372 1366 { 1373 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapPageInvlPg);1367 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageInvlPg); 1374 1368 ASMInvalidatePage(pvPage); 1375 1369 } … … 1505 1499 * API is called. 1506 1500 * 1507 * @param pV Cpu The shared data for the current virtual CPU.1508 */ 1509 VMMDECL(void) PGMDynMapStartAutoSet(PVM CPU pVCpu)1510 { 1511 Assert(pV Cpu->pgm.s.AutoSet.cEntries == PGMMAPSET_CLOSED);1512 Assert(pV Cpu->pgm.s.AutoSet.iSubset == UINT32_MAX);1513 pV Cpu->pgm.s.AutoSet.cEntries = 0;1514 pV Cpu->pgm.s.AutoSet.iCpu = RTMpCpuIdToSetIndex(RTMpCpuId());1501 * @param pVM Pointer to the shared VM structure. 1502 */ 1503 VMMDECL(void) PGMDynMapStartAutoSet(PVM pVM) 1504 { 1505 Assert(pVM->pgm.s.AutoSet.cEntries == PGMMAPSET_CLOSED); 1506 Assert(pVM->pgm.s.AutoSet.iSubset == UINT32_MAX); 1507 pVM->pgm.s.AutoSet.cEntries = 0; 1508 pVM->pgm.s.AutoSet.iCpu = RTMpCpuIdToSetIndex(RTMpCpuId()); 1515 1509 } 1516 1510 … … 1557 1551 * since the PGMDynMapStartAutoSet call. 1558 1552 * 1559 * @param pV Cpu The shared data for the current virtual CPU.1560 */ 1561 VMMDECL(void) PGMDynMapReleaseAutoSet(PVM CPU pVCpu)1562 { 1563 PPGMMAPSET pSet = &pV Cpu->pgm.s.AutoSet;1553 * @param pVM Pointer to the shared VM structure. 1554 */ 1555 VMMDECL(void) PGMDynMapReleaseAutoSet(PVM pVM) 1556 { 1557 PPGMMAPSET pSet = &pVM->pgm.s.AutoSet; 1564 1558 1565 1559 /* … … 1572 1566 pSet->iCpu = -1; 1573 1567 1574 STAM_COUNTER_INC(&pV Cpu->pgm.s.aStatR0DynMapSetSize[(cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]);1568 STAM_COUNTER_INC(&pVM->pgm.s.aStatR0DynMapSetSize[(cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]); 1575 1569 AssertMsg(cEntries < PGMMAPSET_MAX_FILL, ("%u\n", cEntries)); 1576 1570 if (cEntries > RT_ELEMENTS(pSet->aEntries) * 50 / 100) … … 1584 1578 * Flushes the set if it's above a certain threshold. 1585 1579 * 1586 * @param pV Cpu The shared data for the current virtual CPU.1587 */ 1588 VMMDECL(void) PGMDynMapFlushAutoSet(PVM CPU pVCpu)1589 { 1590 PPGMMAPSET pSet = &pV Cpu->pgm.s.AutoSet;1580 * @param pVM Pointer to the shared VM structure. 1581 */ 1582 VMMDECL(void) PGMDynMapFlushAutoSet(PVM pVM) 1583 { 1584 PPGMMAPSET pSet = &pVM->pgm.s.AutoSet; 1591 1585 AssertMsg(pSet->iCpu == RTMpCpuIdToSetIndex(RTMpCpuId()), ("%d %d(%d) efl=%#x\n", pSet->iCpu, RTMpCpuIdToSetIndex(RTMpCpuId()), RTMpCpuId(), ASMGetFlags())); 1592 1586 … … 1596 1590 uint32_t cEntries = pSet->cEntries; 1597 1591 AssertReturnVoid(cEntries != PGMMAPSET_CLOSED); 1598 STAM_COUNTER_INC(&pV Cpu->pgm.s.aStatR0DynMapSetSize[(cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]);1592 STAM_COUNTER_INC(&pVM->pgm.s.aStatR0DynMapSetSize[(cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]); 1599 1593 if (cEntries >= RT_ELEMENTS(pSet->aEntries) * 45 / 100) 1600 1594 { … … 1620 1614 * the entries will have been flagged as invalidated. 1621 1615 * 1622 * @param pV Cpu The shared data for the current virtual CPU.1616 * @param pVM Pointer to the shared VM structure. 1623 1617 * @thread EMT 1624 1618 */ 1625 VMMDECL(void) PGMDynMapMigrateAutoSet(PVM CPU pVCpu)1626 { 1627 PPGMMAPSET pSet = &pV Cpu->pgm.s.AutoSet;1619 VMMDECL(void) PGMDynMapMigrateAutoSet(PVM pVM) 1620 { 1621 PPGMMAPSET pSet = &pVM->pgm.s.AutoSet; 1628 1622 int32_t iRealCpu = RTMpCpuIdToSetIndex(RTMpCpuId()); 1629 1623 if (pSet->iCpu != iRealCpu) … … 1650 1644 1651 1645 ASMInvalidatePage(pThis->paPages[iPage].pvPage); 1652 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapMigrateInvlPg);1646 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapMigrateInvlPg); 1653 1647 1654 1648 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); … … 1718 1712 * @returns The index of the previous subset. Pass this to 1719 1713 * PGMDynMapPopAutoSubset when poping it. 1720 * @param pV Cpu Pointer to the virtual cpu data.1721 */ 1722 VMMDECL(uint32_t) PGMDynMapPushAutoSubset(PVM CPU pVCpu)1723 { 1724 PPGMMAPSET pSet = &pV Cpu->pgm.s.AutoSet;1714 * @param pVM Pointer to the shared VM structure. 1715 */ 1716 VMMDECL(uint32_t) PGMDynMapPushAutoSubset(PVM pVM) 1717 { 1718 PPGMMAPSET pSet = &pVM->pgm.s.AutoSet; 1725 1719 AssertReturn(pSet->cEntries != PGMMAPSET_CLOSED, UINT32_MAX); 1726 1720 uint32_t iPrevSubset = pSet->iSubset; 1727 1721 Assert(iPrevSubset == UINT32_MAX); 1728 1722 pSet->iSubset = pSet->cEntries; 1729 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapSubsets);1723 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSubsets); 1730 1724 return iPrevSubset; 1731 1725 } … … 1735 1729 * Pops a subset created by a previous call to PGMDynMapPushAutoSubset. 1736 1730 * 1737 * @param pV Cpu Pointer to the virtual cpu data.1731 * @param pVM Pointer to the shared VM structure. 1738 1732 * @param iPrevSubset What PGMDynMapPushAutoSubset returned. 1739 1733 */ 1740 VMMDECL(void) PGMDynMapPopAutoSubset(PVM CPU pVCpu, uint32_t iPrevSubset)1741 { 1742 PPGMMAPSET pSet = &pV Cpu->pgm.s.AutoSet;1734 VMMDECL(void) PGMDynMapPopAutoSubset(PVM pVM, uint32_t iPrevSubset) 1735 { 1736 PPGMMAPSET pSet = &pVM->pgm.s.AutoSet; 1743 1737 uint32_t cEntries = pSet->cEntries; 1744 1738 AssertReturnVoid(cEntries != PGMMAPSET_CLOSED); 1745 1739 AssertReturnVoid(pSet->iSubset <= iPrevSubset || iPrevSubset == UINT32_MAX); 1746 1740 Assert(iPrevSubset == UINT32_MAX); 1747 STAM_COUNTER_INC(&pV Cpu->pgm.s.aStatR0DynMapSetSize[(cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]);1741 STAM_COUNTER_INC(&pVM->pgm.s.aStatR0DynMapSetSize[(cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]); 1748 1742 if ( cEntries >= RT_ELEMENTS(pSet->aEntries) * 40 / 100 1749 1743 && cEntries != pSet->iSubset) … … 1816 1810 int pgmR0DynMapHCPageCommon(PVM pVM, PPGMMAPSET pSet, RTHCPHYS HCPhys, void **ppv) 1817 1811 { 1818 #ifdef VBOX_WITH_STATISTICS1819 PVMCPU pVCpu = VMMGetCpu(pVM);1820 #endif1821 1812 AssertMsg(pSet->iCpu == RTMpCpuIdToSetIndex(RTMpCpuId()), ("%d %d(%d) efl=%#x\n", pSet->iCpu, RTMpCpuIdToSetIndex(RTMpCpuId()), RTMpCpuId(), ASMGetFlags())); 1822 1813 … … 1891 1882 { 1892 1883 pSet->aEntries[i].cRefs++; 1893 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapSetSearchHits);1884 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetSearchHits); 1894 1885 break; 1895 1886 } 1896 1887 if (i < 0) 1897 1888 { 1898 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapSetSearchMisses);1889 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetSearchMisses); 1899 1890 if (pSet->iSubset < pSet->cEntries) 1900 1891 { 1901 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapSetSearchFlushes);1902 STAM_COUNTER_INC(&pV Cpu->pgm.s.aStatR0DynMapSetSize[(pSet->cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]);1892 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetSearchFlushes); 1893 STAM_COUNTER_INC(&pVM->pgm.s.aStatR0DynMapSetSize[(pSet->cEntries * 10 / RT_ELEMENTS(pSet->aEntries)) % 11]); 1903 1894 AssertMsg(pSet->cEntries < PGMMAPSET_MAX_FILL, ("%u\n", pSet->cEntries)); 1904 1895 pgmDynMapFlushSubset(pSet); … … 1907 1898 if (RT_UNLIKELY(pSet->cEntries >= RT_ELEMENTS(pSet->aEntries))) 1908 1899 { 1909 STAM_COUNTER_INC(&pV Cpu->pgm.s.StatR0DynMapSetOptimize);1900 STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetOptimize); 1910 1901 pgmDynMapOptimizeAutoSet(pSet); 1911 1902 } … … 1943 1934 VMMDECL(int) PGMDynMapHCPage(PVM pVM, RTHCPHYS HCPhys, void **ppv) 1944 1935 { 1945 #ifdef VBOX_WITH_STATISTICS1946 PVMCPU pVCpu = VMMGetCpu(pVM);1947 #endif1948 1936 /* 1949 1937 * Validate state. 1950 1938 */ 1951 STAM_PROFILE_START(&pV Cpu->pgm.s.StatR0DynMapHCPage, a);1939 STAM_PROFILE_START(&pVM->pgm.s.StatR0DynMapHCPage, a); 1952 1940 AssertPtr(ppv); 1953 1941 AssertMsg(pVM->pgm.s.pvR0DynMapUsed == g_pPGMR0DynMap, 1954 1942 ("%p != %p\n", pVM->pgm.s.pvR0DynMapUsed, g_pPGMR0DynMap)); 1955 1943 AssertMsg(!(HCPhys & PAGE_OFFSET_MASK), ("HCPhys=%RHp\n", HCPhys)); 1956 PVMCPU pVCpu = VMMGetCpu(pVM); 1957 AssertPtr(pVCpu); 1958 PPGMMAPSET pSet = &pVCpu->pgm.s.AutoSet; 1944 PPGMMAPSET pSet = &pVM->pgm.s.AutoSet; 1959 1945 AssertMsg(pSet->cEntries <= RT_ELEMENTS(pSet->aEntries), 1960 1946 ("%#x (%u)\n", pSet->cEntries, pSet->cEntries)); … … 1965 1951 int rc = pgmR0DynMapHCPageCommon(pVM, pSet, HCPhys, ppv); 1966 1952 1967 STAM_PROFILE_STOP(&pV Cpu->pgm.s.StatR0DynMapHCPage, a);1953 STAM_PROFILE_STOP(&pVM->pgm.s.StatR0DynMapHCPage, a); 1968 1954 return rc; 1969 1955 }
Note:
See TracChangeset
for help on using the changeset viewer.