VirtualBox

Changeset 27065 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 5, 2010 10:07:55 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
58382
Message:

Fixed and cleaned up reference counting mess.
Additional code for cleaning up big pages.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGMInternal.h

    r27038 r27065  
    33873387uint16_t        pgmPoolTrackPhysExtAddref(PVM pVM, uint16_t u16, uint16_t iShwPT);
    33883388void            pgmPoolTrackPhysExtDerefGCPhys(PPGMPOOL pPool, PPGMPOOLPAGE pPoolPage, PPGMPAGE pPhysPage);
    3389 void            pgmPoolTracDerefGCPhysHint(PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTHCPHYS HCPhys, RTGCPHYS GCPhysHint);
    33903389void            pgmPoolMonitorChainChanging(PVMCPU pVCpu, PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTGCPHYS GCPhysFault, CTXTYPE(RTGCPTR, RTHCPTR, RTGCPTR) pvAddress, unsigned cbWrite);
    33913390int             pgmPoolMonitorChainFlush(PPGMPOOL pPool, PPGMPOOLPAGE pPage);
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r27038 r27065  
    6868void            pgmPoolTrackPhysExtFree(PVM pVM, uint16_t iPhysExt);
    6969void            pgmPoolTrackPhysExtFreeList(PVM pVM, uint16_t iPhysExt);
     70static void     pgmPoolTracDerefGCPhysHint(PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTHCPHYS HCPhys, RTGCPHYS GCPhysHint);
    7071
    7172RT_C_DECLS_END
     
    29912992                STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    29922993
     2994            /* Update the counter if we're removing references. */
     2995            if (!u32AndMask)
     2996            {
     2997                Assert(pPage->cPresent >= cRefs);
     2998                Assert(pPool->cPresent >= cRefs);
     2999                pPage->cPresent -= cRefs;
     3000                pPool->cPresent -= cRefs;
     3001            }
     3002
    29933003            for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    29943004                if ((pPT->a[i].u & (X86_PTE_PG_MASK | X86_PTE_P)) == u32)
     
    30573067                STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    30583068
     3069            /* Update the counter if we're removing references. */
     3070            if (!u64AndMask)
     3071            {
     3072                Assert(pPage->cPresent >= cRefs);
     3073                Assert(pPool->cPresent >= cRefs);
     3074                pPage->cPresent -= cRefs;
     3075                pPool->cPresent -= cRefs;
     3076            }
     3077
    30593078            for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    30603079                if ((pPT->a[i].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P)) == u64)
     
    30953114                    pPT->a[i].u = 0;
    30963115                    cRefs--;
     3116
     3117                    /* Update the counter as we're removing references. */
     3118                    Assert(pPage->cPresent);
     3119                    Assert(pPool->cPresent);
     3120                    pPage->cPresent--;
     3121                    pPool->cPresent--;
     3122
    30973123                    if (!cRefs)
    30983124                        return bRet;
     
    31263152                    pPD->a[i].u = 0;
    31273153                    cRefs--;
     3154
     3155                    /* Update the counter as we're removing references. */
     3156                    Assert(pPage->cPresent);
     3157                    Assert(pPool->cPresent);
     3158                    pPage->cPresent--;
     3159                    pPool->cPresent--;
     3160
    31283161                    if (!cRefs)
    31293162                        return bRet;
     
    31563189                    pPD->a[i].u = 0;
    31573190                    cRefs--;
     3191
     3192                    /* Update the counter as we're removing references. */
     3193                    Assert(pPage->cPresent);
     3194                    Assert(pPool->cPresent);
     3195                    pPage->cPresent--;
     3196                    pPool->cPresent--;
     3197
    31583198                    if (!cRefs)
    31593199                        return bRet;
     
    34253465                                //Log4(("pgmPoolTrackFlushGCPhysPTsSlow: idx=%d i=%d pte=%RX32\n", iPage, i, pPT->a[i]));
    34263466                                pPT->a[i].u = 0;
     3467
     3468                                /* Update the counter as we're removing references. */
     3469                                Assert(pPage->cPresent);
     3470                                Assert(pPool->cPresent);
     3471                                pPage->cPresent--;
     3472                                pPool->cPresent--;
    34273473                            }
    34283474                            if (!--cPresent)
     
    34473493                                //Log4(("pgmPoolTrackFlushGCPhysPTsSlow: idx=%d i=%d pte=%RX64\n", iPage, i, pPT->a[i]));
    34483494                                pPT->a[i].u = 0;
     3495
     3496                                /* Update the counter as we're removing references. */
     3497                                Assert(pPage->cPresent);
     3498                                Assert(pPool->cPresent);
     3499                                pPage->cPresent--;
     3500                                pPool->cPresent--;
    34493501                            }
    34503502                            if (!--cPresent)
     
    34533505                    break;
    34543506                }
     3507#ifndef IN_RC
     3508                case PGMPOOLKIND_EPT_PT_FOR_PHYS:
     3509                {
     3510                    unsigned  cPresent = pPage->cPresent;
     3511                    PEPTPT    pPT = (PEPTPT)PGMPOOL_PAGE_2_PTR(pVM, pPage);
     3512                    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
     3513                        if (pPT->a[i].n.u1Present)
     3514                        {
     3515                            if ((pPT->a[i].u & (EPT_PTE_PG_MASK | X86_PTE_P)) == u64)
     3516                            {
     3517                                //Log4(("pgmPoolTrackFlushGCPhysPTsSlow: idx=%d i=%d pte=%RX64\n", iPage, i, pPT->a[i]));
     3518                                pPT->a[i].u = 0;
     3519
     3520                                /* Update the counter as we're removing references. */
     3521                                Assert(pPage->cPresent);
     3522                                Assert(pPool->cPresent);
     3523                                pPage->cPresent--;
     3524                                pPool->cPresent--;
     3525                            }
     3526                            if (!--cPresent)
     3527                                break;
     3528                        }
     3529                    break;
     3530                }
     3531#endif
    34553532            }
    34563533            if (!--cLeft)
     
    39163993            Assert(PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]));
    39173994#ifdef LOG_ENABLED
    3918 RTHCPHYS HCPhysPage = PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]);
    3919 Log2(("pgmPoolTracDerefGCPhys %RHp vs %RHp\n", HCPhysPage, HCPhys));
     3995            RTHCPHYS HCPhysPage = PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]);
     3996            Log2(("pgmPoolTracDerefGCPhys %RHp vs %RHp\n", HCPhysPage, HCPhys));
    39203997#endif
    39213998            if (PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]) == HCPhys)
    39223999            {
     4000                Assert(pPage->cPresent);
     4001                Assert(pPool->cPresent);
     4002                pPage->cPresent--;
     4003                pPool->cPresent--;
    39234004                pgmTrackDerefGCPhys(pPool, pPage, &pRam->aPages[iPage]);
    39244005                return;
     
    39404021 * @param   GCPhysHint  The guest physical address which may corresponding to HCPhys.
    39414022 */
    3942 void pgmPoolTracDerefGCPhysHint(PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTHCPHYS HCPhys, RTGCPHYS GCPhysHint)
     4023static void pgmPoolTracDerefGCPhysHint(PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTHCPHYS HCPhys, RTGCPHYS GCPhysHint)
    39434024{
    39444025    Log4(("pgmPoolTracDerefGCPhysHint %RHp %RGp\n", HCPhys, GCPhysHint));
     
    40074088                  i, pShwPT->a[i].u & X86_PTE_PG_MASK, pGstPT->a[i].u & X86_PTE_PG_MASK));
    40084089            pgmPoolTracDerefGCPhysHint(pPool, pPage, pShwPT->a[i].u & X86_PTE_PG_MASK, pGstPT->a[i].u & X86_PTE_PG_MASK);
    4009             if (!--pPage->cPresent)
     4090            if (!pPage->cPresent)
    40104091                break;
    40114092        }
     
    40294110                  i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PG_MASK));
    40304111            pgmPoolTracDerefGCPhysHint(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PG_MASK);
    4031             if (!--pPage->cPresent)
     4112            if (!pPage->cPresent)
    40324113                break;
    40334114        }
     
    40514132                  i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PAE_PG_MASK));
    40524133            pgmPoolTracDerefGCPhysHint(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PAE_PG_MASK);
    4053             if (!--pPage->cPresent)
     4134            if (!pPage->cPresent)
    40544135                break;
    40554136        }
     
    40734154                  i, pShwPT->a[i].u & X86_PTE_PG_MASK, GCPhys));
    40744155            pgmPoolTracDerefGCPhys(pPool, pPage, pShwPT->a[i].u & X86_PTE_PG_MASK, GCPhys);
    4075             if (!--pPage->cPresent)
     4156            if (!pPage->cPresent)
    40764157                break;
    40774158        }
     
    40954176                  i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, GCPhys));
    40964177            pgmPoolTracDerefGCPhys(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, GCPhys);
    4097             if (!--pPage->cPresent)
     4178            if (!pPage->cPresent)
    40984179                break;
    40994180        }
     
    41174198                  i, pShwPT->a[i].u & EPT_PTE_PG_MASK, pPage->GCPhys));
    41184199            pgmPoolTracDerefGCPhys(pPool, pPage, pShwPT->a[i].u & EPT_PTE_PG_MASK, GCPhys);
    4119             if (!--pPage->cPresent)
     4200            if (!pPage->cPresent)
    41204201                break;
    41214202        }
     
    41634244           )
    41644245        {
    4165             PPGMPOOLPAGE pSubPage = (PPGMPOOLPAGE)RTAvloHCPhysGet(&pPool->HCPhysTree, pShwPD->a[i].u & X86_PDE_PAE_PG_MASK);
    4166             if (pSubPage)
    4167                 pgmPoolTrackFreeUser(pPool, pSubPage, pPage->idx, i);
     4246#ifdef PGM_WITH_LARGE_PAGES
     4247            if (pShwPD->a[i].b.u1Size)
     4248            {
     4249                Log4(("pgmPoolTrackDerefPDPae: i=%d pde=%RX64 GCPhys=%RX64\n",
     4250                      i, pShwPD->a[i].u & X86_PDE2M_PAE_PG_MASK, pPage->GCPhys));
     4251                pgmPoolTracDerefGCPhys(pPool, pPage, pShwPD->a[i].u & X86_PDE2M_PAE_PG_MASK, pPage->GCPhys /* == base of 2 MB page */);
     4252            }
    41684253            else
    4169                 AssertFatalMsgFailed(("%RX64\n", pShwPD->a[i].u & X86_PDE_PAE_PG_MASK));
    4170             /** @todo 64-bit guests: have to ensure that we're not exhausting the dynamic mappings! */
     4254#endif
     4255            {
     4256                PPGMPOOLPAGE pSubPage = (PPGMPOOLPAGE)RTAvloHCPhysGet(&pPool->HCPhysTree, pShwPD->a[i].u & X86_PDE_PAE_PG_MASK);
     4257                if (pSubPage)
     4258                    pgmPoolTrackFreeUser(pPool, pSubPage, pPage->idx, i);
     4259                else
     4260                    AssertFatalMsgFailed(("%RX64\n", pShwPD->a[i].u & X86_PDE_PAE_PG_MASK));
     4261                /** @todo 64-bit guests: have to ensure that we're not exhausting the dynamic mappings! */
     4262            }
    41714263        }
    41724264    }
     
    42604352        if (pShwPD->a[i].n.u1Present)
    42614353        {
    4262             PPGMPOOLPAGE pSubPage = (PPGMPOOLPAGE)RTAvloHCPhysGet(&pPool->HCPhysTree, pShwPD->a[i].u & EPT_PDE_PG_MASK);
    4263             if (pSubPage)
    4264                 pgmPoolTrackFreeUser(pPool, pSubPage, pPage->idx, i);
     4354#ifdef PGM_WITH_LARGE_PAGES
     4355            if (pShwPD->a[i].b.u1Size)
     4356            {
     4357                Log4(("pgmPoolTrackDerefPDEPT: i=%d pde=%RX64 GCPhys=%RX64\n",
     4358                      i, pShwPD->a[i].u & X86_PDE2M_PAE_PG_MASK, pPage->GCPhys));
     4359                pgmPoolTracDerefGCPhys(pPool, pPage, pShwPD->a[i].u & X86_PDE2M_PAE_PG_MASK, pPage->GCPhys /* == base of 2 MB page */);
     4360            }
    42654361            else
    4266                 AssertFatalMsgFailed(("%RX64\n", pShwPD->a[i].u & EPT_PDE_PG_MASK));
     4362#endif
     4363            {
     4364                PPGMPOOLPAGE pSubPage = (PPGMPOOLPAGE)RTAvloHCPhysGet(&pPool->HCPhysTree, pShwPD->a[i].u & EPT_PDE_PG_MASK);
     4365                if (pSubPage)
     4366                    pgmPoolTrackFreeUser(pPool, pSubPage, pPage->idx, i);
     4367                else
     4368                    AssertFatalMsgFailed(("%RX64\n", pShwPD->a[i].u & EPT_PDE_PG_MASK));
     4369            }
    42674370            /** @todo 64-bit guests: have to ensure that we're not exhausting the dynamic mappings! */
    42684371        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette