mm, oom: get rid of TIF_MEMDIE
Subsystems (25)
Michal Hocko
maintainercover mm, oom: get rid of TIF_MEMDIE
Hi,
I have posted this as an RFC [1] to see whether the approach I've taken is acceptable. There didn't seem to be any fundamental opposition so I have dropped the RFC. I would like to target this for 4.10 and sending this early because I will be offline for a longer time at the end of Oct. The series is on top of the current mmotm tree (2016-09-27-16-08). It has passed my basic testing and nothing blew up but this additional testing never hurts as well as a deep review I would be really grateful for.
The primary point of this series is to get rid of TIF_MEMDIE finally. This has been on my TODO list for quite some time because the flag has proven to cause many problems. First of all, the flag was terribly overloaded. It used to act as a oom lock to prevent from multiple oom selection, then it grants access to memory reserves and finally it is used to count oom victims for oom_killer_disable() logic.
It really didn't help that the flag is per task_struct (aka thread) while the OOM is mm_struct scope operation. This means that all threads in the same thread group - or in general all processes sharing the mm - will have to get the flag for the code to rely on it reliably. This was not that easy because at least access to memory reserves for all threads could deplete them quite easily. Setting the flag to all threads is quite challenging, though, because mark_oom_victim can race with copy_process and we could easily miss a thread. That being said it would be better to get rid of the flag rather workaround existing issues and add more complicated code to fix the fundamental mismatch.
Recent changes in the oom proper allows for that finally, I believe. Now that all the oom victims are reapable we are no longer depending on ALLOC_NO_WATERMARKS because the memory held by the victim is reclaimed asynchronously. A partial access to memory reserves should be sufficient just to guarantee that the oom victim is not starved due to other memory consumers. This also means that we do not have to pretend to be conservative and give access to memory reserves only to one thread from the process at the time. This is patch 1.
Patch 2 is a simple cleanup which turns TIF_MEMDIE users to tsk_is_oom_victim which is process rather than thread centric. None of those callers really requires to be thread aware AFAICS.
The tricky part then is exit_oom_victim vs. oom_killer_disable because TIF_MEMDIE acted as a token there so we had a way to count threads from the process. It didn't work 100% reliably and had its own issues but we have to replace it with something which doesn't rely on counting threads but rather find a moment when all threads have reached steady state in do_exit. This is what patch 3 does and I would really appreciate if Oleg could double check my thinking there. I am also CCing Al on that one because I am moving exit_io_context up in do_exit right before exit_notify.
The last patch just removes TIF_MEMDIE from the arch code because it is no longer needed anywhere.
I really appreciate any feedback.
Changes since RFC
- add motivation to the cover as suggested by Johannes
- rebased on top of the current mmotm
[1] http://lkml.kernel.org/r/[email protected]
Michal Hocko (4):
mm, oom: do not rely on TIF_MEMDIE for memory reserves access
mm: replace TIF_MEMDIE checks by tsk_is_oom_victim
mm, oom: do not rely on TIF_MEMDIE for exit_oom_victim
arch: get rid of TIF_MEMDIE
The diffstat looks quite promissing to me.
arch/alpha/include/asm/thread_info.h | 1 - arch/arc/include/asm/thread_info.h | 2 -- arch/arm/include/asm/thread_info.h | 1 - arch/arm64/include/asm/thread_info.h | 1 - arch/avr32/include/asm/thread_info.h | 2 -- arch/blackfin/include/asm/thread_info.h | 1 - arch/c6x/include/asm/thread_info.h | 1 - arch/cris/include/asm/thread_info.h | 1 - arch/frv/include/asm/thread_info.h | 1 - arch/h8300/include/asm/thread_info.h | 1 - arch/hexagon/include/asm/thread_info.h | 1 - arch/ia64/include/asm/thread_info.h | 1 - arch/m32r/include/asm/thread_info.h | 1 - arch/m68k/include/asm/thread_info.h | 1 - arch/metag/include/asm/thread_info.h | 1 - arch/microblaze/include/asm/thread_info.h | 1 - arch/mips/include/asm/thread_info.h | 1 - arch/mn10300/include/asm/thread_info.h | 1 - arch/nios2/include/asm/thread_info.h | 1 - arch/openrisc/include/asm/thread_info.h | 1 - arch/parisc/include/asm/thread_info.h | 1 - arch/powerpc/include/asm/thread_info.h | 1 - arch/s390/include/asm/thread_info.h | 1 - arch/score/include/asm/thread_info.h | 1 - arch/sh/include/asm/thread_info.h | 1 - arch/sparc/include/asm/thread_info_32.h | 1 - arch/sparc/include/asm/thread_info_64.h | 1 - arch/tile/include/asm/thread_info.h | 2 -- arch/um/include/asm/thread_info.h | 2 -- arch/unicore32/include/asm/thread_info.h | 1 - arch/x86/include/asm/thread_info.h | 1 - arch/xtensa/include/asm/thread_info.h | 1 - include/linux/sched.h | 2 +- kernel/cpuset.c | 9 ++--- kernel/exit.c | 38 +++++++++++++++------ kernel/freezer.c | 3 +- mm/internal.h | 11 ++++++ mm/memcontrol.c | 2 +- mm/oom_kill.c | 40 +++++++++++++--------- mm/page_alloc.c | 57 +++++++++++++++++++++++++------ 40 files changed, 117 insertions(+), 81 deletions(-)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal Hocko
maintainerPATCH 1/4 mm, oom: do not rely on TIF_MEMDIE for memory reserves access
From: Michal Hocko <[email protected]>
For ages we have been relying on TIF_MEMDIE thread flag to mark OOM victims and then, among other things, to give these threads full access to memory reserves. There are few shortcomings of this implementation, though.
First of all and the most serious one is that the full access to memory reserves is quite dangerous because we leave no safety room for the system to operate and potentially do last emergency steps to move on.
Secondly this flag is per task_struct while the OOM killer operates on mm_struct granularity so all processes sharing the given mm are killed. Giving the full access to all these task_structs could leave to a quick memory reserves depletion. We have tried to reduce this risk by giving TIF_MEMDIE only to the main thread and the currently allocating task but that doesn't really solve this problem while it surely opens up a room for corner cases - e.g. GFP_NO{FS,IO} requests might loop inside the allocator without access to memory reserves because a particular thread was not the group leader.
Now that we have the oom reaper and that all oom victims are reapable (after "oom, oom_reaper: allow to reap mm shared by the kthreads") we can be more conservative and grant only partial access to memory reserves because there are reasonable chances of the parallel memory freeing. We still want some access to reserves because we do not want other consumers to eat up the victim's freed memory. oom victims will still contend with __GFP_HIGH users but those shouldn't be so aggressive to starve oom victims completely.
Introduce ALLOC_OOM flag and give all tsk_is_oom_victim tasks access to the half of the reserves. This makes the access to reserves independent on which task has passed through mark_oom_victim. Also drop any usage of TIF_MEMDIE from the page allocator proper and replace it by tsk_is_oom_victim as well which will make page_alloc.c completely TIF_MEMDIE free finally.
CONFIG_MMU=n doesn't have oom reaper so let's stick to the original ALLOC_NO_WATERMARKS approach but be careful because they still might deplete all the memory reserves so keep the semantic as close to the original implementation as possible and give them access to memory reserves only up to exit_mm (when tsk->mm is cleared) rather than while tsk_is_oom_victim which is until signal struct is gone.
--- mm/internal.h | 11 +++++++++++ mm/oom_kill.c | 9 +++++---- mm/page_alloc.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 62 insertions(+), 15 deletions(-)
mm/internal.h +11 -0
@@ -461,6 +461,17 @@ unsigned long reclaim_clean_pages_from_list(struct zone *zone,/* Mask to get the watermark bits */ #define ALLOC_WMARK_MASK (ALLOC_NO_WATERMARKS-1) +/* +* Only MMU archs have async oom victim reclaim - aka oom_reaper so we +* cannot assume a reduced access to memory reserves is sufficient for +* !MMU +*/ +#ifdef CONFIG_MMU +#define ALLOC_OOM 0x08 +#else +#define ALLOC_OOM ALLOC_NO_WATERMARKS +#endif +#define ALLOC_HARDER 0x10/* try to alloc harder */ #define ALLOC_HIGH 0x20/* __GFP_HIGH set */ #define ALLOC_CPUSET 0x40/* check for correct cpuset */
mm/oom_kill.c +5 -4
@@ -816,7 +816,8 @@ static void oom_kill_process(struct oom_control *oc, const char *message)/* * If the task is already exiting, don't alarm the sysadmin or kill -* its children or threads, just set TIF_MEMDIE so it can die quickly +* its children or threads, just give it access to memory reserves +* so it can die quickly */ task_lock (p);if (task_will_free_mem (p)) {
@@ -876,9 +877,9 @@ static void oom_kill_process(struct oom_control *oc, const char *message) mm = victim->mm;atomic_inc (&mm->mm_count);/* -* We should send SIGKILL before setting TIF_MEMDIE in order to prevent -* the OOM victim from depleting the memory reserves from the user -* space under its control. +* We should send SIGKILL before granting access to memory reserves +* in order to prevent the OOM victim from depleting the memory +* reserves from the user space under its control. */ do_send_sig_info (SIGKILL ,SEND_SIG_FORCED , victim, true);mark_oom_victim (victim);
mm/page_alloc.c +46 -11
112 lines not on this page · raw message
Signature · 7 lines
2.9.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal Hocko
maintainerPATCH 2/4 mm: replace TIF_MEMDIE checks by tsk_is_oom_victim
In reply to Michal HockoFrom: Michal Hocko <[email protected]>
TIF_MEMDIE is set only to the tasks whick were either directly selected by the OOM killer or passed through mark_oom_victim from the allocator path. tsk_is_oom_victim is more generic and allows to identify all tasks (threads) which share the mm with the oom victim.
--- kernel/cpuset.c | 9 +++++---- mm/memcontrol.c | 2 +- mm/oom_kill.c | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-)
kernel/cpuset.c +5 -4
@@ -54,6 +54,7 @@#include <linux/time64.h> #include <linux/backing-dev.h> #include <linux/sort.h> +#include <linux/oom.h> #include <asm/uaccess.h> #include <linux/atomic.h>
@@ -2487,12 +2488,12 @@ static struct cpuset *nearest_hardwall_ancestor(struct cpuset *cs)* If we're in interrupt, yes, we can always allocate. If @node is set in * current's mems_allowed, yes. If it's not a __GFP_HARDWALL request and this * node is set in the nearest hardwalled cpuset ancestor to current's cpuset, -* yes. If current has access to memory reserves due to TIF_MEMDIE, yes. +* yes. If current has access to memory reserves as an oom victim, yes. * Otherwise, no. * * GFP_USER allocations are marked with the __GFP_HARDWALL bit, * and do not allow allocations outside the current tasks cpuset -* unless the task has been OOM killed as is marked TIF_MEMDIE. +* unless the task has been OOM killed. * GFP_KERNEL allocations are not so marked, so can escape to the * nearest enclosing hardwalled ancestor cpuset. *
@@ -2515,7 +2516,7 @@ static struct cpuset *nearest_hardwall_ancestor(struct cpuset *cs)* affect that: * in_interrupt - any node ok (current task context irrelevant) * GFP_ATOMIC - any node ok -* TIF_MEMDIE - any node ok +* tsk_is_oom_victim - any node ok * GFP_KERNEL - any node in enclosing hardwalled cpuset ok * GFP_USER - only nodes in current tasks mems allowed ok. */
@@ -2533,7 +2534,7 @@ bool __cpuset_node_allowed(int node, gfp_t gfp_mask)* Allow tasks that have access to memory reserves because they have * been OOM killed to get memory anywhere. */ -if (unlikely (test_thread_flag (TIF_MEMDIE ))) +if (unlikely (tsk_is_oom_victim (current)))return true;if (gfp_mask & __GFP_HARDWALL)/* If hardwall request, stop here */ return false;
mm/memcontrol.c +1 -1
@@ -1912,7 +1912,7 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask,* bypass the last charges so that they can exit quickly and * free their memory. */ -if (unlikely (test_thread_flag (TIF_MEMDIE ) || +if (unlikely (tsk_is_oom_victim (current) ||fatal_signal_pending (current) || current->flags &PF_EXITING )) goto force;
mm/oom_kill.c +1 -1
@@ -477,7 +477,7 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)* [...] * out_of_memory * select_bad_process -* # no TIF_MEMDIE task selects new victim +* # no oom victim, selects new victim * unmap_page_range # frees some memory */ mutex_lock (&oom_lock);
Signature · 7 lines
2.9.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal Hocko
maintainerPATCH 3/4 mm, oom: do not rely on TIF_MEMDIE for exit_oom_victim
In reply to Michal HockoFrom: Michal Hocko <[email protected]>
mark_oom_victim and exit_oom_victim are used for oom_killer_disable which should block as long as there are any oom victims alive. Up to now we have relied on TIF_MEMDIE task flag to count how many oom victim we have. This is not optimal because only one thread receives this flag at the time while the whole process (thread group) is killed and should die. As a result we do not thaw the whole thread group and so a multi threaded process can leave some threads behind in the fridge. We really want to thaw all the threads.
This is not all that easy because there is no reliable way to count threads in the process as the oom killer might race with copy_process. So marking all threads with TIF_MEMDIE and increment oom_victims accordingly is not safe. Also TIF_MEMDIE flag should just die so we should better come up with a different approach.
All we need to guarantee is that exit_oom_victim is called at the time when no further access to (possibly suspended) devices or generate other IO (which would clobber suspended image and only once per process) is possible. It seems we can rely on exit_notify for that because we already have to detect the last thread to do a cleanup. Let's propagate that information up to do_exit and only call exit_oom_victim for such a thread. With this in place we can safely increment oom_victims only once per thread group and thaw all the threads from the process. freezing_slow_path can also rely on tsk_is_oom_victim as well now.
exit_io_context is currently called after exit_notify but it seems it is safe to call it right before exit_notify because that is passed exit_files.
--- include/linux/sched.h | 2 +- kernel/exit.c | 38 ++++++++++++++++++++++++++++---------- kernel/freezer.c | 3 ++- mm/oom_kill.c | 29 +++++++++++++++++------------ 4 files changed, 48 insertions(+), 24 deletions(-)
include/linux/sched.h +1 -1
@@ -2660,7 +2660,7 @@ static inline void kernel_signal_stop(void)schedule (); } -extern void release_task (struct task_struct * p); +extern bool release_task (struct task_struct * p);extern int send_sig_info (int ,struct siginfo *,struct task_struct *);extern int force_sigsegv (int ,struct task_struct *);extern int force_sig_info (int ,struct siginfo *,struct task_struct *);
kernel/exit.c +28 -10
@@ -165,10 +165,11 @@ static void delayed_put_task_struct(struct rcu_head *rhp) } -void release_task (struct task_struct *p) +bool release_task (struct task_struct *p) {struct task_struct *leader;int zap_leader; +bool last = false; repeat:/* don't need to get the RCU readlock here - the process is dead and * can't be modifying its own credentials. But shut RCU-lockdep up */
@@ -197,8 +198,10 @@ void release_task(struct task_struct *p)* then we are the one who should release the leader. */ zap_leader =do_notify_parent (leader, leader->exit_signal); -if (zap_leader) +if (zap_leader) { leader->exit_state =EXIT_DEAD ; + last = true; + } }write_unlock_irq (&tasklist_lock);
@@ -208,6 +211,8 @@ void release_task(struct task_struct *p) p = leader;if (unlikely (zap_leader)) goto repeat; + +return last; }/*
@@ -434,8 +439,6 @@ static void exit_mm(struct task_struct *tsk)task_unlock (tsk);mm_update_next_owner (mm);mmput (mm); -if (test_thread_flag (TIF_MEMDIE )) -exit_oom_victim (); }static struct task_struct *find_alive_thread (struct task_struct *p)
@@ -584,12 +587,15 @@ static void forget_original_parent(struct task_struct *father,/* * Send signals to all our closest relatives so that they know * to properly mourn us.. +* +* Returns true if this is the last thread from the thread group */ -static void exit_notify (struct task_struct *tsk,int group_dead) +static bool exit_notify (struct task_struct *tsk,int group_dead) {bool autoreap;struct task_struct *p, *n;LIST_HEAD (dead); +bool last = false;write_lock_irq (&tasklist_lock);forget_original_parent (tsk, &dead);
@@ -606,6 +612,7 @@ static void exit_notify(struct task_struct *tsk, int group_dead) }else if (thread_group_leader (tsk)) { autoreap =thread_group_empty (tsk) &&do_notify_parent (tsk, tsk->exit_signal); + last =thread_group_empty (tsk); }else { autoreap = true; }
@@ -621,8 +628,11 @@ static void exit_notify(struct task_struct *tsk, int group_dead)list_for_each_entry_safe (p, n, &dead, ptrace_entry) {list_del_init (&p->ptrace_entry); -release_task (p); +if (release_task (p) && p == tsk) + last = true; } + +return last; }#ifdef CONFIG_DEBUG_STACK_USAGE
@@ -766,7 +776,18 @@ void do_exit(long code)TASKS_RCU (preempt_disable ());TASKS_RCU (tasks_rcu_i =__srcu_read_lock (&tasks_rcu_exit_srcu));TASKS_RCU (preempt_enable ()); -exit_notify (tsk, group_dead); + +if (tsk->io_context) +exit_io_context (tsk); + +/* +* Notify oom_killer_disable that the last oom thread is exiting. +* We might have more threads running at this point but none of them +* will access any devices behind this point. +*/ +if (exit_notify (tsk, group_dead) &&tsk_is_oom_victim (current)) +exit_oom_victim (); +proc_exit_connector (tsk);mpol_put_task_policy (tsk);#ifdef CONFIG_FUTEX
@@ -784,9 +805,6 @@ void do_exit(long code)*/ tsk->flags |=PF_EXITPIDONE ; -if (tsk->io_context) -exit_io_context (tsk); -if (tsk->splice_pipe)free_pipe_info (tsk->splice_pipe);
kernel/freezer.c +2 -1
@@ -10,6 +10,7 @@#include <linux/syscalls.h> #include <linux/freezer.h> #include <linux/kthread.h> +#include <linux/oom.h> /* total number of freezing conditions in effect */ atomic_t system_freezing_cnt =ATOMIC_INIT (0 );
@@ -42,7 +43,7 @@ bool freezing_slow_path(struct task_struct *p)if (p->flags & (PF_NOFREEZE |PF_SUSPEND_TASK ))return false; -if (test_tsk_thread_flag (p,TIF_MEMDIE )) +if (tsk_is_oom_victim (p))return false;if (pm_nosig_freezing ||cgroup_freezing (p))
mm/oom_kill.c +17 -12
@@ -649,33 +649,38 @@ static inline void wake_oom_reaper(struct task_struct *tsk)static void mark_oom_victim (struct task_struct *tsk) {struct mm_struct *mm = tsk->mm; +struct task_struct *t;WARN_ON (oom_killer_disabled); -/* OOM killer might race with memcg OOM */ -if (test_and_set_tsk_thread_flag (tsk,TIF_MEMDIE )) -return ;/* oom_mm is bound to the signal struct life time. */ -if (!cmpxchg (&tsk->signal->oom_mm,NULL , mm)) +if (!cmpxchg (&tsk->signal->oom_mm,NULL , mm)) {atomic_inc (&tsk->signal->oom_mm->mm_count); +/* Only count thread groups */ +atomic_inc (&oom_victims); + } +/* -* Make sure that the task is woken up from uninterruptible sleep -* if it is frozen because OOM killer wouldn't be able to free -* any memory and livelock. freezing_slow_path will tell the freezer -* that TIF_MEMDIE tasks should be ignored. +* Make sure that the the whole thread groupd is woken up from +* uninterruptible sleep if it is frozen because the oom victim +* will free its memory completely only after exit. +* freezing_slow_path will tell the freezer that oom victims +* should be ignored. */ -__thaw_task (tsk); -atomic_inc (&oom_victims); +rcu_read_lock (); +for_each_thread (tsk, t) +__thaw_task (t); +rcu_read_unlock (); }/** * exit_oom_victim - note the exit of an OOM victim +* +* Has to be called only once per thread group. */ void exit_oom_victim (void ) { -clear_thread_flag (TIF_MEMDIE ); -if (!atomic_dec_return (&oom_victims))wake_up_all (&oom_victims_wait); }
Signature · 7 lines
2.9.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 3/4] mm, oom: do not rely on TIF_MEMDIE for exit_oom_victim
Quoted 11 lines · Michal Hocko
kernel/exit.c +2
-1-void release_task (struct task_struct *p) +bool release_task (struct task_struct *p) {struct task_struct *leader;int zap_leader; +bool last = false; repeat:/* don't need to get the RCU readlock here - the process is dead and * can't be modifying its own credentials. But shut RCU-lockdep up */
kernel/exit.c void release_task(struct task_struct *p) · line 205
Quoted 9 lines
kernel/exit.c +3
-1@@ -197,8 +198,10 @@ void release_task(struct task_struct *p)* then we are the one who should release the leader. */ zap_leader =do_notify_parent (leader, leader->exit_signal); -if (zap_leader) +if (zap_leader) { leader->exit_state =EXIT_DEAD ; + last = true; + } }
This looks strange... it won't return true if "p" is the group leader.
Quoted 18 lines
kernel/exit.c +4
-1@@ -584,12 +587,15 @@ static void forget_original_parent(struct task_struct *father,/* * Send signals to all our closest relatives so that they know * to properly mourn us.. +* +* Returns true if this is the last thread from the thread group */ -static void exit_notify (struct task_struct *tsk,int group_dead) +static bool exit_notify (struct task_struct *tsk,int group_dead) {bool autoreap;struct task_struct *p, *n;LIST_HEAD (dead); +bool last = false;write_lock_irq (&tasklist_lock);forget_original_parent (tsk, &dead);
kernel/exit.c static void exit_notify(struct task_struct *tsk, int group_dead) · line 615
Quoted 4 lines
kernel/exit.c +1
-0@@ -606,6 +612,7 @@ static void exit_notify(struct task_struct *tsk, int group_dead) }else if (thread_group_leader (tsk)) { autoreap =thread_group_empty (tsk) &&do_notify_parent (tsk, tsk->exit_signal); + last =thread_group_empty (tsk);
so this can't detect the multi-threaded group exit, and ...
kernel/exit.c static void exit_notify(struct task_struct *tsk, int group_dead) · line 632
Quoted 5 lines
kernel/exit.c +2
-1list_for_each_entry_safe (p, n, &dead, ptrace_entry) {list_del_init (&p->ptrace_entry); -release_task (p); +if (release_task (p) && p == tsk) + last = true;
this can only happen if this process auto-reaps itself. Not to mention that exit_notify() will never return true if traced.
No, this doesn't look right.
Oleg.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal Hocko
maintainerRe: [PATCH 3/4] mm, oom: do not rely on TIF_MEMDIE for exit_oom_victim
On Tue 04-10-16 18:21:14, Oleg Nesterov wrote:
[...]
Quoted 11 lines
so this can't detect the multi-threaded group exit, and ...
kernel/exit.c static void exit_notify(struct task_struct *tsk, int group_dead) · line 632
Quoted 5 lines
kernel/exit.c +2
-1list_for_each_entry_safe (p, n, &dead, ptrace_entry) {list_del_init (&p->ptrace_entry); -release_task (p); +if (release_task (p) && p == tsk) + last = true;this can only happen if this process auto-reaps itself. Not to mention that
exit_notify()will never return true if traced.
Quoted 1 line
No, this doesn't look right.
You are right. I should have noticed that. Especially when I was hunting the strace hang bug. I started to have a bad feeling about this patch but for some reason I just didn't put all the pieces together.
So the patch is completely b0rked. Back to drawing board and start again. Oh well...
Anyway thanks and sorry to waste your time.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal Hocko
maintainerPATCH 4/4 arch: get rid of TIF_MEMDIE
In reply to Michal HockoFrom: Michal Hocko <[email protected]>
nobody relies on the flag so make it go away.
--- arch/alpha/include/asm/thread_info.h | 1 - arch/arc/include/asm/thread_info.h | 2 -- arch/arm/include/asm/thread_info.h | 1 - arch/arm64/include/asm/thread_info.h | 1 - arch/avr32/include/asm/thread_info.h | 2 -- arch/blackfin/include/asm/thread_info.h | 1 - arch/c6x/include/asm/thread_info.h | 1 - arch/cris/include/asm/thread_info.h | 1 - arch/frv/include/asm/thread_info.h | 1 - arch/h8300/include/asm/thread_info.h | 1 - arch/hexagon/include/asm/thread_info.h | 1 - arch/ia64/include/asm/thread_info.h | 1 - arch/m32r/include/asm/thread_info.h | 1 - arch/m68k/include/asm/thread_info.h | 1 - arch/metag/include/asm/thread_info.h | 1 - arch/microblaze/include/asm/thread_info.h | 1 - arch/mips/include/asm/thread_info.h | 1 - arch/mn10300/include/asm/thread_info.h | 1 - arch/nios2/include/asm/thread_info.h | 1 - arch/openrisc/include/asm/thread_info.h | 1 - arch/parisc/include/asm/thread_info.h | 1 - arch/powerpc/include/asm/thread_info.h | 1 - arch/s390/include/asm/thread_info.h | 1 - arch/score/include/asm/thread_info.h | 1 - arch/sh/include/asm/thread_info.h | 1 - arch/sparc/include/asm/thread_info_32.h | 1 - arch/sparc/include/asm/thread_info_64.h | 1 - arch/tile/include/asm/thread_info.h | 2 -- arch/um/include/asm/thread_info.h | 2 -- arch/unicore32/include/asm/thread_info.h | 1 - arch/x86/include/asm/thread_info.h | 1 - arch/xtensa/include/asm/thread_info.h | 1 - 32 files changed, 36 deletions(-)
arch/alpha/include/asm/thread_info.h +0 -1
@@ -65,7 +65,6 @@ register struct thread_info *__current_thread_info __asm__("$8");#define TIF_NEED_RESCHED 3/* rescheduling necessary */ #define TIF_SYSCALL_AUDIT 4/* syscall audit active */ #define TIF_DIE_IF_KERNEL 9/* dik recursion lock */ -#define TIF_MEMDIE 13/* is terminating due to OOM killer */ #define TIF_POLLING_NRFLAG 14/* idle is polling for TIF_NEED_RESCHED */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
arch/arc/include/asm/thread_info.h +0 -2
@@ -88,14 +88,12 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void)#define TIF_SYSCALL_TRACE 15/* syscall trace active */ /* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 16#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) -#define _TIF_MEMDIE (1<<TIF_MEMDIE)/* work to do on interrupt/exception return */ #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
arch/arm/include/asm/thread_info.h +0 -1
@@ -146,7 +146,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,#define TIF_NOHZ 12/* in adaptive nohz mode */ #define TIF_USING_IWMMXT 17 -#define TIF_MEMDIE 18/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 20#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
arch/arm64/include/asm/thread_info.h +0 -1
@@ -114,7 +114,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_SYSCALL_AUDIT 9#define TIF_SYSCALL_TRACEPOINT 10#define TIF_SECCOMP 11 -#define TIF_MEMDIE 18/* is terminating due to OOM killer */ #define TIF_FREEZE 19#define TIF_RESTORE_SIGMASK 20#define TIF_SINGLESTEP 21
arch/avr32/include/asm/thread_info.h +0 -2
@@ -70,7 +70,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_BREAKPOINT 4/* enter monitor mode on return */ #define TIF_SINGLE_STEP 5/* single step in progress */ -#define TIF_MEMDIE 6/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 7/* restore signal mask in do_signal */ #define TIF_CPU_GOING_TO_SLEEP 8/* CPU is entering sleep 0 mode */ #define TIF_NOTIFY_RESUME 9/* callback before returning to user */
@@ -82,7 +81,6 @@ static inline struct thread_info *current_thread_info(void)#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)#define _TIF_BREAKPOINT (1 << TIF_BREAKPOINT)#define _TIF_SINGLE_STEP (1 << TIF_SINGLE_STEP) -#define _TIF_MEMDIE (1 << TIF_MEMDIE)#define _TIF_CPU_GOING_TO_SLEEP (1 << TIF_CPU_GOING_TO_SLEEP)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
arch/blackfin/include/asm/thread_info.h +0 -1
@@ -79,7 +79,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_SYSCALL_TRACE 0/* syscall trace active */ #define TIF_SIGPENDING 1/* signal pending */ #define TIF_NEED_RESCHED 2/* rescheduling necessary */ -#define TIF_MEMDIE 4/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 5/* restore signal mask in do_signal() */ #define TIF_IRQ_SYNC 7/* sync pipeline stage */ #define TIF_NOTIFY_RESUME 8/* callback before returning to user */
arch/c6x/include/asm/thread_info.h +0 -1
@@ -89,7 +89,6 @@ struct thread_info *current_thread_info(void)#define TIF_NEED_RESCHED 3/* rescheduling necessary */ #define TIF_RESTORE_SIGMASK 4/* restore signal mask in do_signal() */ -#define TIF_MEMDIE 17/* OOM killer killed process */ #define TIF_WORK_MASK 0x00007FFE/* work on irq/exception return */ #define TIF_ALLWORK_MASK 0x00007FFF/* work on any return to u-space */
arch/cris/include/asm/thread_info.h +0 -1
@@ -70,7 +70,6 @@ struct thread_info {#define TIF_SIGPENDING 2/* signal pending */ #define TIF_NEED_RESCHED 3/* rescheduling necessary */ #define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal() */ -#define TIF_MEMDIE 17/* is terminating due to OOM killer */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
arch/frv/include/asm/thread_info.h +0 -1
@@ -86,7 +86,6 @@ register struct thread_info *__current_thread_info asm("gr15");#define TIF_NEED_RESCHED 3/* rescheduling necessary */ #define TIF_SINGLESTEP 4/* restore singlestep on return to user mode */ #define TIF_RESTORE_SIGMASK 5/* restore signal mask in do_signal() */ -#define TIF_MEMDIE 7/* is terminating due to OOM killer */ #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
arch/h8300/include/asm/thread_info.h +0 -1
@@ -73,7 +73,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_SIGPENDING 1/* signal pending */ #define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_SINGLESTEP 3/* singlestepping active */ -#define TIF_MEMDIE 4/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 5/* restore signal mask in do_signal() */ #define TIF_NOTIFY_RESUME 6/* callback before returning to user */ #define TIF_SYSCALL_AUDIT 7/* syscall auditing active */
arch/hexagon/include/asm/thread_info.h +0 -1
@@ -112,7 +112,6 @@ register struct thread_info *__current_thread_info asm(QUOTED_THREADINFO_REG);#define TIF_SINGLESTEP 4/* restore ss @ return to usr mode */ #define TIF_RESTORE_SIGMASK 6/* restore sig mask in do_signal() */ /* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 17/* OOM killer killed process */ #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
arch/ia64/include/asm/thread_info.h +0 -1
@@ -97,7 +97,6 @@ struct thread_info {#define TIF_SYSCALL_AUDIT 3/* syscall auditing active */ #define TIF_SINGLESTEP 4/* restore singlestep on return to user mode */ #define TIF_NOTIFY_RESUME 6/* resumption notification requested */ -#define TIF_MEMDIE 17/* is terminating due to OOM killer */ #define TIF_MCA_INIT 18/* this task is processing MCA or INIT */ #define TIF_DB_DISABLED 19/* debug trap disabled for fsyscall */ #define TIF_RESTORE_RSE 21/* user RBS is newer than kernel RBS */
arch/m32r/include/asm/thread_info.h +0 -1
@@ -102,7 +102,6 @@ static inline unsigned int get_thread_fault_code(void)#define TIF_NOTIFY_RESUME 5/* callback before returning to user */ #define TIF_RESTORE_SIGMASK 8/* restore signal mask in do_signal() */ #define TIF_USEDFPU 16/* FPU was used by this task this quantum (SMP) */ -#define TIF_MEMDIE 18/* is terminating due to OOM killer */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
arch/m68k/include/asm/thread_info.h +0 -1
@@ -68,7 +68,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_NEED_RESCHED 7/* rescheduling necessary */ #define TIF_DELAYED_TRACE 14/* single step a syscall */ #define TIF_SYSCALL_TRACE 15/* syscall trace active */ -#define TIF_MEMDIE 16/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 18/* restore signal mask in do_signal */ #endif /* _ASM_M68K_THREAD_INFO_H */
arch/metag/include/asm/thread_info.h +0 -1
@@ -111,7 +111,6 @@ static inline int kstack_end(void *addr)#define TIF_SECCOMP 5/* secure computing */ #define TIF_RESTORE_SIGMASK 6/* restore signal mask in do_signal() */ #define TIF_NOTIFY_RESUME 7/* callback before returning to user */ -#define TIF_MEMDIE 8/* is terminating due to OOM killer */ #define TIF_SYSCALL_TRACEPOINT 9/* syscall tracepoint instrumentation */
arch/microblaze/include/asm/thread_info.h +0 -1
@@ -113,7 +113,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_NEED_RESCHED 3/* rescheduling necessary */ /* restore singlestep on return to user mode */ #define TIF_SINGLESTEP 4 -#define TIF_MEMDIE 6/* is terminating due to OOM killer */ #define TIF_SYSCALL_AUDIT 9/* syscall auditing active */ #define TIF_SECCOMP 10/* secure computing */
arch/mips/include/asm/thread_info.h +0 -1
@@ -102,7 +102,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_UPROBE 6/* breakpointed or singlestepping */ #define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal() */ #define TIF_USEDFPU 16/* FPU was used by this task this quantum (SMP) */ -#define TIF_MEMDIE 18/* is terminating due to OOM killer */ #define TIF_NOHZ 19/* in adaptive nohz mode */ #define TIF_FIXADE 20/* Fix address errors in software */ #define TIF_LOGADE 21/* Log address errors to syslog */
arch/mn10300/include/asm/thread_info.h +0 -1
@@ -145,7 +145,6 @@ void arch_release_thread_stack(unsigned long *stack);#define TIF_SINGLESTEP 4/* restore singlestep on return to user mode */ #define TIF_RESTORE_SIGMASK 5/* restore signal mask in do_signal() */ #define TIF_POLLING_NRFLAG 16/* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 17/* is terminating due to OOM killer */ #define _TIF_SYSCALL_TRACE +(1 << TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME +(1 << TIF_NOTIFY_RESUME)
arch/nios2/include/asm/thread_info.h +0 -1
@@ -86,7 +86,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_NOTIFY_RESUME 1/* resumption notification requested */ #define TIF_SIGPENDING 2/* signal pending */ #define TIF_NEED_RESCHED 3/* rescheduling necessary */ -#define TIF_MEMDIE 4/* is terminating due to OOM killer */ #define TIF_SECCOMP 5/* secure computing */ #define TIF_SYSCALL_AUDIT 6/* syscall auditing active */ #define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal() */
arch/openrisc/include/asm/thread_info.h +0 -1
@@ -108,7 +108,6 @@ register struct thread_info *current_thread_info_reg asm("r10");#define TIF_RESTORE_SIGMASK 9#define TIF_POLLING_NRFLAG 16/* true if poll_idle() is polling * TIF_NEED_RESCHED */ -#define TIF_MEMDIE 17#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
arch/parisc/include/asm/thread_info.h +0 -1
@@ -48,7 +48,6 @@ struct thread_info {#define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_POLLING_NRFLAG 3/* true if poll_idle() is polling TIF_NEED_RESCHED */ #define TIF_32BIT 4/* 32 bit binary */ -#define TIF_MEMDIE 5/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 6/* restore saved signal mask */ #define TIF_SYSCALL_AUDIT 7/* syscall auditing active */ #define TIF_NOTIFY_RESUME 8/* callback before returning to user */
arch/powerpc/include/asm/thread_info.h +0 -1
@@ -99,7 +99,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_SYSCALL_TRACEPOINT 15/* syscall tracepoint instrumentation */ #define TIF_EMULATE_STACK_STORE 16/* Is an instruction emulation for stack store? */ -#define TIF_MEMDIE 17/* is terminating due to OOM killer */ #if defined(CONFIG_PPC64 )#define TIF_ELF2ABI 18/* function descriptors must die! */ #endif
arch/s390/include/asm/thread_info.h +0 -1
@@ -80,7 +80,6 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);#define TIF_SYSCALL_TRACEPOINT 6/* syscall tracepoint instrumentation */ #define TIF_UPROBE 7/* breakpointed or single-stepping */ #define TIF_31BIT 16/* 32bit process */ -#define TIF_MEMDIE 17/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 18/* restore signal mask in do_signal() */ #define TIF_SINGLE_STEP 19/* This task is single stepped */ #define TIF_BLOCK_STEP 20/* This task is block stepped */
arch/score/include/asm/thread_info.h +0 -1
@@ -78,7 +78,6 @@ register struct thread_info *__current_thread_info __asm__("r28");#define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_NOTIFY_RESUME 5/* callback before returning to user */ #define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal() */ -#define TIF_MEMDIE 18/* is terminating due to OOM killer */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
arch/sh/include/asm/thread_info.h +0 -1
@@ -117,7 +117,6 @@ extern void init_thread_xstate(void);#define TIF_NOTIFY_RESUME 7/* callback before returning to user */ #define TIF_SYSCALL_TRACEPOINT 8/* for ftrace syscall instrumentation */ #define TIF_POLLING_NRFLAG 17/* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 18/* is terminating due to OOM killer */ #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
arch/sparc/include/asm/thread_info_32.h +0 -1
@@ -110,7 +110,6 @@ register struct thread_info *current_thread_info_reg asm("g6");* this quantum (SMP) */ #define TIF_POLLING_NRFLAG 9/* true if poll_idle() is polling * TIF_NEED_RESCHED */ -#define TIF_MEMDIE 10/* is terminating due to OOM killer */ /* as above, but as bit values */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
arch/sparc/include/asm/thread_info_64.h +0 -1
@@ -191,7 +191,6 @@ register struct thread_info *current_thread_info_reg asm("g6");* an immediate value in instructions such as andcc. */ /* flag bit 12 is available */ -#define TIF_MEMDIE 13/* is terminating due to OOM killer */ #define TIF_POLLING_NRFLAG 14#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
arch/tile/include/asm/thread_info.h +0 -2
@@ -121,7 +121,6 @@ extern void _cpu_idle(void);#define TIF_SYSCALL_TRACE 4/* syscall trace active */ #define TIF_SYSCALL_AUDIT 5/* syscall auditing active */ #define TIF_SECCOMP 6/* secure computing */ -#define TIF_MEMDIE 7/* OOM killer at work */ #define TIF_NOTIFY_RESUME 8/* callback before returning to user */ #define TIF_SYSCALL_TRACEPOINT 9/* syscall tracepoint instrumentation */ #define TIF_POLLING_NRFLAG 10/* idle is polling for TIF_NEED_RESCHED */
@@ -134,7 +133,6 @@ extern void _cpu_idle(void);#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)#define _TIF_SECCOMP (1<<TIF_SECCOMP) -#define _TIF_MEMDIE (1<<TIF_MEMDIE)#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
arch/um/include/asm/thread_info.h +0 -2
@@ -58,7 +58,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_SIGPENDING 1/* signal pending */ #define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_RESTART_BLOCK 4 -#define TIF_MEMDIE 5/* is terminating due to OOM killer */ #define TIF_SYSCALL_AUDIT 6#define TIF_RESTORE_SIGMASK 7#define TIF_NOTIFY_RESUME 8
@@ -67,7 +66,6 @@ static inline struct thread_info *current_thread_info(void)#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) -#define _TIF_MEMDIE (1 << TIF_MEMDIE)#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)#define _TIF_SECCOMP (1 << TIF_SECCOMP)
arch/unicore32/include/asm/thread_info.h +0 -1
@@ -121,7 +121,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_NEED_RESCHED 1#define TIF_NOTIFY_RESUME 2/* callback before returning to user */ #define TIF_SYSCALL_TRACE 8 -#define TIF_MEMDIE 18#define TIF_RESTORE_SIGMASK 20#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
arch/x86/include/asm/thread_info.h +0 -1
@@ -97,7 +97,6 @@ struct thread_info {#define TIF_IA32 17/* IA32 compatibility process */ #define TIF_FORK 18/* ret_from_fork */ #define TIF_NOHZ 19/* in adaptive nohz mode */ -#define TIF_MEMDIE 20/* is terminating due to OOM killer */ #define TIF_POLLING_NRFLAG 21/* idle is polling for TIF_NEED_RESCHED */ #define TIF_IO_BITMAP 22/* uses I/O bitmap */ #define TIF_FORCED_TF 24/* true if TF in eflags artificially */
arch/xtensa/include/asm/thread_info.h +0 -1
@@ -108,7 +108,6 @@ static inline struct thread_info *current_thread_info(void)#define TIF_SIGPENDING 1/* signal pending */ #define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_SINGLESTEP 3/* restore singlestep on return to user mode */ -#define TIF_MEMDIE 5/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 6/* restore signal mask in do_signal() */ #define TIF_NOTIFY_RESUME 7/* callback before returning to user */ #define TIF_DB_DISABLED 8/* debug trap disabled for syscall */
Signature · 7 lines
2.9.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal Hocko
maintainerOn Tue 04-10-16 11:00:05, Michal Hocko wrote:
[...]
Quoted 13 lines
Recent changes in the oom proper allows for that finally, I believe. Now that all the oom victims are reapable we are no longer depending on
ALLOC_NO_WATERMARKSbecause the memory held by the victim is reclaimed asynchronously. A partial access to memory reserves should be sufficient just to guarantee that the oom victim is not starved due to other memory consumers. This also means that we do not have to pretend to be conservative and give access to memory reserves only to one thread from the process at the time. This is patch 1.Patch 2 is a simple cleanup which turns
TIF_MEMDIEusers totsk_is_oom_victimwhich is process rather than thread centric. None of those callers really requires to be thread aware AFAICS.
Quoted 8 lines
The tricky part then is
exit_oom_victimvs.oom_killer_disablebecauseTIF_MEMDIEacted as a token there so we had a way to count threads from the process. It didn't work 100% reliably and had its own issues but we have to replace it with something which doesn't rely on counting threads but rather find a moment when all threads have reached steady state indo_exit. This is what patch 3 does and I would really appreciate if Oleg could double check my thinking there. I am also CCing Al on that one because I am movingexit_io_contextup indo_exitright beforeexit_notify.
It became apparent that the last part was wrong after Oleg's review. I definitely want to come up with something that works eventually. I am just wondering whether patches 1-2 are worth accepting without the rest. I fully realize those patches are less attractive when TIF_MEMDIE stays but I would argue that reducing the TIF_MEMDIE users will make the code slightly better and easier to understand.
What do you think?
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>