diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2012-01-10 18:08:09 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-10 19:30:44 -0500 |
commit | 43d2b113241d6797b890318767e0af78e313414b (patch) | |
tree | 6f25647f2660f8fca63cc8355b70ad643993dab8 /mm | |
parent | 6bd4837de96e7d9f9bf33e59117c24fc230862ac (diff) |
tracepoint: add tracepoints for debugging oom_score_adj
oom_score_adj is used for guarding processes from OOM-Killer. One of
problem is that it's inherited at fork(). When a daemon set oom_score_adj
and make children, it's hard to know where the value is set.
This patch adds some tracepoints useful for debugging. This patch adds
3 trace points.
- creating new task
- renaming a task (exec)
- set oom_score_adj
To debug, users need to enable some trace pointer. Maybe filtering is useful as
# EVENT=/sys/kernel/debug/tracing/events/task/
# echo "oom_score_adj != 0" > $EVENT/task_newtask/filter
# echo "oom_score_adj != 0" > $EVENT/task_rename/filter
# echo 1 > $EVENT/enable
# EVENT=/sys/kernel/debug/tracing/events/oom/
# echo 1 > $EVENT/enable
output will be like this.
# grep oom /sys/kernel/debug/tracing/trace
bash-7699 [007] d..3 5140.744510: oom_score_adj_update: pid=7699 comm=bash oom_score_adj=-1000
bash-7699 [007] ...1 5151.818022: task_newtask: pid=7729 comm=bash clone_flags=1200011 oom_score_adj=-1000
ls-7729 [003] ...2 5151.818504: task_rename: pid=7729 oldcomm=bash newcomm=ls oom_score_adj=-1000
bash-7699 [002] ...1 5175.701468: task_newtask: pid=7730 comm=bash clone_flags=1200011 oom_score_adj=-1000
grep-7730 [007] ...2 5175.701993: task_rename: pid=7730 oldcomm=bash newcomm=grep oom_score_adj=-1000
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Acked-by: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/oom_kill.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index eeb27e27dce3..7c122faa05c5 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -33,6 +33,10 @@ | |||
33 | #include <linux/security.h> | 33 | #include <linux/security.h> |
34 | #include <linux/ptrace.h> | 34 | #include <linux/ptrace.h> |
35 | #include <linux/freezer.h> | 35 | #include <linux/freezer.h> |
36 | #include <linux/ftrace.h> | ||
37 | |||
38 | #define CREATE_TRACE_POINTS | ||
39 | #include <trace/events/oom.h> | ||
36 | 40 | ||
37 | int sysctl_panic_on_oom; | 41 | int sysctl_panic_on_oom; |
38 | int sysctl_oom_kill_allocating_task; | 42 | int sysctl_oom_kill_allocating_task; |
@@ -55,6 +59,7 @@ void compare_swap_oom_score_adj(int old_val, int new_val) | |||
55 | spin_lock_irq(&sighand->siglock); | 59 | spin_lock_irq(&sighand->siglock); |
56 | if (current->signal->oom_score_adj == old_val) | 60 | if (current->signal->oom_score_adj == old_val) |
57 | current->signal->oom_score_adj = new_val; | 61 | current->signal->oom_score_adj = new_val; |
62 | trace_oom_score_adj_update(current); | ||
58 | spin_unlock_irq(&sighand->siglock); | 63 | spin_unlock_irq(&sighand->siglock); |
59 | } | 64 | } |
60 | 65 | ||
@@ -74,6 +79,7 @@ int test_set_oom_score_adj(int new_val) | |||
74 | spin_lock_irq(&sighand->siglock); | 79 | spin_lock_irq(&sighand->siglock); |
75 | old_val = current->signal->oom_score_adj; | 80 | old_val = current->signal->oom_score_adj; |
76 | current->signal->oom_score_adj = new_val; | 81 | current->signal->oom_score_adj = new_val; |
82 | trace_oom_score_adj_update(current); | ||
77 | spin_unlock_irq(&sighand->siglock); | 83 | spin_unlock_irq(&sighand->siglock); |
78 | 84 | ||
79 | return old_val; | 85 | return old_val; |