This patch will add a erase_sample.c as a data erase reference. It will erase all tasks & threads's comm[] member within their task_struct, as a result, you will see the ps info outputted by crash utility similiar as follows:
crash> ps ... 1 0 10 ffff96b7c0980000 IN 0.0 25504 15704 XXXXXXXXXXXXXXX 2 0 15 ffff96b7c0982f40 IN 0.0 0 0 [XXXXXXXXXXXXXXX] 3 2 2 ffff96b7c09a0000 IN 0.0 0 0 [XXXXXXXXXXXXXXX] 4 2 0 ffff96b7c09a2f40 ID 0.0 0 0 [XXXXXXXXXXXXXXX] 5 2 0 ffff96b7c09a8000 ID 0.0 0 0 [XXXXXXXXXXXXXXX] The comm[] erasure doesn't cause critical info loss and has slight impact on vmcore analyze, so it is safe to take it as an example for developers. Signed-off-by: Tao Liu <[email protected]> --- extensions/Makefile | 2 +- extensions/erase_sample.c | 78 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 extensions/erase_sample.c diff --git a/extensions/Makefile b/extensions/Makefile index dbaec4e..c112d56 100644 --- a/extensions/Makefile +++ b/extensions/Makefile @@ -1,5 +1,5 @@ CC ?= gcc -CONTRIB_SO := sample.so +CONTRIB_SO := sample.so erase_sample.so all: $(CONTRIB_SO) diff --git a/extensions/erase_sample.c b/extensions/erase_sample.c new file mode 100644 index 0000000..7c935d1 --- /dev/null +++ b/extensions/erase_sample.c @@ -0,0 +1,78 @@ +#include <stdio.h> +#include <stdlib.h> +#include "../makedumpfile.h" +#include "../btf_info.h" +#include "../kallsyms.h" +#include "../extension.h" +#include "../erase_info.h" + +INIT_MOD_STRUCT_MEMBER(vmlinux, task_struct, tasks); +INIT_MOD_STRUCT_MEMBER(vmlinux, task_struct, thread_node); +INIT_MOD_STRUCT_MEMBER(vmlinux, task_struct, signal); +INIT_MOD_STRUCT_MEMBER(vmlinux, signal_struct, thread_head); +INIT_MOD_STRUCT_MEMBER(vmlinux, task_struct, comm); +INIT_MOD_SYM(vmlinux, init_task); + +#define MOD_MEMBER_OFF(MOD, S, M) \ + GET_MOD_STRUCT_MEMBER_MOFF(MOD, S, M) / 8 +#define KERN_MEMBER_OFF(S, M) MOD_MEMBER_OFF(vmlinux, S, M) +#define GET_KERN_STRUCT_MEMBER_MSIZE(S, M) \ + GET_MOD_STRUCT_MEMBER_MSIZE(vmlinux, S, M) +#define GET_KERN_SYM(SYM) GET_MOD_SYM(vmlinux, SYM) + +/* task_struct.comm eraser */ +static bool erase_task_struct_comm(void) +{ + uint64_t task_list, init_task, comm, signal, thread_head, thread_list; + uint32_t size; + + init_task = GET_KERN_SYM(init_task); + size = GET_KERN_STRUCT_MEMBER_MSIZE(task_struct, comm); + task_list = init_task + KERN_MEMBER_OFF(task_struct, tasks); + + /* Iterate all tasks */ + do { + thread_list = task_list - KERN_MEMBER_OFF(task_struct, tasks) + + KERN_MEMBER_OFF(task_struct, thread_node); + if (!readmem(VADDR, task_list - KERN_MEMBER_OFF(task_struct, tasks) + + KERN_MEMBER_OFF(task_struct, signal), &signal, sizeof(uint64_t))) { + ERRMSG("Can't get task_struct member signal!\n"); + goto out; + } + thread_head = signal + KERN_MEMBER_OFF(signal_struct, thread_head); + + /* Iterate all threads of the task */ + do { + comm = thread_list - KERN_MEMBER_OFF(task_struct, thread_node) + + KERN_MEMBER_OFF(task_struct, comm); + + if (!update_filter_info_raw(comm, 'X', size)) { + ERRMSG("Failed update filter info!\n"); + goto out; + } + + thread_list = next_list(thread_list); + } while (thread_list != thread_head); + + task_list = next_list(task_list); + } while (task_list != init_task + KERN_MEMBER_OFF(task_struct, tasks)); + + return true; +out: + return false; +} + +void extension_init(void) +{ + if (!erase_task_struct_comm()) { + ERRMSG("erase_sample.so: erase fail!\n"); + goto out; + } + MSG("erase_sample.so: erase success!\n"); +out: + return; +} + +__attribute__((destructor)) +void extension_cleanup(void) { } + -- 2.54.0
