Messages in this thread | | | Subject | Re: [PATCH 6/6] mm, oom: fortify task_will_free_mem | From | Tetsuo Handa <> | Date | Thu, 26 May 2016 23:11:47 +0900 |
| |
Michal Hocko wrote: > +/* > + * Checks whether the given task is dying or exiting and likely to > + * release its address space. This means that all threads and processes > + * sharing the same mm have to be killed or exiting. > + */ > +static inline bool task_will_free_mem(struct task_struct *task) > +{ > + struct mm_struct *mm = NULL; > + struct task_struct *p; > + > + /* > + * If the process has passed exit_mm we have to skip it because > + * we have lost a link to other tasks sharing this mm, we do not > + * have anything to reap and the task might then get stuck waiting > + * for parent as zombie and we do not want it to hold TIF_MEMDIE > + */ > + p = find_lock_task_mm(task); > + if (!p) > return false; > > + if (!__task_will_free_mem(p)) { > + task_unlock(p); > + return false; > + } > + > + /* > + * Check whether there are other processes sharing the mm - they all have > + * to be killed or exiting. > + */ > + if (atomic_read(&p->mm->mm_users) > get_nr_threads(p)) { > + mm = p->mm; > + /* pin the mm to not get freed and reused */ > + atomic_inc(&mm->mm_count); > + } > + task_unlock(p); > + > + if (mm) { > + rcu_read_lock(); > + for_each_process(p) { > + bool vfork; > + > + /* > + * skip over vforked tasks because they are mostly > + * independent and will drop the mm soon > + */ > + task_lock(p); > + vfork = p->vfork_done; > + task_unlock(p); > + if (vfork) > + continue; > + > + if (!__task_will_free_mem(p)) > + break; > + } > + rcu_read_unlock(); > + mmdrop(mm);
Did you forget "if (something) return false;" here?
> + } > +
If task_will_free_mem() == true is always followed by mark_oom_victim() and wake_oom_reaper(), can we call them from here?
> return true; > }
| |