Messages in this thread Patch in this message | | | Date | Thu, 17 Dec 2015 07:34:27 +0800 | From | Yuyang Du <> | Subject | Re: PELT initial task load and wake_up_new_task() |
| |
Hi Steve,
On Wed, Dec 16, 2015 at 06:50:43PM -0800, Steve Muckle wrote: > On 12/15/2015 03:55 PM, Yuyang Du wrote: > > Hope the following patch should work. > > Thanks Yuyang. AFAICS it should work, though I believe the test on > last_update_time could instead go at the top of migrate_task_rq_fair()? > It'd save the fn call to remove_entity_load_avg() and two unnecessary > assignments (as p->se.avg.last_update_time and p->se.exec_start = 0 for > newly forked tasks). This worked for me.
In a hindsight yesterday, this also occurred to me. But I think the fix is also applicable to a group entity that is being removed but never used. And such cases are not unlikely to happen.
To make the code less duplicate, I still do this in remove_entity_load_avg(). Make sense?
Sorry about the compile error.
--- Subject: [PATCH] sched: Fix new task's load avg removed from source CPU in wake_up_new_task()
If a newly created task is selected to go to a different CPU in fork balance when it wakes up the first time, its load averages should not be removed from the source CPU since they are never added to it before. The same is also applicable to a never used group entity.
Fix it in remove_entity_load_avg(): when entity's last_update_time is 0, simply return. This should precisely identify the case in question, because in other migrations, the last_update_time is set to 0 after remove_entity_load_avg().
Reported-by: Steve Muckle <steve.muckle@linaro.org> Signed-off-by: Yuyang Du <yuyang.du@intel.com> --- kernel/sched/fair.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index e3266eb..3f6a8b3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -2908,10 +2908,18 @@ void remove_entity_load_avg(struct sched_entity *se) { struct cfs_rq *cfs_rq = cfs_rq_of(se); u64 last_update_time; - #ifndef CONFIG_64BIT u64 last_update_time_copy; +#endif + /* + * Newly created task or never used group entity should not be removed + * from its (source) cfs_rq + */ + if (se->avg.last_update_time == 0) + return; + +#ifndef CONFIG_64BIT do { last_update_time_copy = cfs_rq->load_last_update_time_copy; smp_rmb(); --
| |