Messages in this thread Patch in this message | | | From | Lucas De Marchi <> | Date | Thu, 9 Jul 2009 13:57:20 +0200 | Subject | Re: possible migration bug with hotplug cpu |
| |
So, I found the problem.
These fields are currently not initialized upon fork. I noted that when I updated to 2.6.31-rc2; commit 6c594c21fcb02c662f11c97be4d7d2b73060a205 was merged into kernel by Ingo (not present yet in 2.6.30), but it only initializes nr_migrations. Why the other fields are not initialized to 0? Even when there are more processors, these fields may be wrong if not zeroed when a new task is started. Below the fast way to fix it. This fixed the counters for me.
What do you think of creating a struct sched_statistics embedded into sched_entity so we coudl memset it to zero all at once? All fields of SCHED_STATS piece should be initialized, right?
Lucas De Marchi
diff --git a/kernel/sched.c b/kernel/sched.c index fd3ac58..b8d75cf 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -2572,15 +2572,37 @@ static void __sched_fork(struct task_struct *p) p->se.avg_wakeup = sysctl_sched_wakeup_granularity;
#ifdef CONFIG_SCHEDSTATS - p->se.wait_start = 0; - p->se.sum_sleep_runtime = 0; - p->se.sleep_start = 0; - p->se.block_start = 0; - p->se.sleep_max = 0; - p->se.block_max = 0; - p->se.exec_max = 0; - p->se.slice_max = 0; - p->se.wait_max = 0; + p->se.wait_start = 0; + p->se.wait_max = 0; + p->se.wait_count = 0; + p->se.wait_sum = 0; + + p->se.sleep_start = 0; + p->se.sleep_max = 0; + p->se.sum_sleep_runtime = 0; + + p->se.block_start = 0; + p->se.block_max = 0; + p->se.exec_max = 0; + p->se.slice_max = 0; + + p->se.nr_migrations_cold = 0; + p->se.nr_failed_migrations_affine = 0; + p->se.nr_failed_migrations_running = 0; + p->se.nr_failed_migrations_hot = 0; + p->se.nr_forced_migrations = 0; + p->se.nr_forced2_migrations = 0; + + p->se.nr_wakeups = 0; + p->se.nr_wakeups_sync = 0; + p->se.nr_wakeups_migrate = 0; + p->se.nr_wakeups_local = 0; + p->se.nr_wakeups_remote = 0; + p->se.nr_wakeups_affine = 0; + p->se.nr_wakeups_affine_attempts = 0; + p->se.nr_wakeups_passive = 0; + p->se.nr_wakeups_idle = 0; + #endif
INIT_LIST_HEAD(&p->rt.run_list);
| |