VirtualBox

Changeset 27543 in vbox


Ignore:
Timestamp:
Mar 19, 2010 3:47:14 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
59056
Message:

Balloon updates; make ballooned pages as such

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

Legend:

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

    r27282 r27543  
    42684268        while (GCPhys < pRam->GCPhysLast && RT_SUCCESS(rc))
    42694269        {
    4270             if (PGM_PAGE_IS_ZERO(pPage))
     4270            if (    PGM_PAGE_IS_ZERO(pPage)
     4271                ||  PGM_PAGE_IS_BALLOONED(pPage))
    42714272            {
    42724273                if (fIncZeroPgs)
  • trunk/src/VBox/VMM/PGMDbg.cpp

    r26150 r27543  
    607607                if (    (   !PGM_PAGE_IS_ZERO(pPage)
    608608                         || fAllZero)
     609                    &&  !PGM_PAGE_IS_BALLOONED(pPage)
    609610                    &&  !PGM_PAGE_IS_MMIO(pPage))
    610611                {
     
    747748                &&  (   !PGM_PAGE_IS_ZERO(pPage)
    748749                     || fAllZero)
     750                &&  !PGM_PAGE_IS_BALLOONED(pPage)
    749751                &&  !PGM_PAGE_IS_MMIO(pPage))
    750752            {
  • trunk/src/VBox/VMM/PGMInternal.h

    r27488 r27543  
    826826 * @param   pPage       Pointer to the physical guest page tracking structure.
    827827 */
    828 #define PGM_PAGE_IS_BALLOONED(pPage)            ( (pPage)->uStateY == PGM_PAGE_STATE_BALLOONED )
     828#define PGM_PAGE_IS_BALLOONED(pPage)        ( (pPage)->uStateY == PGM_PAGE_STATE_BALLOONED )
    829829
    830830/**
  • trunk/src/VBox/VMM/PGMPhys.cpp

    r27195 r27543  
    824824                return rc;
    825825            }
     826            Assert(PGM_PAGE_IS_ZERO(pPage));
     827            PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_BALLOONED);
    826828        }
    827829
     
    12631265                    }
    12641266
     1267                    case PGM_PAGE_STATE_BALLOONED:
    12651268                    case PGM_PAGE_STATE_ALLOCATED:
    12661269                    case PGM_PAGE_STATE_WRITE_MONITORED:
     
    13361339                        }
    13371340                        else
    1338                         if (!PGM_PAGE_IS_ZERO(pPage))
     1341                        if (    !PGM_PAGE_IS_ZERO(pPage)
     1342                            &&  !PGM_PAGE_IS_BALLOONED(pPage))
    13391343                        {
    13401344                            rc = pgmPhysFreePage(pVM, pReq, &cPendingPages, pPage, pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT));
     
    13701374                            case PGM_PAGE_STATE_ZERO:
    13711375                                break;
     1376
     1377                            case PGM_PAGE_STATE_BALLOONED:
     1378                                /* Turn into a zero page; the balloon status is lost when the VM reboots. */
     1379                                PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO);
     1380                                break;
     1381
    13721382                            case PGM_PAGE_STATE_SHARED:
    13731383                            case PGM_PAGE_STATE_WRITE_MONITORED:
    13741384                                rc = pgmPhysPageMakeWritable(pVM, pPage, pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT));
    13751385                                AssertLogRelRCReturn(rc, rc);
     1386                                /* no break */
     1387
    13761388                            case PGM_PAGE_STATE_ALLOCATED:
    13771389                            {
     
    27812793
    27822794                for (uint32_t iPage = 0; iPage < cPages; iPage++)
    2783                     if (PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) != PGM_PAGE_STATE_ZERO)
     2795                    if (    !PGM_PAGE_IS_ZERO(&pRom->aPages[iPage].Shadow)
     2796                        &&  !PGM_PAGE_IS_BALLOONED(&pRom->aPages[iPage].Shadow))
    27842797                    {
    27852798                        Assert(PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) == PGM_PAGE_STATE_ALLOCATED);
     
    28002813                for (uint32_t iPage = 0; iPage < cPages; iPage++)
    28012814                {
    2802                     Assert(PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) != PGM_PAGE_STATE_ZERO);
     2815                    Assert(!PGM_PAGE_IS_ZERO(&pRom->aPages[iPage].Shadow) && !PGM_PAGE_IS_BALLOONED(&pRom->aPages[iPage].Shadow));
    28032816                    void *pvDstPage;
    28042817                    const RTGCPHYS GCPhys = pRom->GCPhys + (iPage << PAGE_SHIFT);
     
    34803493    }
    34813494
    3482     if (PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_ZERO)
     3495    if (    PGM_PAGE_IS_ZERO(pPage)
     3496        ||  PGM_PAGE_IS_BALLOONED(pPage))
    34833497        return VINF_SUCCESS;
    34843498
     
    36213635                    case PGM_PAGE_STATE_ALLOCATED:
    36223636                        break;
     3637                    case PGM_PAGE_STATE_BALLOONED:
     3638                        AssertFailed();
     3639                        break;
    36233640                    case PGM_PAGE_STATE_ZERO:
    36243641                    case PGM_PAGE_STATE_SHARED:
  • trunk/src/VBox/VMM/PGMSavedState.cpp

    r27197 r27543  
    216216            {
    217217                if (PGMROMPROT_IS_ROM(pRom->aPages[iPage].enmProt))
    218                     pRom->aPages[iPage].LiveSave.fWrittenTo = !PGM_PAGE_IS_ZERO(&pRom->aPages[iPage].Shadow);
     218                    pRom->aPages[iPage].LiveSave.fWrittenTo = !PGM_PAGE_IS_ZERO(&pRom->aPages[iPage].Shadow) && !PGM_PAGE_IS_BALLOONED(&pRom->aPages[iPage].Shadow);
    219219                else
    220220                {
     
    224224                    AssertLogRelMsgRC(rc, ("%Rrc GCPhys=%RGp\n", rc, GCPhys));
    225225                    if (RT_SUCCESS(rc))
    226                         pRom->aPages[iPage].LiveSave.fWrittenTo = !PGM_PAGE_IS_ZERO(pPage);
     226                        pRom->aPages[iPage].LiveSave.fWrittenTo = !PGM_PAGE_IS_ZERO(pPage) && !PGM_PAGE_IS_BALLOONED(pPage);
    227227                    else
    228                         pRom->aPages[iPage].LiveSave.fWrittenTo = !PGM_PAGE_IS_ZERO(&pRom->aPages[iPage].Shadow);
     228                        pRom->aPages[iPage].LiveSave.fWrittenTo = !PGM_PAGE_IS_ZERO(&pRom->aPages[iPage].Shadow) && !PGM_PAGE_IS_BALLOONED(&pRom->aPages[iPage].Shadow);
    229229                }
    230230            }
     
    419419            int rc = VINF_SUCCESS;
    420420            char abPage[PAGE_SIZE];
    421             if (!PGM_PAGE_IS_ZERO(pPage))
     421            if (    !PGM_PAGE_IS_ZERO(pPage)
     422                &&  !PGM_PAGE_IS_BALLOONED(pPage))
    422423            {
    423424                void const *pvPage;
     
    503504                    RTGCPHYS    GCPhys  = pRom->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    504505                    PPGMPAGE    pPage   = PGMROMPROT_IS_ROM(enmProt) ? &pRomPage->Shadow : pgmPhysGetPage(&pVM->pgm.s, GCPhys);
    505                     bool        fZero   = PGM_PAGE_IS_ZERO(pPage);
     506                    bool        fZero   = PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_BALLOONED(pPage);
    506507                    int         rc      = VINF_SUCCESS;
    507508                    if (!fZero)
     
    10741075                    {
    10751076                        case PGMPAGETYPE_RAM:
    1076                             if (PGM_PAGE_IS_ZERO(pPage))
     1077                            if (    PGM_PAGE_IS_ZERO(pPage)
     1078                                ||  PGM_PAGE_IS_BALLOONED(pPage))
    10771079                            {
    10781080                                paLSPages[iPage].fZero   = 1;
     
    12421244    {
    12431245        uint32_t u32Crc = RTCrc32(pvPage, PAGE_SIZE);
    1244         Assert(!PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]) || u32Crc == PGM_STATE_CRC32_ZERO_PAGE);
     1246        Assert((!PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]) && !PGM_PAGE_IS_BALLOONED(&pCur->aPages[iPage])) || u32Crc == PGM_STATE_CRC32_ZERO_PAGE);
    12451247        AssertMsg(paLSPages[iPage].u32Crc == u32Crc,
    12461248                  ("%08x != %08x for %RGp %R[pgmpage]\n", paLSPages[iPage].u32Crc, u32Crc,
     
    13911393
    13921394                            case PGM_PAGE_STATE_ZERO:
     1395                                if (!paLSPages[iPage].fZero)
     1396                                {
     1397                                    if (!paLSPages[iPage].fDirty)
     1398                                    {
     1399                                        paLSPages[iPage].fDirty = 1;
     1400                                        pVM->pgm.s.LiveSave.Ram.cReadyPages--;
     1401                                        pVM->pgm.s.LiveSave.Ram.cDirtyPages++;
     1402                                    }
     1403                                    paLSPages[iPage].fZero = 1;
     1404                                    paLSPages[iPage].fShared = 0;
     1405#ifdef PGMLIVESAVERAMPAGE_WITH_CRC32
     1406                                    paLSPages[iPage].u32Crc = PGM_STATE_CRC32_ZERO_PAGE;
     1407#endif
     1408                                }
     1409                                break;
     1410
     1411                            case PGM_PAGE_STATE_BALLOONED:
    13931412                                if (!paLSPages[iPage].fZero)
    13941413                                {
     
    15201539
    15211540                    /*
    1522                      * Only save pages that hasn't changed since last scan and are dirty.
     1541                     * Only save pages that haven't changed since last scan and are dirty.
    15231542                     */
    15241543                    if (    uPass != SSM_PASS_FINAL
     
    15641583                    int         rc;
    15651584                    RTGCPHYS    GCPhys = pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    1566                     bool        fZero  = PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]);
     1585                    bool        fZero  = PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]) || PGM_PAGE_IS_BALLOONED(&pCur->aPages[iPage]);
    15671586
    15681587                    if (!fZero)
     
    21002119
    21012120    /* I think this should be sufficient. */
    2102     if (!PGM_PAGE_IS_ZERO(pPage))
     2121    if (    !PGM_PAGE_IS_ZERO(pPage)
     2122        &&  !PGM_PAGE_IS_BALLOONED(pPage))
    21032123        return VERR_SSM_UNEXPECTED_DATA;
    21042124
     
    25352555                    case PGM_STATE_REC_RAM_ZERO:
    25362556                    {
    2537                         if (PGM_PAGE_IS_ZERO(pPage))
     2557                        if (    PGM_PAGE_IS_ZERO(pPage)
     2558                            ||  PGM_PAGE_IS_BALLOONED(pPage))
    25382559                            break;
    25392560                        /** @todo implement zero page replacing. */
     
    27032724                {
    27042725                    case PGM_STATE_REC_ROM_SHW_ZERO:
    2705                         if (PGM_PAGE_IS_ZERO(pRealPage))
     2726                        if (    PGM_PAGE_IS_ZERO(pRealPage)
     2727                            ||  PGM_PAGE_IS_BALLOONED(pRealPage))
    27062728                            break;
    27072729                        /** @todo implement zero page replacing. */
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