On 08/20, Eric W. Biederman wrote: > > That said if we are going for a small change why not: > > /* > * Make sure we will check other processes sharing the mm if this is > * not vfrok which wants its own oom_score_adj. > * pin the mm so it doesn't go away and get reused after task_unlock > */ > if (!task->vfork_done) { > struct task_struct *p = find_lock_task_mm(task); > > if (p) { > - if (atomic_read(&p->mm->mm_users) > 1) { > + if (atomic_read(&p->mm->mm_users) > p->signal->nr_threads) { In theory this needs a barrier to avoid the race with do_exit(). And I'd suggest to use signal->live, I think signal->nr_threads should die... Something like bool probably_has_other_mm_users(tsk) { return atomic_read_acquire(&tsk->mm->mm_users) > atomic_read(&tsk->signal->live); } The barrier implied by _acquire ensures that if we race with the exiting task and see the result of exit_mm()->mmput(mm), then we must also see the result of atomic_dec_and_test(signal->live). Either way, if we want to fix the race with clone(CLONE_VM) we need other changes. Oleg.