Changeset 23366 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Sep 28, 2009 12:31:50 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 52890
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/HWACCMAll.cpp
r23201 r23366 59 59 VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH); 60 60 #else 61 Be very careful when activating this code! 61 62 if (iPage == RT_ELEMENTS(pVCpu->hwaccm.s.TlbShootdown.aPages)) 62 63 VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH); … … 118 119 * 119 120 */ 120 void hwaccmMpPokeCpu(RTCPUID idHostCpu) 121 { 121 void hwaccmMpPokeCpu(PVMCPU pVCpu, RTCPUID idHostCpu) 122 { 123 uint32_t cWorldSwitchExit = pVCpu->hwaccm.s.cWorldSwitchExit; 124 122 125 int rc = RTMpPokeCpu(idHostCpu); 123 # ifndef RT_OS_WINDOWS124 126 /* Not implemented on some platforms (Darwin, Linux kernel < 2.6.19); fall back to a less efficient implementation (broadcast). */ 125 127 if (rc == VERR_NOT_SUPPORTED) 128 { 129 /* synchronous. */ 126 130 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 } 128 151 } 129 152 #endif … … 152 175 { 153 176 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) 155 179 { 156 180 STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatTlbShootdown); … … 158 182 RTCPUID idHostCpu = pVCpu->hwaccm.s.idEnteredCpu; 159 183 if (idHostCpu != NIL_RTCPUID) 160 hwaccmMpPokeCpu( idHostCpu);184 hwaccmMpPokeCpu(pVCpu, idHostCpu); 161 185 #else 162 186 VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_POKE); … … 197 221 continue; 198 222 199 if (VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC) 223 if ( VMCPU_GET_STATE(pVCpu) == VMCPUSTATE_STARTED_EXEC 224 && pVCpu->hwaccm.s.fCheckedTLBFlush) 200 225 { 201 226 STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatTlbShootdownFlush); … … 203 228 RTCPUID idHostCpu = pVCpu->hwaccm.s.idEnteredCpu; 204 229 if (idHostCpu != NIL_RTCPUID) 205 hwaccmMpPokeCpu( idHostCpu);230 hwaccmMpPokeCpu(pVCpu, idHostCpu); 206 231 #else 207 232 VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_POKE); … … 272 297 273 298 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) 275 301 { 276 302 STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatTlbShootdownFlush); … … 278 304 RTCPUID idHostCpu = pVCpu->hwaccm.s.idEnteredCpu; 279 305 if (idHostCpu != NIL_RTCPUID) 280 hwaccmMpPokeCpu( idHostCpu);306 hwaccmMpPokeCpu(pVCpu, idHostCpu); 281 307 # else 282 308 VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_POKE);
Note:
See TracChangeset
for help on using the changeset viewer.