VirtualBox

Changeset 29620 in vbox


Ignore:
Timestamp:
May 18, 2010 12:15:55 PM (14 years ago)
Author:
vboxsync
Message:

Statistics for shared pages

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/gmm.h

    r29613 r29620  
    419419    /** The number of ballooned pages (out). */
    420420    uint64_t            cBalloonedPages;
     421    /** The number of shared pages (out). */
     422    uint64_t            cSharedPages;
    421423    /** Maximum nr of pages (out). */
    422424    uint64_t            cMaxPages;
     
    607609GMMR3DECL(int)  GMMR3MapUnmapChunk(PVM pVM, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3);
    608610GMMR3DECL(int)  GMMR3SeedChunk(PVM pVM, RTR3PTR pvR3);
    609 GMMR3DECL(int)  GMMR3QueryHypervisorMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages);
     611GMMR3DECL(int)  GMMR3QueryHypervisorMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages, uint64_t *puTotalBalloonSize);
    610612GMMR3DECL(int)  GMMR3QueryMemoryStats(PVM pVM, uint64_t *pcAllocPages, uint64_t *pcMaxPages, uint64_t *pcBalloonPages);
    611613GMMR3DECL(int)  GMMR3BalloonedPages(PVM pVM, GMMBALLOONACTION enmAction, uint32_t cBalloonedPages);
  • trunk/include/VBox/pgm.h

    r29567 r29620  
    467467VMMR3DECL(int)      PGMR3PhysRegisterRam(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, const char *pszDesc);
    468468VMMR3DECL(int)      PGMR3PhysChangeMemBalloon(PVM pVM, bool fInflate, unsigned cPages, RTGCPHYS *paPhysPage);
    469 VMMR3DECL(int)      PGMR3QueryVMMMemoryStats(PVM pVM, uint64_t *puTotalAllocSize, uint64_t *puTotalFreeSize, uint64_t *puTotalBalloonSize);
     469VMMR3DECL(int)      PGMR3QueryVMMMemoryStats(PVM pVM, uint64_t *puTotalAllocSize, uint64_t *puTotalFreeSize, uint64_t *puTotalBalloonSize, uint64_t *puTotalSharedSize);
     470VMMR3DECL(int)      PGMR3QueryMemoryStats(PVM pVM, uint64_t *pulTotalMem, uint64_t *pulPrivateMem, uint64_t *puTotalSharedMem, uint64_t *puTotalZeroMem);
    470471VMMR3DECL(int)      PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
    471472                                          R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
  • trunk/src/VBox/Main/GuestImpl.cpp

    r29591 r29620  
    338338    *aMemCache   = mCurrentGuestStat[GUESTSTATTYPE_MEMCACHE] * (_4K/_1K);     /* page (4K) -> 1KB units */
    339339    *aPageTotal  = mCurrentGuestStat[GUESTSTATTYPE_PAGETOTAL] * (_4K/_1K);   /* page (4K) -> 1KB units */
    340     *aMemShared  = 0; /** todo */
    341340
    342341    Console::SafeVMPtr pVM (mParent);
    343342    if (pVM.isOk())
    344343    {
    345         uint64_t uFreeTotal, uAllocTotal, uBalloonedTotal;
     344        uint64_t uFreeTotal, uAllocTotal, uBalloonedTotal, uSharedTotal;
    346345        *aMemFreeTotal = 0;
    347         int rc = PGMR3QueryVMMMemoryStats(pVM.raw(), &uAllocTotal, &uFreeTotal, &uBalloonedTotal);
     346        int rc = PGMR3QueryVMMMemoryStats(pVM.raw(), &uAllocTotal, &uFreeTotal, &uBalloonedTotal, &uSharedTotal);
    348347        AssertRC(rc);
    349348        if (rc == VINF_SUCCESS)
     
    352351            *aMemFreeTotal    = (ULONG)(uFreeTotal / _1K);
    353352            *aMemBalloonTotal = (ULONG)(uBalloonedTotal / _1K);
    354             *aMemSharedTotal  = 0; /** todo */
     353            *aMemSharedTotal  = (ULONG)(uSharedTotal / _1K);
     354        }
     355
     356        /* Query the missing per-VM memory statistics. */
     357        *aMemShared  = 0;
     358        uint64_t uTotalMem, uPrivateMem, uSharedMem, uZeroMem;
     359        rc = PGMR3QueryMemoryStats(pVM.raw(), &uTotalMem, &uPrivateMem, &uSharedMem, &uZeroMem);
     360        if (rc == VINF_SUCCESS)
     361        {
     362            *aMemShared = (ULONG)(uSharedMem / _1K);
    355363        }
    356364    }
    357365    else
     366    {
    358367        *aMemFreeTotal = 0;
     368        *aMemShared  = 0;
     369    }
    359370
    360371    return S_OK;
  • trunk/src/VBox/Main/HostImpl.cpp

    r29615 r29620  
    23562356    pm::SubMetric *ramVMMBallooned  = new pm::SubMetric("RAM/VMM/Ballooned",
    23572357        "Total physical memory ballooned by the hypervisor.");
     2358    pm::SubMetric *ramVMMShared = new pm::SubMetric("RAM/VMM/Shared",
     2359        "Total physical memory shared between VMs.");
    23582360
    23592361
     
    23682370    aCollector->registerBaseMetric (cpuMhz);
    23692371    pm::BaseMetric *ramUsage = new pm::HostRamUsage(hal, objptr, ramUsageTotal, ramUsageUsed,
    2370                                            ramUsageFree, ramVMMUsed, ramVMMFree, ramVMMBallooned);
     2372                                           ramUsageFree, ramVMMUsed, ramVMMFree, ramVMMBallooned, ramVMMShared);
    23712373    aCollector->registerBaseMetric (ramUsage);
    23722374
     
    24502452    aCollector->registerMetric(new pm::Metric(ramUsage, ramVMMBallooned,
    24512453                                              new pm::AggregateMax()));
     2454
     2455    aCollector->registerMetric(new pm::Metric(ramUsage, ramVMMShared, 0));
     2456    aCollector->registerMetric(new pm::Metric(ramUsage, ramVMMShared,
     2457                                              new pm::AggregateAvg()));
     2458    aCollector->registerMetric(new pm::Metric(ramUsage, ramVMMShared,
     2459                                              new pm::AggregateMin()));
     2460    aCollector->registerMetric(new pm::Metric(ramUsage, ramVMMShared,
     2461                                              new pm::AggregateMax()));
    24522462}
    24532463
  • trunk/src/VBox/Main/MachineImpl.cpp

    r29568 r29620  
    92219221    pm::SubMetric *guestMemFree = new pm::SubMetric("Guest/RAM/Usage/Free",        "Free amount of physical guest RAM.");
    92229222    pm::SubMetric *guestMemBalloon = new pm::SubMetric("Guest/RAM/Usage/Balloon",  "Amount of ballooned physical guest RAM.");
     9223    pm::SubMetric *guestMemShared = new pm::SubMetric("Guest/RAM/Usage/Shared",  "Amount of shared physical guest RAM.");
    92239224    pm::SubMetric *guestMemCache = new pm::SubMetric("Guest/RAM/Usage/Cache",        "Total amount of guest (disk) cache memory.");
    92249225
     
    92299230    aCollector->registerBaseMetric(guestCpuLoad);
    92309231
    9231     pm::BaseMetric *guestCpuMem = new pm::GuestRamUsage(mGuestHAL, aMachine, guestMemTotal, guestMemFree, guestMemBalloon,
     9232    pm::BaseMetric *guestCpuMem = new pm::GuestRamUsage(mGuestHAL, aMachine, guestMemTotal, guestMemFree, guestMemBalloon, guestMemShared,
    92329233                                                        guestMemCache, guestPagedTotal);
    92339234    aCollector->registerBaseMetric(guestCpuMem);
     
    92629263    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemBalloon, new pm::AggregateMin()));
    92639264    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemBalloon, new pm::AggregateMax()));
     9265
     9266    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemShared, 0));
     9267    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemShared, new pm::AggregateAvg()));
     9268    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemShared, new pm::AggregateMin()));
     9269    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemShared, new pm::AggregateMax()));
    92649270
    92659271    aCollector->registerMetric(new pm::Metric(guestCpuMem, guestMemCache, 0));
  • trunk/src/VBox/Main/Performance.cpp

    r29225 r29620  
    164164        &&  iTick != mLastTick)
    165165    {
    166         ULONG ulMemAllocTotal, ulMemFreeTotal, ulMemBalloonTotal, ulMemSharedTotal, uMemShared;
     166        ULONG ulMemAllocTotal, ulMemFreeTotal, ulMemBalloonTotal, ulMemSharedTotal, ulMemShared;
    167167
    168168        /** todo shared stats. */
    169169        mGuest->InternalGetStatistics(&mCpuUser, &mCpuKernel, &mCpuIdle,
    170                                       &mMemTotal, &mMemFree, &mMemBalloon, &mMemCache, &uMemShared,
     170                                      &mMemTotal, &mMemFree, &mMemBalloon, &ulMemShared, &mMemCache,
    171171                                      &mPageTotal, &ulMemAllocTotal, &ulMemFreeTotal, &ulMemBalloonTotal, &ulMemSharedTotal);
    172172
    173173        if (mHostHAL)
    174             mHostHAL->setMemHypervisorStats(ulMemAllocTotal, ulMemFreeTotal, ulMemBalloonTotal);
     174            mHostHAL->setMemHypervisorStats(ulMemAllocTotal, ulMemFreeTotal, ulMemBalloonTotal, ulMemShared);
    175175
    176176        mLastTick = iTick;
     
    288288    mFreeVMM->init(mLength);
    289289    mBalloonVMM->init(mLength);
     290    mSharedVMM->init(mLength);
    290291}
    291292
     
    306307
    307308    }
    308     ULONG allocVMM, freeVMM, balloonVMM;
    309 
    310     mHAL->getMemHypervisorStats(&allocVMM, &freeVMM, &balloonVMM);
     309    ULONG allocVMM, freeVMM, balloonVMM, sharedVMM;
     310
     311    mHAL->getMemHypervisorStats(&allocVMM, &freeVMM, &balloonVMM, &sharedVMM);
    311312    mAllocVMM->put(allocVMM);
    312313    mFreeVMM->put(freeVMM);
    313314    mBalloonVMM->put(balloonVMM);
     315    mSharedVMM->put(sharedVMM);
    314316}
    315317
     
    419421    mFree->init(mLength);
    420422    mBallooned->init(mLength);
     423    mShared->init(mLength);
    421424    mCache->init(mLength);
    422425    mPagedTotal->init(mLength);
     
    430433void GuestRamUsage::collect()
    431434{
    432     ULONG ulMemTotal = 0, ulMemFree = 0, ulMemBalloon = 0, ulMemCache = 0, ulPageTotal = 0;
    433 
    434     mGuestHAL->getGuestMemLoad(&ulMemTotal, &ulMemFree, &ulMemBalloon, &ulMemCache, &ulPageTotal);
     435    ULONG ulMemTotal = 0, ulMemFree = 0, ulMemBalloon = 0, ulMemShared = 0, ulMemCache = 0, ulPageTotal = 0;
     436
     437    mGuestHAL->getGuestMemLoad(&ulMemTotal, &ulMemFree, &ulMemBalloon, &ulMemShared, &ulMemCache, &ulPageTotal);
    435438    mTotal->put(ulMemTotal);
    436439    mFree->put(ulMemFree);
    437440    mBallooned->put(ulMemBalloon);
     441    mShared->put(ulMemShared);
    438442    mCache->put(ulMemCache);
    439443    mPagedTotal->put(ulPageTotal);
  • trunk/src/VBox/Main/PerformanceImpl.cpp

    r28800 r29620  
    7676    "RAM/VMM/Ballooned:min",
    7777    "RAM/VMM/Ballooned:max",
     78    "RAM/VMM/Shared",
     79    "RAM/VMM/Shared:avg",
     80    "RAM/VMM/Shared:min",
     81    "RAM/VMM/Shared:max",
    7882    "Guest/CPU/Load/User",
    7983    "Guest/CPU/Load/User:avg",
     
    100104    "Guest/RAM/Usage/Balloon:min",
    101105    "Guest/RAM/Usage/Balloon:max",
     106    "Guest/RAM/Usage/Shared",
     107    "Guest/RAM/Usage/Shared:avg",
     108    "Guest/RAM/Usage/Shared:min",
     109    "Guest/RAM/Usage/Shared:max",
    102110    "Guest/RAM/Usage/Cache",
    103111    "Guest/RAM/Usage/Cache:avg",
  • trunk/src/VBox/Main/include/Performance.h

    r28800 r29620  
    159159        virtual int disable();
    160160
    161         virtual int setMemHypervisorStats(ULONG memAlloc, ULONG memFree, ULONG memBallooned)
     161        virtual int setMemHypervisorStats(ULONG memAlloc, ULONG memFree, ULONG memBallooned, ULONG memShared)
    162162        {
    163163            mMemAllocVMM     = memAlloc;
    164164            mMemFreeVMM      = memFree;
    165165            mMemBalloonedVMM = memBallooned;
     166            mMemSharedVMM    = memShared;
    166167            return S_OK;
    167168        }
    168169
    169         virtual void getMemHypervisorStats(ULONG *pMemAlloc, ULONG *pMemFree, ULONG *pMemBallooned)
     170        virtual void getMemHypervisorStats(ULONG *pMemAlloc, ULONG *pMemFree, ULONG *pMemBallooned, ULONG *pMemShared)
    170171        {
    171172            *pMemAlloc     = mMemAllocVMM;
    172173            *pMemFree      = mMemFreeVMM;
    173174            *pMemBallooned = mMemBalloonedVMM;
     175            *pMemShared    = mMemSharedVMM;
    174176        }
    175177
     
    178180        ULONG       mMemFreeVMM;
    179181        ULONG       mMemBalloonedVMM;
     182        ULONG       mMemSharedVMM;
    180183    };
    181184
     
    185188        CollectorGuestHAL(Machine *machine, CollectorHAL *hostHAL) : CollectorHAL(), cEnabled(0), mMachine(machine), mConsole(NULL), mGuest(NULL),
    186189                                              mLastTick(0), mHostHAL(hostHAL), mCpuUser(0), mCpuKernel(0), mCpuIdle(0), mMemTotal(0), mMemFree(0),
    187                                               mMemBalloon(0), mMemCache(0), mPageTotal(0) {};
     190                                              mMemBalloon(0), mMemShared(0), mMemCache(0), mPageTotal(0) {};
    188191        ~CollectorGuestHAL();
    189192
     
    204207
    205208        /** Return guest memory information in KB. */
    206         void getGuestMemLoad(ULONG *pulMemTotal, ULONG *pulMemFree, ULONG *pulMemBalloon, ULONG *pulMemCache, ULONG *pulPageTotal)
     209        void getGuestMemLoad(ULONG *pulMemTotal, ULONG *pulMemFree, ULONG *pulMemBalloon, ULONG *pulMemShared, ULONG *pulMemCache, ULONG *pulPageTotal)
    207210        {
    208211            *pulMemTotal        = mMemTotal;
    209212            *pulMemFree         = mMemFree;
    210213            *pulMemBalloon      = mMemBalloon;
     214            *pulMemShared       = mMemShared;
    211215            *pulMemCache        = mMemCache;
    212216            *pulPageTotal       = mPageTotal;
     
    229233        ULONG                mMemFree;
    230234        ULONG                mMemBalloon;
     235        ULONG                mMemShared;
    231236        ULONG                mMemCache;
    232237        ULONG                mPageTotal;
     
    337342    {
    338343    public:
    339         HostRamUsage(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *total, SubMetric *used, SubMetric *available, SubMetric *allocVMM, SubMetric *freeVMM, SubMetric *balloonVMM)
    340         : BaseMetric(hal, "RAM/Usage", object), mTotal(total), mUsed(used), mAvailable(available), mAllocVMM(allocVMM), mFreeVMM(freeVMM), mBalloonVMM(balloonVMM) {};
    341         ~HostRamUsage() { delete mTotal; delete mUsed; delete mAvailable; delete mAllocVMM; delete mFreeVMM; delete mBalloonVMM; };
     344        HostRamUsage(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *total, SubMetric *used, SubMetric *available, SubMetric *allocVMM, SubMetric *freeVMM, SubMetric *balloonVMM, SubMetric *sharedVMM)
     345        : BaseMetric(hal, "RAM/Usage", object), mTotal(total), mUsed(used), mAvailable(available), mAllocVMM(allocVMM), mFreeVMM(freeVMM), mBalloonVMM(balloonVMM), mSharedVMM(sharedVMM) {};
     346        ~HostRamUsage() { delete mTotal; delete mUsed; delete mAvailable; delete mAllocVMM; delete mFreeVMM; delete mBalloonVMM; delete mSharedVMM; };
    342347
    343348        void init(ULONG period, ULONG length);
     
    355360        SubMetric *mFreeVMM;
    356361        SubMetric *mBalloonVMM;
     362        SubMetric *mSharedVMM;
    357363    };
    358364
     
    434440    {
    435441    public:
    436         GuestRamUsage(CollectorGuestHAL *hal, ComPtr<IUnknown> object, SubMetric *total, SubMetric *free, SubMetric *balloon, SubMetric *cache, SubMetric *pagedtotal)
    437         : BaseMetric(hal, "RAM/Usage", object), mTotal(total), mFree(free), mBallooned(balloon), mCache(cache), mPagedTotal(pagedtotal), mGuestHAL(hal) {};
    438         ~GuestRamUsage() { delete mTotal; delete mFree; delete mBallooned; delete mCache; delete mPagedTotal; };
     442        GuestRamUsage(CollectorGuestHAL *hal, ComPtr<IUnknown> object, SubMetric *total, SubMetric *free, SubMetric *balloon, SubMetric *shared, SubMetric *cache, SubMetric *pagedtotal)
     443        : BaseMetric(hal, "RAM/Usage", object), mTotal(total), mFree(free), mBallooned(balloon), mShared(shared), mCache(cache), mPagedTotal(pagedtotal), mGuestHAL(hal) {};
     444        ~GuestRamUsage() { delete mTotal; delete mFree; delete mBallooned; delete mShared; delete mCache; delete mPagedTotal; };
    439445
    440446        void init(ULONG period, ULONG length);
     
    446452        ULONG getScale() { return 1; }
    447453    private:
    448         SubMetric *mTotal, *mFree, *mBallooned, *mCache, *mPagedTotal;
     454        SubMetric *mTotal, *mFree, *mBallooned, *mCache, *mPagedTotal, *mShared;
    449455        CollectorGuestHAL *mGuestHAL;
    450456    };
  • trunk/src/VBox/VMM/GMM.cpp

    r29613 r29620  
    290290 * @see GMMR0QueryVMMMemoryStatsReq
    291291 */
    292 GMMR3DECL(int)  GMMR3QueryHypervisorMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages)
     292GMMR3DECL(int)  GMMR3QueryHypervisorMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages, uint64_t *puTotalBalloonSize)
    293293{
    294294    GMMMEMSTATSREQ Req;
     
    298298    Req.cFreePages       = 0;
    299299    Req.cBalloonedPages  = 0;
     300    Req.cSharedPages     = 0;
    300301
    301302    *pcTotalAllocPages   = 0;
    302303    *pcTotalFreePages    = 0;
    303304    *pcTotalBalloonPages = 0;
     305    *puTotalBalloonSize  = 0;
    304306
    305307    /* Must be callable from any thread, so can't use VMMR3CallR0. */
     
    310312        *pcTotalFreePages    = Req.cFreePages;
    311313        *pcTotalBalloonPages = Req.cBalloonedPages;
     314        *puTotalBalloonSize  = Req.cSharedPages;
    312315    }
    313316    return rc;
  • trunk/src/VBox/VMM/PGMPhys.cpp

    r29577 r29620  
    967967 * @param   puTotalFreeSize     Pointer to total free (allocated but not used yet) memory inside VMMR0 (in bytes)
    968968 * @param   puTotalBalloonSize  Pointer to total ballooned memory inside VMMR0 (in bytes)
    969  */
    970 VMMR3DECL(int) PGMR3QueryVMMMemoryStats(PVM pVM, uint64_t *puTotalAllocSize, uint64_t *puTotalFreeSize, uint64_t *puTotalBalloonSize)
     969 * @param   puTotalSharedSize   Pointer to total shared memory inside VMMR0 (in bytes)
     970 */
     971VMMR3DECL(int) PGMR3QueryVMMMemoryStats(PVM pVM, uint64_t *puTotalAllocSize, uint64_t *puTotalFreeSize, uint64_t *puTotalBalloonSize, uint64_t *puTotalSharedSize)
    971972{
    972973    int rc;
    973974
    974     uint64_t cAllocPages = 0, cFreePages = 0, cBalloonPages = 0;
    975     rc = GMMR3QueryHypervisorMemoryStats(pVM, &cAllocPages, &cFreePages, &cBalloonPages);
     975    uint64_t cAllocPages = 0, cFreePages = 0, cBalloonPages = 0, cSharedPages = 0;
     976    rc = GMMR3QueryHypervisorMemoryStats(pVM, &cAllocPages, &cFreePages, &cBalloonPages, &cSharedPages);
    976977    AssertRCReturn(rc, rc);
    977978
     
    984985    if (puTotalBalloonSize)
    985986        *puTotalBalloonSize = cBalloonPages * _4K;
     987
     988    if (puTotalSharedSize)
     989        *puTotalSharedSize = cSharedPages * _4K;
     990
     991    return VINF_SUCCESS;
     992}
     993
     994/**
     995 * Query memory stats for the VM
     996 *
     997 * @returns VBox status code.
     998 * @param   pVM                 The VM handle.
     999 * @param   puTotalAllocSize    Pointer to total allocated  memory inside the VM (in bytes)
     1000 * @param   puTotalFreeSize     Pointer to total free (allocated but not used yet) memory inside the VM (in bytes)
     1001 * @param   puTotalBalloonSize  Pointer to total ballooned memory inside the VM (in bytes)
     1002 * @param   puTotalSharedSize   Pointer to total shared memory inside the VM (in bytes)
     1003 */
     1004VMMR3DECL(int) PGMR3QueryMemoryStats(PVM pVM, uint64_t *pulTotalMem, uint64_t *pulPrivateMem, uint64_t *puTotalSharedMem, uint64_t *puTotalZeroMem)
     1005{
     1006    if (pulTotalMem)
     1007        *pulTotalMem = pVM->pgm.s.cAllPages * _4K;
     1008
     1009    if (pulPrivateMem)
     1010        *pulPrivateMem = pVM->pgm.s.cPrivatePages * _4K;
     1011
     1012    if (puTotalSharedMem)
     1013        *puTotalSharedMem = pVM->pgm.s.cReusedSharedPages * _4K;
     1014
     1015    if (puTotalZeroMem)
     1016        *puTotalZeroMem = pVM->pgm.s.cZeroPages * _4K;
    9861017
    9871018    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMR0/GMMR0.cpp

    r29613 r29620  
    505505    /** The number of pages that are shared. A subset of cAllocatedPages. */
    506506    uint64_t            cSharedPages;
     507    /** The number of pages that are actually shared between VMs. */
     508    uint64_t            cDuplicatePages;
    507509    /** The number of pages that are shared that has been left behind by
    508510     * VMs not doing proper cleanups. */
     
    852854            pGMM->cAllocatedPages = 0;
    853855            pGMM->cSharedPages = 0;
     856            pGMM->cDuplicatePages = 0;
    854857            pGMM->cLeftBehindSharedPages = 0;
    855858            pGMM->cChunks = 0;
     
    21272130                            pGVM->gmm.s.Allocated.cBasePages--;
    21282131                            if (!--pPage->Shared.cRefs)
     2132                            {
    21292133                                gmmR0FreeSharedPage(pGMM, paPages[iPage].idSharedPage, pPage);
     2134                            }
     2135                            else
     2136                            {
     2137                                Assert(pGMM->cDuplicatePages);
     2138                                pGMM->cDuplicatePages--;
     2139                            }
    21302140
    21312141                            paPages[iPage].idSharedPage = NIL_GMM_PAGEID;
     
    26672677    Assert(pGMM->cSharedPages > 0);
    26682678    Assert(pGMM->cAllocatedPages > 0);
     2679
     2680    pGMM->cDuplicatePages++;
    26692681
    26702682    pPage->Shared.cRefs++;
     
    30783090    pReq->cBalloonedPages = pGMM->cBalloonedPages;
    30793091    pReq->cMaxPages       = pGMM->cMaxPages;
     3092    pReq->cSharedPages    = pGMM->cDuplicatePages;
    30803093    GMM_CHECK_SANITY_UPON_LEAVING(pGMM);
    30813094
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