VirtualBox

Changeset 32051 in vbox for trunk/src


Ignore:
Timestamp:
Aug 27, 2010 1:05:10 PM (14 years ago)
Author:
vboxsync
Message:

FT updates

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

Legend:

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

    r32002 r32051  
    570570{
    571571    int rc;
     572    bool fFullSync = false;
    572573
    573574    if (enmState != FTMSYNCSTATE_DELTA_MEMORY)
     
    580581    {
    581582    case FTMSYNCSTATE_FULL:
     583        fFullSync = true;
     584        /* no break */
     585    case FTMSYNCSTATE_DELTA_VM:
    582586    {
    583587        bool fSuspended = false;
    584588
    585         rc = ftmR3TcpSubmitCommand(pVM, "full-sync");
     589        rc = ftmR3TcpSubmitCommand(pVM, (fFullSync) ? "full-sync" : "checkpoint");
    586590        AssertRC(rc);
    587591
     592        pVM->ftm.s.fDeltaLoadSaveActive = (fFullSync == false);
    588593        rc = VMR3Save(pVM, NULL /* pszFilename */, &g_ftmR3TcpOps, pVM, true /* fContinueAfterwards */, NULL, NULL, &fSuspended);
     594        pVM->ftm.s.fDeltaLoadSaveActive = false;
    589595        AssertRC(rc);
    590596
    591         rc = ftmR3TcpReadACK(pVM, "full-sync-complete");
     597        rc = ftmR3TcpReadACK(pVM, (fFullSync) ? "full-sync-complete" : "checkpoint-complete");
    592598        AssertRC(rc);
    593599        break;
    594600    }
    595 
    596     case FTMSYNCSTATE_DELTA_VM:
    597         break;
    598601
    599602    case FTMSYNCSTATE_DELTA_MEMORY:
     
    812815    for (;;)
    813816    {
     817        bool fFullSync = false;
    814818        char szCmd[128];
     819
    815820        rc = ftmR3TcpReadLine(pVM, szCmd, sizeof(szCmd));
    816821        AssertRC(rc);
     
    866871        }
    867872        else
    868         if (!strcmp(szCmd, "heartbeat"))
    869         {
    870         }
    871         else
    872         if (!strcmp(szCmd, "checkpoint"))
    873         {
    874         }
    875         else
    876         if (!strcmp(szCmd, "full-sync"))
     873        if (    !strcmp(szCmd, "checkpoint")
     874            ||  (fFullSync = true)  /* intended assignment */
     875            ||  !strcmp(szCmd, "full-sync"))
    877876        {
    878877            rc = ftmR3TcpWriteACK(pVM);
     
    884883            pVM->ftm.s.syncstate.uOffStream = 0;
    885884
     885            pVM->ftm.s.fDeltaLoadSaveActive = (fFullSync == false);
    886886            rc = VMR3LoadFromStream(pVM, &g_ftmR3TcpOps, pVM, NULL, NULL);
     887            pVM->ftm.s.fDeltaLoadSaveActive = false;
    887888            RTSocketRelease(pVM->ftm.s.hSocket);
    888889            AssertRC(rc);
     
    907908            rc = ftmR3TcpWriteACK(pVM);
    908909            AssertRC(rc);
    909         }       
     910        }
    910911    }
    911912    LogFlowFunc(("returns mRc=%Rrc\n", rc));
  • trunk/src/VBox/VMM/FTMInternal.h

    r31895 r32051  
    6060    /** Set when this master VM is busy with checkpointing. */
    6161    bool                fCheckpointingActive;
    62     bool                fAlignment[6];
     62    /** Set when VM save/restore should only include changed pages. */
     63    bool                fDeltaLoadSaveActive;
     64    bool                fAlignment[5];
    6365
    6466    /** Current active socket. */
  • trunk/src/VBox/VMM/PGMSavedState.cpp

    r31847 r32051  
    3232#include <VBox/param.h>
    3333#include <VBox/err.h>
     34#include <VBox/ftm.h>
    3435
    3536#include <iprt/asm.h>
     
    398399static int pgmR3SaveRomVirginPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave)
    399400{
     401    if (FTMIsDeltaLoadSaveActive(pVM))
     402        return VINF_SUCCESS;    /* nothing to do as nothing has changed here */
     403
    400404    pgmLock(pVM);
    401405    for (PPGMROMRANGE pRom = pVM->pgm.s.pRomRangesR3; pRom; pRom = pRom->pNextR3)
     
    473477static int pgmR3SaveShadowedRomPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, bool fFinalPass)
    474478{
     479    if (FTMIsDeltaLoadSaveActive(pVM))
     480        return VINF_SUCCESS;    /* nothing to do as we deal with those pages seperately */
     481
    475482    /*
    476483     * The Shadowed ROMs.
     
    15131520    RTGCPHYS GCPhysCur = 0;
    15141521    PPGMRAMRANGE pCur;
     1522    bool fFTMDeltaSaveActive = FTMIsDeltaLoadSaveActive(pVM);
     1523
    15151524    pgmLock(pVM);
    15161525    do
     
    15381547                    }
    15391548
     1549                    PPGMPAGE pCurPage = &pCur->aPages[iPage];
     1550
    15401551                    /*
    15411552                     * Only save pages that haven't changed since last scan and are dirty.
     
    15501561                        if (paLSPages[iPage].fIgnore)
    15511562                            continue;
    1552                         if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM) /* in case of recent remappings */
     1563                        if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM) /* in case of recent remappings */
    15531564                            continue;
    1554                         if (    PGM_PAGE_GET_STATE(&pCur->aPages[iPage])
     1565                        if (    PGM_PAGE_GET_STATE(pCurPage)
    15551566                            !=  (  paLSPages[iPage].fZero
    15561567                                 ? PGM_PAGE_STATE_ZERO
     
    15691580                        {
    15701581#ifdef PGMLIVESAVERAMPAGE_WITH_CRC32
    1571                             if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM)
     1582                            if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM)
    15721583                                pgmR3StateVerifyCrc32ForRamPage(pVM, pCur, paLSPages, iPage, "save#1");
    15731584#endif
    15741585                            continue;
    15751586                        }
    1576                         if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM)
     1587                        if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM)
    15771588                            continue;
    15781589                    }
     
    15831594                    int         rc;
    15841595                    RTGCPHYS    GCPhys = pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    1585                     bool        fZero  = PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]) || PGM_PAGE_IS_BALLOONED(&pCur->aPages[iPage]);
     1596                    bool        fZero  = PGM_PAGE_IS_ZERO(pCurPage) || PGM_PAGE_IS_BALLOONED(pCurPage);
    15861597
    15871598                    if (!fZero)
     
    15931604                        uint8_t     abPage[PAGE_SIZE];
    15941605                        void const *pvPage;
    1595                         rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, &pCur->aPages[iPage], GCPhys, &pvPage);
     1606                        rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pCurPage, GCPhys, &pvPage);
    15961607                        if (RT_SUCCESS(rc))
    15971608                        {
     
    16081619                        if (!ASMMemIsZeroPage(pvPage))
    16091620                        {
    1610                             if (GCPhys == GCPhysLast + PAGE_SIZE)
    1611                                 SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW);
     1621                            if (fFTMDeltaSaveActive)
     1622                            {
     1623                                if (    PGM_PAGE_IS_WRITTEN_TO(pCurPage)
     1624                                    ||  PGM_PAGE_IS_FT_DIRTY(pCurPage))
     1625                                {
     1626                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
     1627                                    SSMR3PutGCPhys(pSSM, GCPhys);
     1628                                    rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
     1629                                }
     1630                                /* else nothing changed, so skip it. */
     1631                            }
    16121632                            else
    16131633                            {
    1614                                 SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
    1615                                 SSMR3PutGCPhys(pSSM, GCPhys);
     1634                                if (GCPhys == GCPhysLast + PAGE_SIZE)
     1635                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW);
     1636                                else
     1637                                {
     1638                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
     1639                                    SSMR3PutGCPhys(pSSM, GCPhys);
     1640                                }
     1641                                rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
    16161642                            }
    1617                             rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
    16181643                        }
    16191644                        else
     
    16751700        } /* for each range */
    16761701    } while (pCur);
     1702
    16771703    pgmUnlock(pVM);
    16781704
  • trunk/src/VBox/VMM/VMMAll/FTMAll.cpp

    r31792 r32051  
    4949#endif
    5050}
     51
     52
     53/**
     54 * Checks if the delta save/load is enabled
     55 *
     56 * @returns true/false
     57 *
     58 * @param   pVM         The VM to operate on.
     59 */
     60VMMDECL(bool)  FTMIsDeltaLoadSaveActive(PVM pVM)
     61{
     62    return pVM->ftm.s.fDeltaLoadSaveActive;
     63}
     64
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