From 1e50c6ecc4b90274ed65c441dc0ed86ee636f8ee Mon Sep 17 00:00:00 2001 From: Carlos Galo Date: Wed, 10 Jul 2024 20:06:12 +0000 Subject: [PATCH] Report up-to-date RSS in LMK_PROCKILL cmd Add RSS field, in LMK_PROCKILL cmd, to report the latest memory usage of the killed process. Test: Verified RSS field is captured in ApplicationExitInfo Bug: 322549716 Change-Id: Ic1788e8121da97cd879bd7e9d685c7b879ea5475 Signed-off-by: Carlos Galo --- include/lmkd.h | 7 +++++-- lmkd.cpp | 12 +++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/lmkd.h b/include/lmkd.h index 7922d8c..54c6a08 100644 --- a/include/lmkd.h +++ b/include/lmkd.h @@ -245,11 +245,14 @@ static inline size_t lmkd_pack_set_subscribe(LMKD_CTRL_PACKET packet, enum async * Prepare LMK_PROCKILL unsolicited packet and return packet size in bytes. * Warning: no checks performed, caller should ensure valid parameters. */ -static inline size_t lmkd_pack_set_prockills(LMKD_CTRL_PACKET packet, pid_t pid, uid_t uid) { +static inline size_t lmkd_pack_set_prockills(LMKD_CTRL_PACKET packet, pid_t pid, uid_t uid, + int rss_kb) { packet[0] = htonl(LMK_PROCKILL); packet[1] = htonl(pid); packet[2] = htonl(uid); - return 3 * sizeof(int); + packet[3] = htonl(rss_kb); + + return 4 * sizeof(int); } /* diff --git a/lmkd.cpp b/lmkd.cpp index 852b95f..f837ff3 100644 --- a/lmkd.cpp +++ b/lmkd.cpp @@ -807,9 +807,9 @@ static int ctrl_data_write(int dsock_idx, char* buf, size_t bufsz) { * Write the pid/uid pair over the data socket, note: all active clients * will receive this unsolicited notification. */ -static void ctrl_data_write_lmk_kill_occurred(pid_t pid, uid_t uid) { +static void ctrl_data_write_lmk_kill_occurred(pid_t pid, uid_t uid, int64_t rss_kb) { LMKD_CTRL_PACKET packet; - size_t len = lmkd_pack_set_prockills(packet, pid, uid); + size_t len = lmkd_pack_set_prockills(packet, pid, uid, static_cast(rss_kb)); for (int i = 0; i < MAX_DATA_CONN; i++) { if (data_sock[i].sock >= 0 && data_sock[i].async_event_mask & 1 << LMK_ASYNC_EVENT_KILL) { @@ -866,6 +866,7 @@ static void poll_kernel(int poll_fd) { int16_t min_score_adj; int64_t starttime; char* taskname = 0; + int64_t rss_kb; int fields_read = sscanf(rd_buf, @@ -876,9 +877,10 @@ static void poll_kernel(int poll_fd) { /* only the death of the group leader process is logged */ if (fields_read == 10 && group_leader_pid == pid) { - ctrl_data_write_lmk_kill_occurred((pid_t)pid, (uid_t)uid); - mem_st.process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK)); mem_st.rss_in_bytes = rss_in_pages * pagesize; + rss_kb = mem_st.rss_in_bytes >> 10; + ctrl_data_write_lmk_kill_occurred((pid_t)pid, (uid_t)uid, rss_kb); + mem_st.process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK)); struct kill_stat kill_st = { .uid = static_cast(uid), @@ -2682,7 +2684,7 @@ static int kill_one_process(struct proc* procp, int min_oom_score, struct kill_i kill_st.free_swap_kb = get_free_swap(mi) * page_k; stats_write_lmk_kill_occurred(&kill_st, mem_st); - ctrl_data_write_lmk_kill_occurred((pid_t)pid, uid); + ctrl_data_write_lmk_kill_occurred((pid_t)pid, uid, rss_kb); result = rss_kb / page_k;