That rapidly gets you thrashing around as I suspect you've found.
I'm currently using the following rule in wake up
	if(current->mm->runnable > 0)	/* One already running ? */
		cpu = current->mm->last_cpu;
	else
		cpu = idle_cpu();
	else
		cpu = cpu_num[fast_fl1(runnable_set)]
that is
	If we are running threads with this mm on a cpu throw them at the
		same core
	If there is an idle CPU use it
	Take the mask of currently executing priority levels, find the last
	set bit (lowest pri) being executed, and look up a cpu running at
	that priority
Then the idle stealing code will do the rest of the balancing, but at least
it converges towards each mm living on one cpu core.
Alan
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/