void CommOS_StopIO(void) { int cpu; if (running) { running = 0; if (aioWQ) { FlushWorkqueue(aioWQ); DestroyWorkqueue(aioWQ); aioWQ = NULL; } FlushWorkqueue(dispatchWQ); #ifdef CONFIG_HOTPLUG_CPU unregister_hotcpu_notifier(&CpuNotifier); #endif for_each_possible_cpu(cpu) { WaitForDelayedWork(&dispatchWorksNow[cpu]); WaitForDelayedWork(&dispatchWorks[cpu]); } DestroyWorkqueue(dispatchWQ); dispatchWQ = NULL; commos_info("%s: I/O tasks stopped.\n", __func__); } }
static int __cpuinit CpuCallback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; switch (action) { case CPU_ONLINE: case CPU_ONLINE_FROZEN: if (running) QueueDelayedWorkOn(cpu, dispatchWQ, &dispatchWorks[cpu], dispatchInterval); break; case CPU_DOWN_PREPARE: case CPU_DOWN_PREPARE_FROZEN: WaitForDelayedWork(&dispatchWorksNow[cpu]); WaitForDelayedWork(&dispatchWorks[cpu]); break; case CPU_DOWN_FAILED: case CPU_DOWN_FAILED_FROZEN: if (running) QueueDelayedWorkOn(cpu, dispatchWQ, &dispatchWorks[cpu], dispatchInterval); break; } return NOTIFY_OK; }
void CommOS_StopIO(void) { int cpu; if (running) { running = 0; if (aioWQ) { FlushWorkqueue(aioWQ); DestroyWorkqueue(aioWQ); aioWQ = NULL; } FlushWorkqueue(dispatchWQ); for (cpu = 0; cpu < numCpus; cpu++) { WaitForDelayedWork(&dispatchWorksNow[cpu]); WaitForDelayedWork(&dispatchWorks[cpu]); } DestroyWorkqueue(dispatchWQ); dispatchWQ = NULL; CommOS_Log(("%s: I/O tasks stopped.\n", __FUNCTION__)); } }