On Mon, 23 Aug 2010, Andrew Morton wrote: > > --- a/fs/proc/base.c > > +++ b/fs/proc/base.c > > @@ -1047,6 +1047,21 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf, > > return -EACCES; > > } > > > > + task_lock(task); > > + if (!task->mm) { > > + task_unlock(task); > > + unlock_task_sighand(task, &flags); > > + put_task_struct(task); > > + return -EINVAL; > > + } > > + > > + if (oom_adjust != task->signal->oom_adj) { > > + if (oom_adjust == OOM_DISABLE) > > + atomic_inc(&task->mm->oom_disable_count); > > + if (task->signal->oom_adj == OOM_DISABLE) > > + atomic_dec(&task->mm->oom_disable_count); > > + } > > scary function. Wanna try converting oom_adjust_write() to the > single-exit-with-goto model sometime, see if the result looks more > maintainable? > Ok, that would certainly be better. > > --- a/kernel/fork.c > > +++ b/kernel/fork.c > > @@ -65,6 +65,7 @@ > > #include <linux/perf_event.h> > > #include <linux/posix-timers.h> > > #include <linux/user-return-notifier.h> > > +#include <linux/oom.h> > > > > #include <asm/pgtable.h> > > #include <asm/pgalloc.h> > > @@ -485,6 +486,7 @@ static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p) > > mm->cached_hole_size = ~0UL; > > mm_init_aio(mm); > > mm_init_owner(mm, p); > > + atomic_set(&mm->oom_disable_count, 0); > > So in fork() we zap this if !CLONE_VM? Was the CLONE_VM case tested > nicely? > In clone(), yeah, fork() doesn't use CLONE_VM so the child thread will always have a different ->mm. The new ->mm will get oom_disable_count incremented later if tsk has inherited a OOM_DISABLE value. We've been running with this patch (minus the sys_unshare() code I added) for a year now internally. -- 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>