Messages in this thread | | | Date | Wed, 5 Aug 2009 15:55:00 +0900 | From | KAMEZAWA Hiroyuki <> | Subject | Re: [PATCH 1/4] oom: move oom_adj to signal_struct |
| |
On Wed, 5 Aug 2009 15:37:01 +0900 Minchan Kim <minchan.kim@gmail.com> wrote: > Hmm. I can't understand why it is troublesome. > I think it's related to moving oom_adj to singal_struct. > Unfortunately, I can't understand why we have to put oom_adj > in singal_struct? > > That's why I have a question to Kosaki a while ago. > I can't understand it still. :-( > > Could you elaborate it ? >
Current code is as following == do_each_thread(g,p) { ...... p = badness();
record p of highest badness. } p = higest badness thread.
Scan all threads which shares mm_struct of p. and check oom_adj == Assume a process which has 20000 threads. And 1 of thread has OOM_DISABLE.
Then, at worst, this scan will needs (1+2+3+....+20000) * (20000-1) scan. (when ignoring other processes) even with your patch.
This means the kernel wastes enough long time that Cluster-Management-Software can detetct this as livelock, and do reboot/cluster-fail-over.
Fixing livelock is not the last goal. I (we) would like to reduct stall time to reasonable level. If we move oom_adj to signal_struct or mm_struct, scan-cost will be only 20000. No retry at all.
And, if we can use for_each_process() rather than do_each_thread(), scan-cost will be 1.
(BTW, "signal" struct is bad name I think, it should be "process" struct ;)
Thanks, -Kame
| |