On 03/24/2014 09:47 PM, Chris Redpath wrote:
When a normal forced up-migration takes place we stop the task to be migrated while the target CPU becomes available. This delay can range from 80us to 1500us on TC2 if the target CPU is in a deep idle state.
Instead, interrupt the target CPU and ask it to pull a task. This lets the current eligible task continue executing on the original CPU while the target CPU wakes. Use a pinned timer to prevent the pulling CPU going back into power-down with pending up-migrations.
If we trigger for a nohz kick, it doesn't matter about triggering for an idle pull since the idle_pull flag will be set when we execute the softirq and we'll still do the idle pull.
If the target CPU is busy, we will not pull any tasks.
Chris, I do not fully understand the MP feature. So correct me if I am wrong. :)
The trade off is one more reschedule interrupt, and keep big cpu alive, that cause more energy cost. So do you have data show the trade off is worthy? like, the res interrupt cost, cpu alive cost VS go to idle and be wakeup cost. or benchmark data to show we get benefit from performance/power.
As to the one more res interrupt, could we check the target's pending timer before add new one? if it has a timer in time, we can save the keep_alive interrupt.
BTW, did we check the little cpu domain to see if they are under utilize? If so, relief the big cpu load is helpful on power efficiency. I just newly idle pull for big cpu, not for little cpu.