VirtualBox

Changeset 18974 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Apr 17, 2009 7:13:31 AM (16 years ago)
Author:
vboxsync
Message:

Autoset belongs in PGM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/PGMR0DynMap.cpp

    r18955 r18974  
    11851185static uint32_t pgmR0DynMapPageSlow(PPGMR0DYNMAP pThis, RTHCPHYS HCPhys, uint32_t iPage, PVM pVM)
    11861186{
    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);
    11911188
    11921189    /*
     
    12161213            if (paPages[iFreePage].HCPhys == HCPhys)
    12171214            {
    1218                 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageSlowLoopHits);
     1215                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLoopHits);
    12191216                return iFreePage;
    12201217            }
     
    12271224                return UINT32_MAX;
    12281225        }
    1229         STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageSlowLoopMisses);
     1226        STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLoopMisses);
    12301227#ifdef VBOX_WITH_STATISTICS
    12311228        fLooped = true;
     
    12391236        for (uint32_t iPage2 = (iPage + 3) % cPages; iPage2 != iPage; iPage2 = (iPage2 + 1) % cPages)
    12401237            if (paPages[iPage2].HCPhys == HCPhys)
    1241                 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageSlowLostHits);
     1238                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLostHits);
    12421239#endif
    12431240
     
    12871284DECLINLINE(uint32_t) pgmR0DynMapPage(PPGMR0DYNMAP pThis, RTHCPHYS HCPhys, int32_t iRealCpu, PVM pVM, void **ppvPage)
    12881285{
    1289 #ifdef VBOX_WITH_STATISTICS
    1290     PVMCPU pVCpu = VMMGetCpu(pVM);
    1291 #endif
    12921286    RTSPINLOCKTMP   Tmp       = RTSPINLOCKTMP_INITIALIZER;
    12931287    RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
    12941288    AssertMsg(!(HCPhys & PAGE_OFFSET_MASK), ("HCPhys=%RHp\n", HCPhys));
    1295     STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPage);
     1289    STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPage);
    12961290
    12971291    /*
     
    13071301    PPGMR0DYNMAPENTRY   paPages = pThis->paPages;
    13081302    if (RT_LIKELY(paPages[iPage].HCPhys == HCPhys))
    1309         STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageHits0);
     1303        STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHits0);
    13101304    else
    13111305    {
     
    13141308        {
    13151309            iPage = iPage2;
    1316             STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageHits1);
     1310            STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHits1);
    13171311        }
    13181312        else
     
    13221316            {
    13231317                iPage = iPage2;
    1324                 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageHits2);
     1318                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHits2);
    13251319            }
    13261320            else
     
    13711365    if (RT_UNLIKELY(fInvalidateIt))
    13721366    {
    1373         STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapPageInvlPg);
     1367        STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageInvlPg);
    13741368        ASMInvalidatePage(pvPage);
    13751369    }
     
    15051499 * API is called.
    15061500 *
    1507  * @param   pVCpu       The shared data for the current virtual CPU.
    1508  */
    1509 VMMDECL(void) PGMDynMapStartAutoSet(PVMCPU pVCpu)
    1510 {
    1511     Assert(pVCpu->pgm.s.AutoSet.cEntries == PGMMAPSET_CLOSED);
    1512     Assert(pVCpu->pgm.s.AutoSet.iSubset == UINT32_MAX);
    1513     pVCpu->pgm.s.AutoSet.cEntries = 0;
    1514     pVCpu->pgm.s.AutoSet.iCpu = RTMpCpuIdToSetIndex(RTMpCpuId());
     1501 * @param   pVM         Pointer to the shared VM structure.
     1502 */
     1503VMMDECL(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());
    15151509}
    15161510
     
    15571551 * since the PGMDynMapStartAutoSet call.
    15581552 *
    1559  * @param   pVCpu       The shared data for the current virtual CPU.
    1560  */
    1561 VMMDECL(void) PGMDynMapReleaseAutoSet(PVMCPU pVCpu)
    1562 {
    1563     PPGMMAPSET  pSet = &pVCpu->pgm.s.AutoSet;
     1553 * @param   pVM         Pointer to the shared VM structure.
     1554 */
     1555VMMDECL(void) PGMDynMapReleaseAutoSet(PVM pVM)
     1556{
     1557    PPGMMAPSET  pSet = &pVM->pgm.s.AutoSet;
    15641558
    15651559    /*
     
    15721566    pSet->iCpu = -1;
    15731567
    1574     STAM_COUNTER_INC(&pVCpu->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]);
    15751569    AssertMsg(cEntries < PGMMAPSET_MAX_FILL, ("%u\n", cEntries));
    15761570    if (cEntries > RT_ELEMENTS(pSet->aEntries) * 50 / 100)
     
    15841578 * Flushes the set if it's above a certain threshold.
    15851579 *
    1586  * @param   pVCpu       The shared data for the current virtual CPU.
    1587  */
    1588 VMMDECL(void) PGMDynMapFlushAutoSet(PVMCPU pVCpu)
    1589 {
    1590     PPGMMAPSET  pSet = &pVCpu->pgm.s.AutoSet;
     1580 * @param   pVM         Pointer to the shared VM structure.
     1581 */
     1582VMMDECL(void) PGMDynMapFlushAutoSet(PVM pVM)
     1583{
     1584    PPGMMAPSET  pSet = &pVM->pgm.s.AutoSet;
    15911585    AssertMsg(pSet->iCpu == RTMpCpuIdToSetIndex(RTMpCpuId()), ("%d %d(%d) efl=%#x\n", pSet->iCpu, RTMpCpuIdToSetIndex(RTMpCpuId()), RTMpCpuId(), ASMGetFlags()));
    15921586
     
    15961590    uint32_t cEntries = pSet->cEntries;
    15971591    AssertReturnVoid(cEntries != PGMMAPSET_CLOSED);
    1598     STAM_COUNTER_INC(&pVCpu->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]);
    15991593    if (cEntries >= RT_ELEMENTS(pSet->aEntries) * 45 / 100)
    16001594    {
     
    16201614 * the entries will have been flagged as invalidated.
    16211615 *
    1622  * @param   pVCpu       The shared data for the current virtual CPU.
     1616 * @param   pVM         Pointer to the shared VM structure.
    16231617 * @thread  EMT
    16241618 */
    1625 VMMDECL(void) PGMDynMapMigrateAutoSet(PVMCPU pVCpu)
    1626 {
    1627     PPGMMAPSET      pSet     = &pVCpu->pgm.s.AutoSet;
     1619VMMDECL(void) PGMDynMapMigrateAutoSet(PVM pVM)
     1620{
     1621    PPGMMAPSET      pSet     = &pVM->pgm.s.AutoSet;
    16281622    int32_t         iRealCpu = RTMpCpuIdToSetIndex(RTMpCpuId());
    16291623    if (pSet->iCpu != iRealCpu)
     
    16501644
    16511645                        ASMInvalidatePage(pThis->paPages[iPage].pvPage);
    1652                         STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapMigrateInvlPg);
     1646                        STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapMigrateInvlPg);
    16531647
    16541648                        RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
     
    17181712 * @returns The index of the previous subset. Pass this to
    17191713 *        PGMDynMapPopAutoSubset when poping it.
    1720  * @param   pVCpu           Pointer to the virtual cpu data.
    1721  */
    1722 VMMDECL(uint32_t) PGMDynMapPushAutoSubset(PVMCPU pVCpu)
    1723 {
    1724     PPGMMAPSET      pSet = &pVCpu->pgm.s.AutoSet;
     1714 * @param   pVM             Pointer to the shared VM structure.
     1715 */
     1716VMMDECL(uint32_t) PGMDynMapPushAutoSubset(PVM pVM)
     1717{
     1718    PPGMMAPSET      pSet = &pVM->pgm.s.AutoSet;
    17251719    AssertReturn(pSet->cEntries != PGMMAPSET_CLOSED, UINT32_MAX);
    17261720    uint32_t        iPrevSubset = pSet->iSubset;
    17271721Assert(iPrevSubset == UINT32_MAX);
    17281722    pSet->iSubset = pSet->cEntries;
    1729     STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapSubsets);
     1723    STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSubsets);
    17301724    return iPrevSubset;
    17311725}
     
    17351729 * Pops a subset created by a previous call to PGMDynMapPushAutoSubset.
    17361730 *
    1737  * @param   pVCpu           Pointer to the virtual cpu data.
     1731 * @param   pVM             Pointer to the shared VM structure.
    17381732 * @param   iPrevSubset     What PGMDynMapPushAutoSubset returned.
    17391733 */
    1740 VMMDECL(void) PGMDynMapPopAutoSubset(PVMCPU pVCpu, uint32_t iPrevSubset)
    1741 {
    1742     PPGMMAPSET      pSet = &pVCpu->pgm.s.AutoSet;
     1734VMMDECL(void) PGMDynMapPopAutoSubset(PVM pVM, uint32_t iPrevSubset)
     1735{
     1736    PPGMMAPSET      pSet = &pVM->pgm.s.AutoSet;
    17431737    uint32_t        cEntries = pSet->cEntries;
    17441738    AssertReturnVoid(cEntries != PGMMAPSET_CLOSED);
    17451739    AssertReturnVoid(pSet->iSubset <= iPrevSubset || iPrevSubset == UINT32_MAX);
    17461740Assert(iPrevSubset == UINT32_MAX);
    1747     STAM_COUNTER_INC(&pVCpu->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]);
    17481742    if (    cEntries >= RT_ELEMENTS(pSet->aEntries) * 40 / 100
    17491743        &&  cEntries != pSet->iSubset)
     
    18161810int pgmR0DynMapHCPageCommon(PVM pVM, PPGMMAPSET pSet, RTHCPHYS HCPhys, void **ppv)
    18171811{
    1818 #ifdef VBOX_WITH_STATISTICS
    1819     PVMCPU pVCpu = VMMGetCpu(pVM);
    1820 #endif
    18211812    AssertMsg(pSet->iCpu == RTMpCpuIdToSetIndex(RTMpCpuId()), ("%d %d(%d) efl=%#x\n", pSet->iCpu, RTMpCpuIdToSetIndex(RTMpCpuId()), RTMpCpuId(), ASMGetFlags()));
    18221813
     
    18911882            {
    18921883                pSet->aEntries[i].cRefs++;
    1893                 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapSetSearchHits);
     1884                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetSearchHits);
    18941885                break;
    18951886            }
    18961887        if (i < 0)
    18971888        {
    1898             STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapSetSearchMisses);
     1889            STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetSearchMisses);
    18991890            if (pSet->iSubset < pSet->cEntries)
    19001891            {
    1901                 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapSetSearchFlushes);
    1902                 STAM_COUNTER_INC(&pVCpu->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]);
    19031894                AssertMsg(pSet->cEntries < PGMMAPSET_MAX_FILL, ("%u\n", pSet->cEntries));
    19041895                pgmDynMapFlushSubset(pSet);
     
    19071898            if (RT_UNLIKELY(pSet->cEntries >= RT_ELEMENTS(pSet->aEntries)))
    19081899            {
    1909                 STAM_COUNTER_INC(&pVCpu->pgm.s.StatR0DynMapSetOptimize);
     1900                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapSetOptimize);
    19101901                pgmDynMapOptimizeAutoSet(pSet);
    19111902            }
     
    19431934VMMDECL(int) PGMDynMapHCPage(PVM pVM, RTHCPHYS HCPhys, void **ppv)
    19441935{
    1945 #ifdef VBOX_WITH_STATISTICS
    1946     PVMCPU pVCpu = VMMGetCpu(pVM);
    1947 #endif
    19481936    /*
    19491937     * Validate state.
    19501938     */
    1951     STAM_PROFILE_START(&pVCpu->pgm.s.StatR0DynMapHCPage, a);
     1939    STAM_PROFILE_START(&pVM->pgm.s.StatR0DynMapHCPage, a);
    19521940    AssertPtr(ppv);
    19531941    AssertMsg(pVM->pgm.s.pvR0DynMapUsed == g_pPGMR0DynMap,
    19541942              ("%p != %p\n", pVM->pgm.s.pvR0DynMapUsed, g_pPGMR0DynMap));
    19551943    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;
    19591945    AssertMsg(pSet->cEntries <= RT_ELEMENTS(pSet->aEntries),
    19601946              ("%#x (%u)\n", pSet->cEntries, pSet->cEntries));
     
    19651951    int rc = pgmR0DynMapHCPageCommon(pVM, pSet, HCPhys, ppv);
    19661952
    1967     STAM_PROFILE_STOP(&pVCpu->pgm.s.StatR0DynMapHCPage, a);
     1953    STAM_PROFILE_STOP(&pVM->pgm.s.StatR0DynMapHCPage, a);
    19681954    return rc;
    19691955}
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