VirtualBox

Changeset 19903 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
May 22, 2009 9:41:32 AM (16 years ago)
Author:
vboxsync
Message:

Invalidation cleanup

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HWACCMAll.cpp

    r19848 r19903  
    7575    LogFlow(("HWACCMFlushTLB\n"));
    7676
    77     pVCpu->hwaccm.s.fForceTLBFlush = true;
     77    VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH);
    7878    STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatFlushTLBManual);
    7979    return VINF_SUCCESS;
     
    8282#ifndef IN_RC
    8383/**
     84 * Invalidates a guest page on all VCPUs.
     85 *
     86 * @returns VBox status code.
     87 * @param   pVM         The VM to operate on.
     88 * @param   GCVirt      Page to invalidate
     89 */
     90VMMDECL(int) HWACCMInvalidatePageOnAllVCpus(PVM pVM, RTGCPTR GCPtr)
     91{
     92    /* @todo */
     93    HWACCMInvalidatePage(VMMGetCpu(pVM), GCPtr);
     94    return VINF_SUCCESS;
     95}
     96
     97/**
    8498 * Flush the TLBs of all VCPUs
    8599 *
     
    87101 * @param   pVM       The VM to operate on.
    88102 */
    89 VMMDECL(int) HWACCMFlushAllTLBs(PVM pVM)
     103VMMDECL(int) HWACCMFlushTLBOnAllVCpus(PVM pVM)
    90104{
    91105    if (pVM->cCPUs == 1)
     
    153167 *
    154168 * @returns VBox status code.
    155  * @param   pVCpu       The VMCPU to operate on.
     169 * @param   pVM         The VM to operate on.
    156170 * @param   GCPhys      Page to invalidate
    157171 */
    158 VMMDECL(int) HWACCMInvalidatePhysPage(PVMCPU pVCpu, RTGCPHYS GCPhys)
    159 {
    160     PVM pVM = pVCpu->CTX_SUFF(pVM);
    161 
     172VMMDECL(int) HWACCMInvalidatePhysPage(PVM pVM, RTGCPHYS GCPhys)
     173{
    162174    if (!HWACCMIsNestedPagingActive(pVM))
    163175        return VINF_SUCCESS;
    164176
     177    PVMCPU pVCpu = VMMGetCpu(pVM);
    165178#ifdef IN_RING0
    166179    if (pVM->hwaccm.s.vmx.fSupported)
     180    {
     181        /* @todo for all vcpus */
    167182        return VMXR0InvalidatePhysPage(pVM, pVCpu, GCPhys);
     183    }
    168184
    169185    Assert(pVM->hwaccm.s.svm.fSupported);
    170     SVMR0InvalidatePhysPage(pVM, pVCpu, GCPhys);
     186    HWACCMFlushTLBOnAllVCpus(pVM);
    171187#else
    172     HWACCMFlushTLB(pVCpu);
     188    HWACCMFlushTLBOnAllVCpus(pVM);
    173189#endif
    174190    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp

    r19833 r19903  
    169169        pVM->pgm.s.fPhysCacheFlushPending = true;
    170170        pgmUnlock(pVM);
    171         HWACCMFlushAllTLBs(pVM);
     171        HWACCMFlushTLBOnAllVCpus(pVM);
    172172#ifndef IN_RING3
    173173        REMNotifyHandlerPhysicalRegister(pVM, enmType, GCPhys, GCPhysLast - GCPhys + 1, !!pfnHandlerR3);
     
    271271        pgmHandlerPhysicalDeregisterNotifyREM(pVM, pCur);
    272272        pgmUnlock(pVM);
    273         HWACCMFlushAllTLBs(pVM);
     273        HWACCMFlushTLBOnAllVCpus(pVM);
    274274        MMHyperFree(pVM, pCur);
    275275        return VINF_SUCCESS;
     
    417417        PGM_INVL_VCPU_TLBS(VMMGetCpu0(pVM));
    418418# else
    419     HWACCMFlushAllTLBs(pVM);
     419    HWACCMFlushTLBOnAllVCpus(pVM);
    420420# endif
    421421    pVM->pgm.s.fPhysCacheFlushPending = true;
     
    553553#endif
    554554                    pgmUnlock(pVM);
    555                     HWACCMFlushAllTLBs(pVM);
     555                    HWACCMFlushTLBOnAllVCpus(pVM);
    556556                    Log(("PGMHandlerPhysicalModify: GCPhysCurrent=%RGp -> GCPhys=%RGp GCPhysLast=%RGp\n",
    557557                         GCPhysCurrent, GCPhys, GCPhysLast));
     
    848848                    rc = pgmHandlerPhysicalSetRamFlagsAndFlushShadowPTs(pVM, pCur, pRam);
    849849                    pVM->pgm.s.fPhysCacheFlushPending = true;
    850                     HWACCMFlushAllTLBs(pVM);
     850                    HWACCMFlushTLBOnAllVCpus(pVM);
    851851                }
    852852
     
    920920            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
    921921#ifndef IN_RC
    922             HWACCMInvalidatePhysPage(VMMGetCpu(pVM), GCPhysPage);
     922            HWACCMInvalidatePhysPage(pVM, GCPhysPage);
    923923#endif
    924924            return VINF_SUCCESS;
     
    10371037
    10381038#ifndef IN_RC
    1039             HWACCMInvalidatePhysPage(VMMGetCpu(pVM), GCPhysPage);
     1039            HWACCMInvalidatePhysPage(pVM, GCPhysPage);
    10401040#endif
    10411041            return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r19872 r19903  
    12971297     */
    12981298    int rc = pgmPoolFlushPage(pPool, pPage);
     1299    /* This flush was initiated by us and not the guest, so explicitly flush the TLB. */
    12991300    if (rc == VINF_SUCCESS)
    1300         PGM_INVL_VCPU_TLBS(VMMGetCpu(pVM)); /* see PT handler. */
     1301        PGM_INVL_ALL_VCPU_TLBS(pVM);
    13011302    return rc;
    13021303}
     
    39633964static int pgmPoolMakeMoreFreePages(PPGMPOOL pPool, PGMPOOLKIND enmKind, uint16_t iUser)
    39643965{
     3966    PVM pVM = pPool->CTX_SUFF(pVM);
     3967
    39653968    LogFlow(("pgmPoolMakeMoreFreePages: iUser=%#x\n", iUser));
    39663969
     
    39783981        STAM_PROFILE_ADV_SUSPEND(&pPool->StatAlloc, a);
    39793982#ifdef IN_RING3
    3980         int rc = PGMR3PoolGrow(pPool->pVMR3);
     3983        int rc = PGMR3PoolGrow(pVM);
    39813984#else
    3982         int rc = CTXALLMID(VMM, CallHost)(pPool->CTX_SUFF(pVM), VMMCALLHOST_PGM_POOL_GROW, 0);
     3985        int rc = CTXALLMID(VMM, CallHost)(pVM, VMMCALLHOST_PGM_POOL_GROW, 0);
    39833986#endif
    39843987        if (RT_FAILURE(rc))
  • trunk/src/VBox/VMM/VMMAll/PGMAllShw.h

    r19874 r19903  
    363363                Assert(pPT->a[iPTE].n.u1Present);
    364364# if PGM_SHW_TYPE == PGM_TYPE_EPT
    365                 HWACCMInvalidatePhysPage(pVCpu, (RTGCPHYS)GCPtr);
     365                HWACCMInvalidatePhysPage(pVM, (RTGCPHYS)GCPtr);
    366366# else
    367                 PGM_INVL_PG(pVCpu, GCPtr);
     367                PGM_INVL_ALL_VCPU_PG(pVM, GCPtr);
    368368# endif
    369369            }
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