LW_API ULONG API_CpuDown (ULONG ulCPUId) { INTREG iregInterLevel; PLW_CLASS_CPU pcpu; if ((ulCPUId == 0) || (ulCPUId >= LW_NCPUS)) { _ErrorHandle(EINVAL); return (EINVAL); } __KERNEL_ENTER(); pcpu = LW_CPU_GET(ulCPUId); if (!LW_CPU_IS_ACTIVE(pcpu) || (LW_CPU_GET_IPI_PEND2(pcpu) & LW_IPI_DOWN_MSK)) { __KERNEL_EXIT(); return (ERROR_NONE); } LW_SPIN_LOCK_QUICK(&pcpu->CPU_slIpi, &iregInterLevel); LW_CPU_ADD_IPI_PEND2(pcpu, LW_IPI_DOWN_MSK); LW_SPIN_UNLOCK_QUICK(&pcpu->CPU_slIpi, iregInterLevel); _ThreadOffAffinity(pcpu); /* 关闭与此 CPU 有关的亲和度 */ __KERNEL_EXIT(); _SmpSendIpi(ulCPUId, LW_IPI_DOWN, 0, LW_FALSE); /* 使用核间中断通知 CPU 停止 */ return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: _SmpSendIpiAllOther ** 功能描述: 发送一个除自定义以外的核间中断给所有其他 CPU 关中断情况下被调用, 如果需要等待, 则必须保证其他 CPU 已经运行. ** 输 入 : ulIPIVec 核间中断类型 (除自定义类型中断以外) ** iWait 是否等待处理结束 (LW_IPI_SCHED 绝不允许等待, 否则会死锁) ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _SmpSendIpiAllOther (ULONG ulIPIVec, INT iWait) { ULONG i; ULONG ulCPUId; ulCPUId = LW_CPU_GET_CUR_ID(); KN_SMP_WMB(); for (i = 0; i < LW_NCPUS; i++) { if (ulCPUId != i) { _SmpSendIpi(i, ulIPIVec, iWait); } } }