VirtualBox

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


Ignore:
Timestamp:
Sep 28, 2009 12:31:50 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
52890
Message:

Wait for the target VCPU to finish its world switch.

File:
1 edited

Legend:

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

    r23201 r23366  
    5959    VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH);
    6060#else
     61    Be very careful when activating this code!
    6162    if (iPage == RT_ELEMENTS(pVCpu->hwaccm.s.TlbShootdown.aPages))
    6263        VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH);
     
    118119 *
    119120 */
    120 void hwaccmMpPokeCpu(RTCPUID idHostCpu)
    121 {
     121void hwaccmMpPokeCpu(PVMCPU pVCpu, RTCPUID idHostCpu)
     122{
     123    uint32_t cWorldSwitchExit = pVCpu->hwaccm.s.cWorldSwitchExit;
     124
    122125    int rc = RTMpPokeCpu(idHostCpu);
    123 # ifndef RT_OS_WINDOWS
    124126    /* Not implemented on some platforms (Darwin, Linux kernel < 2.6.19); fall back to a less efficient implementation (broadcast). */
    125127    if (rc == VERR_NOT_SUPPORTED)
     128    {
     129        /* synchronous. */
    126130        RTMpOnSpecific(idHostCpu, hwaccmFlushHandler, 0, 0);
    127 # endif
     131    }
     132    else
     133    {
     134        if (rc == VINF_SUCCESS)
     135            STAM_PROFILE_ADV_START(&pVCpu->hwaccm.s.StatSpinPoke, z);
     136        else
     137            STAM_PROFILE_ADV_START(&pVCpu->hwaccm.s.StatSpinPokeFailed, z);
     138           
     139        /* Spin until the VCPU has switched back. */
     140        while (     VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC
     141               &&   pVCpu->hwaccm.s.fCheckedTLBFlush
     142               &&   cWorldSwitchExit == pVCpu->hwaccm.s.cWorldSwitchExit)
     143        {
     144            ASMNopPause();
     145        }
     146        if (rc == VINF_SUCCESS)
     147            STAM_PROFILE_ADV_STOP(&pVCpu->hwaccm.s.StatSpinPoke, z);
     148        else
     149            STAM_PROFILE_ADV_STOP(&pVCpu->hwaccm.s.StatSpinPokeFailed, z);
     150    }
    128151}
    129152#endif
     
    152175        {
    153176            hwaccmQueueInvlPage(pVCpu, GCPtr);
    154             if (VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC)
     177            if (    VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC
     178                &&  pVCpu->hwaccm.s.fCheckedTLBFlush)
    155179            {
    156180                STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatTlbShootdown);
     
    158182                RTCPUID idHostCpu = pVCpu->hwaccm.s.idEnteredCpu;
    159183                if (idHostCpu != NIL_RTCPUID)
    160                     hwaccmMpPokeCpu(idHostCpu);
     184                    hwaccmMpPokeCpu(pVCpu, idHostCpu);
    161185#else
    162186                VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_POKE);
     
    197221            continue;
    198222
    199         if (VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC)
     223        if (    VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC
     224            &&  pVCpu->hwaccm.s.fCheckedTLBFlush)
    200225        {
    201226            STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatTlbShootdownFlush);
     
    203228            RTCPUID idHostCpu = pVCpu->hwaccm.s.idEnteredCpu;
    204229            if (idHostCpu != NIL_RTCPUID)
    205                 hwaccmMpPokeCpu(idHostCpu);
     230                hwaccmMpPokeCpu(pVCpu, idHostCpu);
    206231#else
    207232            VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_POKE);
     
    272297
    273298            VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH);
    274             if (VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC)
     299            if (    VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC
     300                &&  pVCpu->hwaccm.s.fCheckedTLBFlush)
    275301            {
    276302                STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatTlbShootdownFlush);
     
    278304                RTCPUID idHostCpu = pVCpu->hwaccm.s.idEnteredCpu;
    279305                if (idHostCpu != NIL_RTCPUID)
    280                     hwaccmMpPokeCpu(idHostCpu);
     306                    hwaccmMpPokeCpu(pVCpu, idHostCpu);
    281307# else
    282308                VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_POKE);
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