Add tracepoints to simplify the debugging of the oom reaper code.

Trace the following events:
1) a process is marked as an oom victim,
2) a process is added to the oom reaper list,
3) the oom reaper starts reaping process's mm,
4) the oom reaper finished reaping,
5) the oom reaper skips reaping.

Signed-off-by: Roman Gushchin <[email protected]>
Cc: Michal Hocko <[email protected]>
Cc: Tetsuo Handa <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Vladimir Davydov <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
 include/trace/events/oom.h | 80 ++++++++++++++++++++++++++++++++++++++++++++++
 mm/oom_kill.c              |  7 ++++
 2 files changed, 87 insertions(+)

diff --git a/include/trace/events/oom.h b/include/trace/events/oom.h
index 38baeb2..c3c19d4 100644
--- a/include/trace/events/oom.h
+++ b/include/trace/events/oom.h
@@ -70,6 +70,86 @@ TRACE_EVENT(reclaim_retry_zone,
                        __entry->wmark_check)
 );
 
+TRACE_EVENT(mark_victim,
+       TP_PROTO(int pid),
+
+       TP_ARGS(pid),
+
+       TP_STRUCT__entry(
+               __field(int, pid)
+       ),
+
+       TP_fast_assign(
+               __entry->pid = pid;
+       ),
+
+       TP_printk("pid=%d", __entry->pid)
+);
+
+TRACE_EVENT(wake_reaper,
+       TP_PROTO(int pid),
+
+       TP_ARGS(pid),
+
+       TP_STRUCT__entry(
+               __field(int, pid)
+       ),
+
+       TP_fast_assign(
+               __entry->pid = pid;
+       ),
+
+       TP_printk("pid=%d", __entry->pid)
+);
+
+TRACE_EVENT(start_task_reaping,
+       TP_PROTO(int pid),
+
+       TP_ARGS(pid),
+
+       TP_STRUCT__entry(
+               __field(int, pid)
+       ),
+
+       TP_fast_assign(
+               __entry->pid = pid;
+       ),
+
+       TP_printk("pid=%d", __entry->pid)
+);
+
+TRACE_EVENT(finish_task_reaping,
+       TP_PROTO(int pid),
+
+       TP_ARGS(pid),
+
+       TP_STRUCT__entry(
+               __field(int, pid)
+       ),
+
+       TP_fast_assign(
+               __entry->pid = pid;
+       ),
+
+       TP_printk("pid=%d", __entry->pid)
+);
+
+TRACE_EVENT(skip_task_reaping,
+       TP_PROTO(int pid),
+
+       TP_ARGS(pid),
+
+       TP_STRUCT__entry(
+               __field(int, pid)
+       ),
+
+       TP_fast_assign(
+               __entry->pid = pid;
+       ),
+
+       TP_printk("pid=%d", __entry->pid)
+);
+
 #ifdef CONFIG_COMPACTION
 TRACE_EVENT(compact_retry,
 
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 04c9143..409b685 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -490,6 +490,7 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, 
struct mm_struct *mm)
 
        if (!down_read_trylock(&mm->mmap_sem)) {
                ret = false;
+               trace_skip_task_reaping(tsk->pid);
                goto unlock_oom;
        }
 
@@ -500,9 +501,12 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, 
struct mm_struct *mm)
         */
        if (!mmget_not_zero(mm)) {
                up_read(&mm->mmap_sem);
+               trace_skip_task_reaping(tsk->pid);
                goto unlock_oom;
        }
 
+       trace_start_task_reaping(tsk->pid);
+
        /*
         * Tell all users of get_user/copy_from_user etc... that the content
         * is no longer stable. No barriers really needed because unmapping
@@ -544,6 +548,7 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, 
struct mm_struct *mm)
         * put the oom_reaper out of the way.
         */
        mmput_async(mm);
+       trace_finish_task_reaping(tsk->pid);
 unlock_oom:
        mutex_unlock(&oom_lock);
        return ret;
@@ -615,6 +620,7 @@ static void wake_oom_reaper(struct task_struct *tsk)
        tsk->oom_reaper_list = oom_reaper_list;
        oom_reaper_list = tsk;
        spin_unlock(&oom_reaper_lock);
+       trace_wake_reaper(tsk->pid);
        wake_up(&oom_reaper_wait);
 }
 
@@ -666,6 +672,7 @@ static void mark_oom_victim(struct task_struct *tsk)
         */
        __thaw_task(tsk);
        atomic_inc(&oom_victims);
+       trace_mark_victim(tsk->pid);
 }
 
 /**
-- 
2.7.4

Reply via email to