VirtualBox

Changeset 27540 in vbox for trunk/src


Ignore:
Timestamp:
Mar 19, 2010 3:24:22 PM (15 years ago)
Author:
vboxsync
Message:

Step one in dealing with ballooned pages in shadow paging

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r27490 r27540  
    807807                        Log(("PGM #PF: Make writable: %RGp %R[pgmpage] pvFault=%RGp uErr=%#x\n", GCPhys, pPage, pvFault, uErr));
    808808                        Assert(!PGM_PAGE_IS_ZERO(pPage));
     809                        AssertFatalMsg(!PGM_PAGE_IS_BALLOONED(pPage), ("Unexpected ballooned page at %RGp\n", GCPhys));
    809810
    810811                        rc = pgmPhysPageMakeWritable(pVM, pPage, GCPhys);
     
    14021403        if (RT_SUCCESS(rc))
    14031404        {
     1405            /* Ignore ballooned pages. Don't return errors or use a fatal assert here as part of a shadow sync range might included ballooned pages. */
     1406            if (PGM_PAGE_IS_BALLOONED(pPage))
     1407                return;
     1408
    14041409#ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC
    14051410            /* Try to make the page writable if necessary. */
     
    14111416                         && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
    14121417# endif
    1413                          && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
     1418                        )
    14141419                     )
    14151420               )
     
    17951800                if (RT_SUCCESS(rc))
    17961801                {
     1802                    AssertFatalMsg(!PGM_PAGE_IS_BALLOONED(pPage), ("Unexpected ballooned page at %RGp\n", GCPhys));
     1803
    17971804# ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC
    17981805                    /* Try to make the page writable if necessary. */
     
    18041811                                 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
    18051812#  endif
    1806                                  && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
     1813                                 )
    18071814                             )
    18081815                       )
     
    18261833                            PteDst.u = 0;
    18271834                    }
     1835
    18281836                    const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    1829                     if (PteDst.n.u1Present && !pPTDst->a[iPTDst].n.u1Present)
     1837                    if (    PteDst.n.u1Present
     1838                        &&  !pPTDst->a[iPTDst].n.u1Present)
    18301839                        PGM_BTH_NAME(SyncPageWorkerTrackAddref)(pVCpu, pShwPage, PGM_PAGE_GET_TRACKING(pPage), pPage, iPTDst);
    18311840
     
    28332842                                     && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
    28342843#  endif
    2835                                      && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
     2844                                     && !PGM_PAGE_IS_BALLOONED(pPage))
    28362845                                 )
    28372846                           )
     
    28532862                            else
    28542863                                PteDst.u = 0;
     2864                        }
     2865                        else
     2866                        if (PGM_PAGE_IS_BALLOONED(pPage))
     2867                        {
     2868                            /* Skip ballooned pages. */
     2869                            PteDst.u = 0;
    28552870                        }
    28562871# ifndef IN_RING0
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r27488 r27540  
    673673        case PGM_PAGE_STATE_SHARED:
    674674            return pgmPhysAllocPage(pVM, pPage, GCPhys);
     675
     676        /* Not allowed to write to ballooned pages. */
     677        case PGM_PAGE_STATE_BALLOONED:
     678            return VERR_PGM_PHYS_PAGE_BALLOONED;
    675679    }
    676680}
     
    10091013    PPGMPAGE pPage = &pRam->aPages[off >> PAGE_SHIFT];
    10101014    PPGMPAGEMAPTLBE pTlbe = &pPGM->CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
    1011     if (!PGM_PAGE_IS_ZERO(pPage))
     1015    if (    !PGM_PAGE_IS_ZERO(pPage)
     1016        &&  !PGM_PAGE_IS_BALLOONED(pPage))
    10121017    {
    10131018        void *pv;
     
    10581063     */
    10591064    PPGMPAGEMAPTLBE pTlbe = &pPGM->CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
    1060     if (!PGM_PAGE_IS_ZERO(pPage))
     1065    if (    !PGM_PAGE_IS_ZERO(pPage)
     1066        &&  !PGM_PAGE_IS_BALLOONED(pPage))
    10611067    {
    10621068        void *pv;
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r27465 r27540  
    33813381         * will be needed for this problem of course, but it will have to wait...
    33823382         */
    3383         if (PGM_PAGE_IS_ZERO(pPhysPage))
     3383        if (    PGM_PAGE_IS_ZERO(pPhysPage)
     3384            ||  PGM_PAGE_IS_BALLOONED(pPhysPage))
    33843385            rc = VINF_PGM_GCPHYS_ALIASED;
    33853386        else
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