VirtualBox

Changeset 14868 in vbox for trunk/src


Ignore:
Timestamp:
Dec 1, 2008 3:20:06 PM (16 years ago)
Author:
vboxsync
Message:

PGMR0DynMap: some predictions based on statistics, 5 more stats.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGM.cpp

    r14861 r14868  
    16031603    STAM_REG(pVM, &pPGM->StatR0DynMapMigrateInvlPg,         STAMTYPE_COUNTER, "/PGM/R0/DynMapMigrateInvlPg",        STAMUNIT_OCCURENCES,     "invlpg count in PGMDynMapMigrateAutoSet.");
    16041604    STAM_REG(pVM, &pPGM->StatR0DynMapPage,                  STAMTYPE_COUNTER, "/PGM/R0/DynMapPage",                 STAMUNIT_OCCURENCES,     "Calls to pgmR0DynMapPage");
     1605    STAM_REG(pVM, &pPGM->StatR0DynMapPageHit0,              STAMTYPE_COUNTER, "/PGM/R0/DynMapPage/Hit0",            STAMUNIT_OCCURENCES,     "Hit at iPage+0");
     1606    STAM_REG(pVM, &pPGM->StatR0DynMapPageHit1,              STAMTYPE_COUNTER, "/PGM/R0/DynMapPage/Hit1",            STAMUNIT_OCCURENCES,     "Hit at iPage+1");
     1607    STAM_REG(pVM, &pPGM->StatR0DynMapPageHit2,              STAMTYPE_COUNTER, "/PGM/R0/DynMapPage/Hit2",            STAMUNIT_OCCURENCES,     "Hit at iPage+2");
     1608    STAM_REG(pVM, &pPGM->StatR0DynMapPageHit3,              STAMTYPE_COUNTER, "/PGM/R0/DynMapPage/Hit3",            STAMUNIT_OCCURENCES,     "Hit at iPage+3");
    16051609    STAM_REG(pVM, &pPGM->StatR0DynMapPageInvlPg,            STAMTYPE_COUNTER, "/PGM/R0/DynMapPage/InvlPg",          STAMUNIT_OCCURENCES,     "invlpg count in pgmR0DynMapPageSlow.");
    16061610    STAM_REG(pVM, &pPGM->StatR0DynMapPageSlow,              STAMTYPE_COUNTER, "/PGM/R0/DynMapPage/Slow",            STAMUNIT_OCCURENCES,     "Calls to pgmR0DynMapPageSlow - subtract this from pgmR0DynMapPage to get 1st level hits.");
  • trunk/src/VBox/VMM/PGMInternal.h

    r14861 r14868  
    25672567    STAMCOUNTER StatR0DynMapMigrateInvlPg;          /**< R0: invlpg in PGMDynMapMigrateAutoSet. */
    25682568    STAMCOUNTER StatR0DynMapPage;                   /**< R0: Calls to pgmR0DynMapPage. */
     2569    STAMCOUNTER StatR0DynMapPageHit0;               /**< R0: Hit at iPage+0. */
     2570    STAMCOUNTER StatR0DynMapPageHit1;               /**< R0: Hit at iPage+1. */
     2571    STAMCOUNTER StatR0DynMapPageHit2;               /**< R0: Hit at iPage+2. */
     2572    STAMCOUNTER StatR0DynMapPageHit3;               /**< R0: Hit at iPage+3. */
    25692573    STAMCOUNTER StatR0DynMapPageInvlPg;             /**< R0: invlpg. */
    25702574    STAMCOUNTER StatR0DynMapPageSlow;               /**< R0: Calls to pgmR0DynMapPageSlow. */
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r14755 r14868  
    32333233            Assert(pgmShwGet32BitPDEPtr(&pVM->pgm.s, (uint32_t)iPD << SHW_PD_SHIFT) == pPDEDst);
    32343234#  elif PGM_SHW_TYPE == PGM_TYPE_PAE
    3235 #   ifdef VBOX_STRICT
     3235#   if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortuantely not reliable with PGMR0DynMap and multiple VMs. */
    32363236            RTGCPTR GCPtrStrict = (uint32_t)iPD << GST_PD_SHIFT;
    32373237#    if PGM_GST_TYPE == PGM_TYPE_PAE
  • trunk/src/VBox/VMM/VMMR0/PGMR0DynMap.cpp

    r14861 r14868  
    11741174
    11751175    /*
    1176      * Check if any of the first 5 pages are unreferenced since the caller
     1176     * Check if any of the first 4 pages are unreferenced since the caller
    11771177     * already has made sure they aren't matching.
    11781178     */
     
    11911191    else if (!paPages[(iPage + 3) % cPages].cRefs)
    11921192        iFreePage   = (iPage + 3) % cPages;
    1193     else if (!paPages[(iPage + 4) % cPages].cRefs)
    1194         iFreePage   = (iPage + 4) % cPages;
    11951193    else
    11961194    {
     
    11981196         * Search for an unused or matching entry.
    11991197         */
    1200         iFreePage = (iPage + 5) % cPages;
     1198        iFreePage = (iPage + 4) % cPages;
    12011199        for (;;)
    12021200        {
     
    12241222    /* Check for lost hits. */
    12251223    if (!fLooped)
    1226         for (uint32_t iPage2 = (iPage + 5) % cPages; iPage2 != iPage; iPage2 = (iPage2 + 1) % cPages)
     1224        for (uint32_t iPage2 = (iPage + 4) % cPages; iPage2 != iPage; iPage2 = (iPage2 + 1) % cPages)
    12271225            if (paPages[iPage2].HCPhys == HCPhys)
    12281226                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageSlowLostHits);
     
    12811279     * Find an entry, if possible a matching one. The HCPhys address is hashed
    12821280     * down to a page index, collisions are handled by linear searching. Optimize
    1283      * for a hit in the first 5 pages.
     1281     * for a hit in the first 4 pages.
    12841282     *
    12851283     * To the cheap hits here and defer the tedious searching and inserting
     
    12891287    uint32_t            iPage   = (HCPhys >> PAGE_SHIFT) % cPages;
    12901288    PPGMR0DYNMAPENTRY   paPages = pThis->paPages;
    1291     if (paPages[iPage].HCPhys != HCPhys)
    1292     {
    1293         uint32_t    iPage2 = (iPage + 1) % cPages;
    1294         if (paPages[iPage2].HCPhys != HCPhys)
     1289    if (RT_LIKELY(paPages[iPage].HCPhys == HCPhys))
     1290        STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHit0);
     1291    else
     1292    {
     1293        uint32_t        iPage2 = (iPage + 1) % cPages;
     1294        if (RT_LIKELY(paPages[iPage2].HCPhys == HCPhys))
     1295        {
     1296            iPage = iPage2;
     1297            STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHit1);
     1298        }
     1299        else
    12951300        {
    12961301            iPage2 = (iPage + 2) % cPages;
    1297             if (paPages[iPage2].HCPhys != HCPhys)
     1302            if (paPages[iPage2].HCPhys == HCPhys)
     1303            {
     1304                iPage = iPage2;
     1305                STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHit2);
     1306            }
     1307            else
    12981308            {
    12991309                iPage2 = (iPage + 3) % cPages;
    1300                 if (paPages[iPage2].HCPhys != HCPhys)
     1310                if (paPages[iPage2].HCPhys == HCPhys)
    13011311                {
    1302                     iPage2 = (iPage + 4) % cPages;
    1303                     if (paPages[iPage2].HCPhys != HCPhys)
    1304                     {
    1305                         iPage = pgmR0DynMapPageSlow(pThis, HCPhys, iPage, pVM);
    1306                         if (RT_UNLIKELY(iPage == UINT32_MAX))
    1307                         {
    1308                             RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    1309                             return iPage;
    1310                         }
    1311                     }
    1312                     else
    1313                         iPage = iPage2;
     1312                    iPage = iPage2;
     1313                    STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageHit3);
    13141314                }
    13151315                else
    1316                     iPage = iPage2;
    1317             }
    1318             else
    1319                 iPage = iPage2;
    1320         }
    1321         else
    1322             iPage = iPage2;
     1316                {
     1317                    iPage = pgmR0DynMapPageSlow(pThis, HCPhys, iPage, pVM);
     1318                    if (RT_UNLIKELY(iPage == UINT32_MAX))
     1319                    {
     1320                        RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     1321                        return iPage;
     1322                    }
     1323                }
     1324            }
     1325        }
    13231326    }
    13241327
     
    13471350    RTCPUID idRealCpu = RTMpCpuId();
    13481351    bool fInvalidateIt = RTCpuSetIsMember(&paPages[iPage].PendingSet, idRealCpu);
    1349     if (fInvalidateIt)
     1352    if (RT_UNLIKELY(fInvalidateIt))
    13501353        RTCpuSetDel(&paPages[iPage].PendingSet, idRealCpu);
    13511354
     
    13551358     * Do the actual invalidation outside the spinlock.
    13561359     */
    1357     if (fInvalidateIt)
     1360    if (RT_UNLIKELY(fInvalidateIt))
    13581361    {
    13591362        STAM_COUNTER_INC(&pVM->pgm.s.StatR0DynMapPageInvlPg);
     
    17091712        pSet->aEntries[i - 4].cRefs++;
    17101713    /* Don't bother searching unless we're above a 75% load. */
    1711     else if (i <= (int32_t)RT_ELEMENTS(pSet->aEntries) / 4 * 3)
     1714    else if (RT_LIKELY(i <= (int32_t)RT_ELEMENTS(pSet->aEntries) / 4 * 3))
    17121715    {
    17131716        pSet->aEntries[pSet->cEntries].cRefs = 1;
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