mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-21 15:48:56 +07:00
422580c3ce
During the debugging of the problem described in https://lkml.org/lkml/2017/5/17/542 and fixed by Tetsuo Handa in https://lkml.org/lkml/2017/5/19/383 , I've found that the existing debug output is not really useful to understand issues related to the oom reaper. So, I assume, that adding some tracepoints might help with debugging of similar issues. 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. How it works in practice? Below is an example which show how the problem mentioned above can be found: one process is added twice to the oom_reaper list: $ cd /sys/kernel/debug/tracing $ echo "oom:mark_victim" > set_event $ echo "oom:wake_reaper" >> set_event $ echo "oom:skip_task_reaping" >> set_event $ echo "oom:start_task_reaping" >> set_event $ echo "oom:finish_task_reaping" >> set_event $ cat trace_pipe allocate-502 [001] .... 91.836405: mark_victim: pid=502 allocate-502 [001] .N.. 91.837356: wake_reaper: pid=502 allocate-502 [000] .N.. 91.871149: wake_reaper: pid=502 oom_reaper-23 [000] .... 91.871177: start_task_reaping: pid=502 oom_reaper-23 [000] .N.. 91.879511: finish_task_reaping: pid=502 oom_reaper-23 [000] .... 91.879580: skip_task_reaping: pid=502 Link: http://lkml.kernel.org/r/20170530185231.GA13412@castle Signed-off-by: Roman Gushchin <guro@fb.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Vladimir Davydov <vdavydov.dev@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
195 lines
3.8 KiB
C
195 lines
3.8 KiB
C
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM oom
|
|
|
|
#if !defined(_TRACE_OOM_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_OOM_H
|
|
#include <linux/tracepoint.h>
|
|
#include <trace/events/mmflags.h>
|
|
|
|
TRACE_EVENT(oom_score_adj_update,
|
|
|
|
TP_PROTO(struct task_struct *task),
|
|
|
|
TP_ARGS(task),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( pid_t, pid)
|
|
__array( char, comm, TASK_COMM_LEN )
|
|
__field( short, oom_score_adj)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->pid = task->pid;
|
|
memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
|
|
__entry->oom_score_adj = task->signal->oom_score_adj;
|
|
),
|
|
|
|
TP_printk("pid=%d comm=%s oom_score_adj=%hd",
|
|
__entry->pid, __entry->comm, __entry->oom_score_adj)
|
|
);
|
|
|
|
TRACE_EVENT(reclaim_retry_zone,
|
|
|
|
TP_PROTO(struct zoneref *zoneref,
|
|
int order,
|
|
unsigned long reclaimable,
|
|
unsigned long available,
|
|
unsigned long min_wmark,
|
|
int no_progress_loops,
|
|
bool wmark_check),
|
|
|
|
TP_ARGS(zoneref, order, reclaimable, available, min_wmark, no_progress_loops, wmark_check),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( int, node)
|
|
__field( int, zone_idx)
|
|
__field( int, order)
|
|
__field( unsigned long, reclaimable)
|
|
__field( unsigned long, available)
|
|
__field( unsigned long, min_wmark)
|
|
__field( int, no_progress_loops)
|
|
__field( bool, wmark_check)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->node = zone_to_nid(zoneref->zone);
|
|
__entry->zone_idx = zoneref->zone_idx;
|
|
__entry->order = order;
|
|
__entry->reclaimable = reclaimable;
|
|
__entry->available = available;
|
|
__entry->min_wmark = min_wmark;
|
|
__entry->no_progress_loops = no_progress_loops;
|
|
__entry->wmark_check = wmark_check;
|
|
),
|
|
|
|
TP_printk("node=%d zone=%-8s order=%d reclaimable=%lu available=%lu min_wmark=%lu no_progress_loops=%d wmark_check=%d",
|
|
__entry->node, __print_symbolic(__entry->zone_idx, ZONE_TYPE),
|
|
__entry->order,
|
|
__entry->reclaimable, __entry->available, __entry->min_wmark,
|
|
__entry->no_progress_loops,
|
|
__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,
|
|
|
|
TP_PROTO(int order,
|
|
enum compact_priority priority,
|
|
enum compact_result result,
|
|
int retries,
|
|
int max_retries,
|
|
bool ret),
|
|
|
|
TP_ARGS(order, priority, result, retries, max_retries, ret),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( int, order)
|
|
__field( int, priority)
|
|
__field( int, result)
|
|
__field( int, retries)
|
|
__field( int, max_retries)
|
|
__field( bool, ret)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->order = order;
|
|
__entry->priority = priority;
|
|
__entry->result = compact_result_to_feedback(result);
|
|
__entry->retries = retries;
|
|
__entry->max_retries = max_retries;
|
|
__entry->ret = ret;
|
|
),
|
|
|
|
TP_printk("order=%d priority=%s compaction_result=%s retries=%d max_retries=%d should_retry=%d",
|
|
__entry->order,
|
|
__print_symbolic(__entry->priority, COMPACTION_PRIORITY),
|
|
__print_symbolic(__entry->result, COMPACTION_FEEDBACK),
|
|
__entry->retries, __entry->max_retries,
|
|
__entry->ret)
|
|
);
|
|
#endif /* CONFIG_COMPACTION */
|
|
#endif
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|