VirtualBox

Changeset 17462 in vbox


Ignore:
Timestamp:
Mar 6, 2009 1:00:54 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
43886
Message:

Refined locking.

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

Legend:

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

    r17461 r17462  
    184184#define PGM_PTFLAGS_CSAM_VALIDATED      RT_BIT_64(11)
    185185#endif
    186 
    187 /** Mark a dynamic map entry (PGMDynMapHCPage) as locked. */
    188 #define PGM_PTFLAGS_DYN_LOCKED          RT_BIT(9)
    189186
    190187/** @} */
     
    26332630     * The cache size is covering half of the mapping area. */
    26342631    RTHCPHYS                        aHCPhysDynPageMapCache[MM_HYPER_DYNAMIC_SIZE >> (PAGE_SHIFT + 1)];
     2632    uint32_t                        aLockedDynPageMapCache[MM_HYPER_DYNAMIC_SIZE >> (PAGE_SHIFT + 1)];
    26352633
    26362634    /** The address of the ring-0 mapping cache if we're making use of it.  */
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r17433 r17462  
    22742274    {
    22752275        pVM->pgm.s.iDynPageMapLast = iPage = (iPage + 1) & ((MM_HYPER_DYNAMIC_SIZE >> PAGE_SHIFT) - 1);
    2276         if (!(pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u & PGM_PTFLAGS_DYN_LOCKED))
     2276        if (!pVM->pgm.s.aLockedDynPageMapCache[iPage])
    22772277            break;
    22782278        iPage++;
     
    22862286    pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u = (uint32_t)HCPhys | X86_PTE_P | X86_PTE_A | X86_PTE_D;
    22872287    pVM->pgm.s.paDynPageMapPaePTEsGC[iPage].u   =           HCPhys | X86_PTE_P | X86_PTE_A | X86_PTE_D;
     2288    pVM->pgm.s.aLockedDynPageMapCache[iPage]    = 0;
    22882289
    22892290    void *pv = pVM->pgm.s.pbDynPageMapBaseGC + (iPage << PAGE_SHIFT);
     
    23082309    Assert(GCPage >= pVM->pgm.s.pbDynPageMapBaseGC && GCPage < (pVM->pgm.s.pbDynPageMapBaseGC + MM_HYPER_DYNAMIC_SIZE));
    23092310    iPage = ((uintptr_t)(GCPage - pVM->pgm.s.pbDynPageMapBaseGC)) >> PAGE_SHIFT;
    2310     Assert(!(pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u & PGM_PTFLAGS_DYN_LOCKED));
    2311     pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u |= PGM_PTFLAGS_DYN_LOCKED;
     2311    Assert(!pVM->pgm.s.aLockedDynPageMapCache[iPage]);
     2312    ASMAtomicIncU32(&pVM->pgm.s.aLockedDynPageMapCache[iPage]);
    23122313    return VINF_SUCCESS;
    23132314}
     
    23252326    unsigned iPage;
    23262327
     2328    AssertCompile(RT_ELEMENTS(pVM->pgm.s.aHCPhysDynPageMapCache) == RT_ELEMENTS(pVM->pgm.s.aLockedDynPageMapCache));
     2329
    23272330    Assert(GCPage >= pVM->pgm.s.pbDynPageMapBaseGC && GCPage < (pVM->pgm.s.pbDynPageMapBaseGC + MM_HYPER_DYNAMIC_SIZE));
    23282331    iPage = ((uintptr_t)(GCPage - pVM->pgm.s.pbDynPageMapBaseGC)) >> PAGE_SHIFT;
    2329     Assert(pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u & PGM_PTFLAGS_DYN_LOCKED);
    2330     pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u &= ~PGM_PTFLAGS_DYN_LOCKED;
     2332    Assert(pVM->pgm.s.aLockedDynPageMapCache[iPage]);
     2333    ASMAtomicDecU32(&pVM->pgm.s.aLockedDynPageMapCache[iPage]);
    23312334    return VINF_SUCCESS;
    23322335}
     
    23412344VMMDECL(void) PGMDynCheckLocks(PVM pVM)
    23422345{
    2343     for (unsigned i=0;i<(MM_HYPER_DYNAMIC_SIZE >> PAGE_SHIFT);i++)
    2344         Assert(!(pVM->pgm.s.paDynPageMap32BitPTEsGC[i].u & PGM_PTFLAGS_DYN_LOCKED));
     2346    for (unsigned i=0;i<RT_ELEMENTS(pVM->pgm.s.aLockedDynPageMapCache);i++)
     2347        Assert(!pVM->pgm.s.aLockedDynPageMapCache[i]);
    23452348}
    23462349#  endif /* VBOX_STRICT */
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