From 347676ff71ae876b3b921c103139dda0cc13e5b2 Mon Sep 17 00:00:00 2001 From: Stephen Curry Date: Sat, 5 Jul 2025 16:37:14 +0800 Subject: [PATCH] osprobe strcase match acl_thread --- systrace/src/os/bpf_comm.h | 40 +++++++++++++++++++++++++----------- systrace/src/os/os_cpu.bpf.c | 4 +++- systrace/src/os/os_mem.bpf.c | 24 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/systrace/src/os/bpf_comm.h b/systrace/src/os/bpf_comm.h index 3b96012..90b1a58 100644 --- a/systrace/src/os/bpf_comm.h +++ b/systrace/src/os/bpf_comm.h @@ -151,6 +151,7 @@ struct { __uint(max_entries, 128); } proc_filter_map SEC(".maps"); +#define MAX_COMM_LEN 16 static __always_inline void emit_event(trace_event_data_t *event, void *ctx) { if (!event) { @@ -201,23 +202,38 @@ static __always_inline void create_cur_event(trace_event_data_t *cur_event, int cur_event->rank = rank; } -static int strcase_match(const char *s1, const char *s2) +static int strcase_match(const char *s1, const char *s2, int n) { - while (*s1 && *s2) { - char c1 = *s1; - char c2 = *s2; + unsigned char c1, c2; +#pragma unroll + while (n--) { + c1 = *s1++; + c2 = *s2++; - if (c1 >= 'A' && c1 <= 'Z') - c1 += 'a' - 'A'; + if (!c1 || !c2) + break; - if (c1 != c2) - return 0; + // 转换为小写进行比较 + if (c1 == c2) + continue; + + if ((c1 >= 'A' && c1 <= 'Z') && (c2 >= 'a' && c2 <= 'z') && (c1 + 32 == c2)) + continue; + + if ((c2 >= 'A' && c2 <= 'Z') && (c1 >= 'a' && c1 <= 'z') && (c2 + 32 == c1)) + continue; - s1++; - s2++; + // 不相等 + return (int)c1 - (int)c2; + } + + if (n == (size_t)-1) { /* 如果循环是因为n用完而不是遇到\0 */ + // 检查最后一个字符是否都为 '\0' + if (!c1 && !c2) + return 0; } - return (*s1 == '\0' && *s2 == '\0'); + return (int)c1 - (int)c2; } static __always_inline int get_npu_id(struct task_struct *task) @@ -243,7 +259,7 @@ static __always_inline int get_npu_id(struct task_struct *task) // 匹配ACL线程 const char target[] = "acl_thread"; - if (strcase_match(comm, target)) { + if (strcase_match(comm, target, MAX_COMM_LEN)) { u32 tgid = BPF_CORE_READ(task, tgid); rank = bpf_map_lookup_elem(&proc_filter_map, &tgid); if (rank) { diff --git a/systrace/src/os/os_cpu.bpf.c b/systrace/src/os/os_cpu.bpf.c index c900808..f6d12fe 100644 --- a/systrace/src/os/os_cpu.bpf.c +++ b/systrace/src/os/os_cpu.bpf.c @@ -110,7 +110,9 @@ KRAWTRACE(sched_switch, bpf_raw_tracepoint_args) { struct task_struct *prev = (struct task_struct *)ctx->args[1]; struct task_struct *current = (struct task_struct *)ctx->args[2]; - + if (current == NULL || prev == NULL) { + return 0; + } process_offcpu(prev, current, (void *)ctx); process_oncpu(current, (void *)ctx); diff --git a/systrace/src/os/os_mem.bpf.c b/systrace/src/os/os_mem.bpf.c index 69140cc..a15871a 100644 --- a/systrace/src/os/os_mem.bpf.c +++ b/systrace/src/os/os_mem.bpf.c @@ -138,6 +138,9 @@ static __always_inline int common_event_end(struct task_struct *task, void *ctx, KPROBE(handle_mm_fault, pt_regs) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } fault_event_start(task, EVENT_TYPE_MM_FAULT); return 0; @@ -146,6 +149,9 @@ KPROBE(handle_mm_fault, pt_regs) KRETPROBE(handle_mm_fault, pt_regs) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } fault_event_end(task, ctx, EVENT_TYPE_MM_FAULT); return 0; @@ -154,6 +160,9 @@ KRETPROBE(handle_mm_fault, pt_regs) KPROBE(do_swap_page, pt_regs) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } common_event_start(task, EVENT_TYPE_SWAP_PAGE); return 0; } @@ -161,6 +170,9 @@ KPROBE(do_swap_page, pt_regs) KRETPROBE(do_swap_page, pt_regs) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } common_event_end(task, ctx, EVENT_TYPE_SWAP_PAGE); return 0; } @@ -168,6 +180,9 @@ KRETPROBE(do_swap_page, pt_regs) KRAWTRACE(mm_compaction_begin, bpf_raw_tracepoint_args) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } common_event_start(task, EVENT_TYPE_COMPACTION); return 0; } @@ -175,6 +190,9 @@ KRAWTRACE(mm_compaction_begin, bpf_raw_tracepoint_args) KRAWTRACE(mm_compaction_end, bpf_raw_tracepoint_args) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } common_event_end(task, ctx, EVENT_TYPE_COMPACTION); return 0; } @@ -182,6 +200,9 @@ KRAWTRACE(mm_compaction_end, bpf_raw_tracepoint_args) KRAWTRACE(mm_vmscan_direct_reclaim_begin, bpf_raw_tracepoint_args) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } common_event_start(task, EVENT_TYPE_VMSCAN); return 0; } @@ -189,6 +210,9 @@ KRAWTRACE(mm_vmscan_direct_reclaim_begin, bpf_raw_tracepoint_args) KRAWTRACE(mm_vmscan_direct_reclaim_end, bpf_raw_tracepoint_args) { struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + if (task == NULL) { + return 0; + } common_event_end(task, ctx, EVENT_TYPE_VMSCAN); return 0; } -- Gitee