On Tue, 17 Aug 2010 20:43:10 -0700 (PDT) David Rientjes <rientjes@xxxxxxxxxx> wrote: > On Wed, 18 Aug 2010, KAMEZAWA Hiroyuki wrote: > > > > I was thinking about adding an "unsinged long oom_kill_disable_count" to > > > struct mm_struct that would atomically increment anytime a task attached > > > to it had a signal->oom_score_adj of OOM_SCORE_ADJ_MIN. > > > > > > The proc handler when changing /proc/pid/oom_score_adj would inc or dec > > > the counter depending on the new value, and exit_mm() would dec the > > > counter if current->signal->oom_score_adj is OOM_SCORE_ADJ_MIN. > > > > > > What do you think? > > > > > > > Hmm. I want to make hooks to "exit" small. > > > > > Is it worth adding > > if (unlikely(current->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)) > atomic_dec(¤t->mm->oom_disable_count); > > to exit_mm() under task_lock() to avoid the O(n^2) select_bad_process() on > oom? Or do you think that's too expensive? > Hmm, if this coutner is changed only under down_write(mmap_sem), simple 'int' counter is enough quick. > > One idea is. > > > > add a new member > > mm->unkiilable_by_oom_jiffies. > > > > And add > > > +static bool is_mm_unfreeable(struct mm_struct *mm) > > > +{ > > > + struct task_struct *p; > > > + > > if (mm->unkillable_by_oom_jiffies < jiffies) > > return true; > > > > > + for_each_process(p) > > > + if (p->mm == mm && !(p->flags & PF_KTHREAD) && > > > + p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN) > > > > mm->unkillable_by_oom_jiffies = jiffies + HZ; > > > > > + return true; > > > + return false; > > > +}+static bool is_mm_unfreeable(struct mm_struct *mm) > > > > This probably isn't fast enough for the common case, which is when no > tasks for "mm" have an oom_score_adj of OOM_SCORE_ADJ_MIN, since it still > iterates through every task. > you're right. Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>