VirtualBox

Changeset 19488 in vbox for trunk


Ignore:
Timestamp:
May 7, 2009 1:54:51 PM (16 years ago)
Author:
vboxsync
Message:

Made pgmPoolSyncCR3 a bit more SMP safe (pgmPoolClearAll still to be done).

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

Legend:

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

    r19330 r19488  
    29392939int             pgmPoolMonitorChainFlush(PPGMPOOL pPool, PPGMPOOLPAGE pPage);
    29402940void            pgmPoolMonitorModifiedInsert(PPGMPOOL pPool, PPGMPOOLPAGE pPage);
    2941 void            pgmPoolMonitorModifiedClearAll(PVM pVM);
    29422941#endif
    29432942
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r19330 r19488  
    19141914void pgmPoolMonitorModifiedClearAll(PVM pVM)
    19151915{
     1916    pgmLock(pVM);
    19161917    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    19171918    LogFlow(("pgmPoolMonitorModifiedClearAll: cModifiedPages=%d\n", pPool->cModifiedPages));
     
    19311932    AssertMsg(cPages == pPool->cModifiedPages, ("%d != %d\n", cPages, pPool->cModifiedPages));
    19321933    pPool->cModifiedPages = 0;
     1934    pgmUnlock(pVM);
    19331935}
    19341936
     
    20782080     * sometimes refered to as a 'lightweight flush'.
    20792081     */
    2080     if (!(pVM->pgm.s.fGlobalSyncFlags & PGM_GLOBAL_SYNC_CLEAR_PGM_POOL))
    2081         pgmPoolMonitorModifiedClearAll(pVM);
    2082     else
    2083     {
    20842082# ifdef IN_RING3 /* Don't flush in ring-0 or raw mode, it's taking too long. */
     2083    if (ASMBitTestAndClear(&pVM->pgm.s.fGlobalSyncFlags, PGM_GLOBAL_SYNC_CLEAR_PGM_POOL))
     2084    {
    20852085        /** @todo SMP support! */
    20862086        Assert(pVM->cCPUs == 1);
    2087         pVM->pgm.s.fGlobalSyncFlags &= ~PGM_GLOBAL_SYNC_CLEAR_PGM_POOL;
    20882087        pgmPoolClearAll(pVM);
    20892088# else  /* !IN_RING3 */
     2089    if (pVM->pgm.s.fGlobalSyncFlags & PGM_GLOBAL_SYNC_CLEAR_PGM_POOL)
     2090    {
    20902091        LogFlow(("SyncCR3: PGM_GLOBAL_SYNC_CLEAR_PGM_POOL is set -> VINF_PGM_SYNC_CR3\n"));
    20912092        VMCPU_FF_SET(VMMGetCpu(pVM), VMCPU_FF_PGM_SYNC_CR3); /** @todo no need to do global sync, right? */
     
    20932094# endif /* !IN_RING3 */
    20942095    }
     2096    else
     2097        pgmPoolMonitorModifiedClearAll(pVM);
     2098
    20952099    return VINF_SUCCESS;
    20962100}
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