Changeset 37062 in vbox for trunk/src/VBox/HostDrivers/Support
- Timestamp:
- May 13, 2011 10:18:29 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 71699
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r36730 r37062 322 322 { "RTMpIsCpuOnline", (void *)RTMpIsCpuOnline }, 323 323 { "RTMpIsCpuWorkPending", (void *)RTMpIsCpuWorkPending }, 324 { "RTMpNotificationRegister", (void *)RTMpNotificationRegister }, 325 { "RTMpNotificationDeregister", (void *)RTMpNotificationDeregister }, 324 326 { "RTMpOnAll", (void *)RTMpOnAll }, 325 327 { "RTMpOnOthers", (void *)RTMpOnOthers }, … … 4990 4992 4991 4993 /** 4994 * Helper for finding the CPU index from the CPU Id. 4995 * 4996 * @param pGip The GIP. 4997 * @param idCpu The CPU ID. 4998 * 4999 * @returns Index of the CPU in the cache set. 5000 */ 5001 static inline uint32_t supdrvGipCpuIndexFromCpuId(PSUPGLOBALINFOPAGE pGip, RTCPUID idCpu) 5002 { 5003 uint32_t i = 0; 5004 5005 /* 5006 * Find our entry, or allocate one if not found. 5007 * ASSUMES that CPU IDs are constant. 5008 */ 5009 for (i = 0; i < pGip->cCpus; i++) 5010 if (pGip->aCPUs[i].idCpu == idCpu) 5011 break; 5012 5013 if (i >= pGip->cCpus) 5014 for (i = 0; i < pGip->cCpus; i++) 5015 { 5016 bool fRc; 5017 ASMAtomicCmpXchgSize(&pGip->aCPUs[i].idCpu, idCpu, NIL_RTCPUID, fRc); 5018 if (fRc) 5019 break; 5020 } 5021 5022 AssertRelease(i < pGip->cCpus); 5023 return i; 5024 } 5025 5026 5027 /** 4992 5028 * The calling CPU should be accounted as online, update GIP accordingly. 4993 5029 * … … 4999 5035 static void supdrvGipMpEventOnline(PSUPGLOBALINFOPAGE pGip, RTCPUID idCpu) 5000 5036 { 5001 int iCpuSet ;5002 uint 8_t idApic;5003 uint32_t i ;5004 5005 Assert (idCpu == RTMpCpuId());5037 int iCpuSet = 0; 5038 uint16_t idApic = UINT16_MAX; 5039 uint32_t i = 0; 5040 5041 AssertRelease(idCpu == RTMpCpuId()); 5006 5042 Assert(pGip->cPossibleCpus == RTMpGetCount()); 5007 5043 … … 5019 5055 } 5020 5056 5021 /* 5022 * Find our entry, or allocate one if not found. 5023 * ASSUMES that CPU IDs are constant. 5024 */ 5025 for (i = 0; i < pGip->cCpus; i++) 5026 if (pGip->aCPUs[i].idCpu == idCpu) 5027 break; 5028 5029 if (i >= pGip->cCpus) 5030 for (i = 0; i < pGip->cCpus; i++) 5031 { 5032 bool fRc; 5033 ASMAtomicCmpXchgSize(&pGip->aCPUs[i].idCpu, idCpu, NIL_RTCPUID, fRc); 5034 if (fRc) 5035 break; 5036 } 5037 5038 AssertReturnVoid(i < pGip->cCpus); 5057 i = supdrvGipCpuIndexFromCpuId(pGip, idCpu); 5039 5058 5040 5059 /* … … 5045 5064 ASMAtomicUoWriteS16(&pGip->aCPUs[i].iCpuSet, (int16_t)iCpuSet); 5046 5065 ASMAtomicUoWriteSize(&pGip->aCPUs[i].idCpu, idCpu); 5047 ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_ONLINE);5048 5066 5049 5067 /* … … 5052 5070 ASMAtomicWriteU16(&pGip->aiCpuFromApicId[idApic], i); 5053 5071 ASMAtomicWriteU16(&pGip->aiCpuFromCpuSetIdx[iCpuSet], i); 5072 5073 ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_ONLINE); 5054 5074 } 5055 5075 … … 5076 5096 5077 5097 Assert(RTCpuSetIsMemberByIndex(&pGip->PossibleCpuSet, iCpuSet)); 5098 RTCpuSetDelByIndex(&pGip->OnlineCpuSet, iCpuSet); 5078 5099 ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_OFFLINE); 5079 RTCpuSetDelByIndex(&pGip->OnlineCpuSet, iCpuSet);5080 5100 } 5081 5101 … … 5095 5115 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser; 5096 5116 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip; 5117 5118 AssertRelease(!RTThreadPreemptIsEnabled(NIL_RTTHREAD)); 5097 5119 5098 5120 /* … … 5359 5381 pGip->aCPUs[i].idCpu = NIL_RTCPUID; 5360 5382 pGip->aCPUs[i].iCpuSet = -1; 5361 pGip->aCPUs[i].idApic = UINT 8_MAX;5383 pGip->aCPUs[i].idApic = UINT16_MAX; 5362 5384 5363 5385 /* … … 5618 5640 RTCPUID idCpu, uint8_t idApic, uint64_t iTick) 5619 5641 { 5642 /* 5643 * Avoid a potential race when a CPU online notification doesn't fire on the onlined CPU 5644 * but the tick creeps in before the event notification is run. 5645 */ 5646 if (iTick == 1) 5647 { 5648 uint32_t i = supdrvGipCpuIndexFromCpuId(pGip, idCpu); 5649 if (pGip->aCPUs[i].enmState == SUPGIPCPUSTATE_OFFLINE) 5650 supdrvGipMpEventOnline(pGip, idCpu); 5651 } 5652 5620 5653 unsigned iCpu = pGip->aiCpuFromApicId[idApic]; 5621 5654
Note:
See TracChangeset
for help on using the changeset viewer.