BACKPORT: mm: update mark_victim tracepoints fields
The current implementation of the mark_victim tracepoint provides only the
process ID (pid) of the victim process. This limitation poses challenges
for userspace tools requiring real-time OOM analysis and intervention.
Although this information is available from the kernel logs, it’s not
the appropriate format to provide OOM notifications. In Android, BPF
programs are used with the mark_victim trace events to notify userspace of
an OOM kill. For consistency, update the trace event to include the same
information about the OOMed victim as the kernel logs.
- UID
In Android each installed application has a unique UID. Including
the `uid` assists in correlating OOM events with specific apps.
- Process Name (comm)
Enables identification of the affected process.
- OOM Score
Will allow userspace to get additional insight of the relative kill
priority of the OOM victim. In Android, the oom_score_adj is used to
categorize app state (foreground, background, etc.), which aids in
analyzing user-perceptible impacts of OOM events [1].
- Total VM, RSS Stats, and pgtables
Amount of memory used by the victim that will, potentially, be freed up
by killing it.
[1] 246dc8fc95
:frameworks/base/services/core/java/com/android/server/am/ProcessList.java;l=188-283
Signed-off-by: Carlos Galo <carlosgalo@google.com>
Reviewed-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Bug: 331214192
(cherry picked from commit 72ba14deb40a9e9668ec5e66a341ed657e5215c2)
[ carlosgalo: Manually added struct cred change in mark_oom_victim function ]
Link: https://lore.kernel.org/all/20240223173258.174828-1-carlosgalo@google.com/
Change-Id: I24f503ceca04b83f8abf42fcd04a3409e17be6b5
This commit is contained in:
parent
4571e647cc
commit
ecd8068fb4
@ -7,6 +7,8 @@
|
||||
#include <linux/tracepoint.h>
|
||||
#include <trace/events/mmflags.h>
|
||||
|
||||
#define PG_COUNT_TO_KB(x) ((x) << (PAGE_SHIFT - 10))
|
||||
|
||||
TRACE_EVENT(oom_score_adj_update,
|
||||
|
||||
TP_PROTO(struct task_struct *task),
|
||||
@ -72,19 +74,45 @@ TRACE_EVENT(reclaim_retry_zone,
|
||||
);
|
||||
|
||||
TRACE_EVENT(mark_victim,
|
||||
TP_PROTO(int pid),
|
||||
TP_PROTO(struct task_struct *task, uid_t uid),
|
||||
|
||||
TP_ARGS(pid),
|
||||
TP_ARGS(task, uid),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, pid)
|
||||
__string(comm, task->comm)
|
||||
__field(unsigned long, total_vm)
|
||||
__field(unsigned long, anon_rss)
|
||||
__field(unsigned long, file_rss)
|
||||
__field(unsigned long, shmem_rss)
|
||||
__field(uid_t, uid)
|
||||
__field(unsigned long, pgtables)
|
||||
__field(short, oom_score_adj)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->pid = pid;
|
||||
__entry->pid = task->pid;
|
||||
__assign_str(comm, task->comm);
|
||||
__entry->total_vm = PG_COUNT_TO_KB(task->mm->total_vm);
|
||||
__entry->anon_rss = PG_COUNT_TO_KB(get_mm_counter(task->mm, MM_ANONPAGES));
|
||||
__entry->file_rss = PG_COUNT_TO_KB(get_mm_counter(task->mm, MM_FILEPAGES));
|
||||
__entry->shmem_rss = PG_COUNT_TO_KB(get_mm_counter(task->mm, MM_SHMEMPAGES));
|
||||
__entry->uid = uid;
|
||||
__entry->pgtables = mm_pgtables_bytes(task->mm) >> 10;
|
||||
__entry->oom_score_adj = task->signal->oom_score_adj;
|
||||
),
|
||||
|
||||
TP_printk("pid=%d", __entry->pid)
|
||||
TP_printk("pid=%d comm=%s total-vm=%lukB anon-rss=%lukB file-rss:%lukB shmem-rss:%lukB uid=%u pgtables=%lukB oom_score_adj=%hd",
|
||||
__entry->pid,
|
||||
__get_str(comm),
|
||||
__entry->total_vm,
|
||||
__entry->anon_rss,
|
||||
__entry->file_rss,
|
||||
__entry->shmem_rss,
|
||||
__entry->uid,
|
||||
__entry->pgtables,
|
||||
__entry->oom_score_adj
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(wake_reaper,
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mmu_notifier.h>
|
||||
#include <linux/cred.h>
|
||||
|
||||
#include <asm/tlb.h>
|
||||
#include "internal.h"
|
||||
@ -751,6 +752,8 @@ static void __mark_oom_victim(struct task_struct *tsk)
|
||||
*/
|
||||
static void mark_oom_victim(struct task_struct *tsk)
|
||||
{
|
||||
const struct cred *cred;
|
||||
|
||||
WARN_ON(oom_killer_disabled);
|
||||
/* OOM killer might race with memcg OOM */
|
||||
if (test_and_set_tsk_thread_flag(tsk, TIF_MEMDIE))
|
||||
@ -767,7 +770,9 @@ static void mark_oom_victim(struct task_struct *tsk)
|
||||
*/
|
||||
__thaw_task(tsk);
|
||||
atomic_inc(&oom_victims);
|
||||
trace_mark_victim(tsk->pid);
|
||||
cred = get_task_cred(tsk);
|
||||
trace_mark_victim(tsk, cred->uid.val);
|
||||
put_cred(cred);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user