Michal Hocko wrote: > On Thu 28-05-15 06:59:32, Tetsuo Handa wrote: > > I just imagined a case where p is blocked at down_read() in acct_collect() from > > do_exit() when p is sharing mm with other processes, and other process is doing > > blocking operation with mm->mmap_sem held for writing. Is such case impossible? > > It is very much possible and I have missed this case when proposing > my alternative. The other process could be doing an address space > operation e.g. mmap which requires an allocation. Are there locations that do memory allocations with mm->mmap_sem held for writing? Is it possible that thread1 is doing memory allocation between down_write(¤t->mm->mmap_sem) and up_write(¤t->mm->mmap_sem), thread2 sharing the same mm is waiting at down_read(¤t->mm->mmap_sem), and the OOM killer invoked by thread3 chooses thread2 as the OOM victim and sets TIF_MEMDIE to thread2? If yes, I think setting TIF_MEMDIE to only one thread can cause deadlock problem when mm is shared by multiple threads, for thread2 cannot be terminated because thread1 will not call up_write(¤t->mm->mmap_sem) until thread1's memory allocation completes, resulting in hang up. If thread2->mm && task_will_free_mem(thread2) was true when the OOM killer chooses thread2 as the OOM victim, it will result in annoying silent hang up. If there are locations that do memory allocations with mm->mmap_sem held for writing, don't we need to send SIGKILL and set TIF_MEMDIE to all threads which could block the OOM victim? Maybe we can use "struct mm_struct"->"bool chosen_by_oom_killer" and checking for (current->mm && current->mm->chosen_by_oom_killer) than test_thread_flag(TIF_MEMDIE) inside the memory allocator? -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>