Skip to content

Commit ec1ba65

Browse files
Avoid taskstats_exit and sched_process_exit (#232)
taskstats_exit can be compiled out based on kernel configuration. Instead use disassociate_ctty(1) (CONFIG_TTY, hopefully less likely to be compiled out) as an indication that group_dead has been set. sched_process_exit is called before exit_files, so it's possible that a socket disconnect event could be emitted after a process termination. And, disassociate_ctty is called after. Remove group_dead tracking.
1 parent 497c829 commit ec1ba65

File tree

3 files changed

+20
-26
lines changed

3 files changed

+20
-26
lines changed

GPL/Events/Process/Probe.bpf.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -195,24 +195,20 @@ int BPF_PROG(sched_process_exec,
195195
// The problem is taskstats_exit__enter happens before file descriptors are
196196
// closed in exit_files(), so instead of emiting the event here, record that we
197197
// saw group_dead and delay emiting the event until sched_process_exit().
198-
static int taskstats_exit__enter(const struct task_struct *task, int group_dead)
199-
{
200-
struct ebpf_events_state state = {};
201-
202-
if (!group_dead || is_kernel_thread(task))
203-
return 0;
204-
205-
ebpf_events_state__set(EBPF_EVENTS_STATE_GROUP_DEAD, &state);
206-
207-
return 0;
208-
}
209-
210-
SEC("tp_btf/sched_process_exit")
211-
int BPF_PROG(sched_process_exit, const struct task_struct *task)
198+
//
199+
// UPDATE: taskstats_exit can be compiled out of the kernel based on
200+
// configuration. So, instead we use disassociate_ctty (guarded by CONFIG_TTY),
201+
// which is hopefully less common of being compiled out. disassociate_ctty is
202+
// called from do_exit() only when group_dead is true, and in that case,
203+
// the parameter, on_exit, is set to true, and we can use current to populate
204+
// event data. Finally, sched_process_exit() is not called after exit_files,
205+
// but disassociate_ctty is.
206+
static int disassociate_ctty__enter(int on_exit)
212207
{
208+
const struct task_struct *task = (struct task_struct *)bpf_get_current_task();
213209
struct ebpf_process_exit_event *event;
214210

215-
if (ebpf_events_state__get(EBPF_EVENTS_STATE_GROUP_DEAD) == NULL)
211+
if (!on_exit || is_kernel_thread(task))
216212
return 0;
217213

218214
event = get_event_buffer();
@@ -247,16 +243,16 @@ int BPF_PROG(sched_process_exit, const struct task_struct *task)
247243
return 0;
248244
}
249245

250-
SEC("fentry/taskstats_exit")
251-
int BPF_PROG(fentry__taskstats_exit, const struct task_struct *task, int group_dead)
246+
SEC("fentry/disassociate_ctty")
247+
int BPF_PROG(fentry__disassociate_ctty, int on_exit)
252248
{
253-
return taskstats_exit__enter(task, group_dead);
249+
return disassociate_ctty__enter(on_exit);
254250
}
255251

256-
SEC("kprobe/taskstats_exit")
257-
int BPF_KPROBE(kprobe__taskstats_exit, const struct task_struct *task, int group_dead)
252+
SEC("kprobe/disassociate_ctty")
253+
int BPF_KPROBE(kprobe__disassociate_ctty, int on_exit)
258254
{
259-
return taskstats_exit__enter(task, group_dead);
255+
return disassociate_ctty__enter(on_exit);
260256
}
261257

262258
// tracepoint/syscalls/sys_[enter/exit]_[name] tracepoints are not available

GPL/Events/State.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ enum ebpf_events_state_op {
2121
EBPF_EVENTS_STATE_WRITE = 7,
2222
EBPF_EVENTS_STATE_WRITEV = 8,
2323
EBPF_EVENTS_STATE_CHOWN = 9,
24-
EBPF_EVENTS_STATE_GROUP_DEAD = 10,
2524
};
2625

2726
struct ebpf_events_key {
@@ -92,7 +91,6 @@ struct ebpf_events_state {
9291
struct ebpf_events_write_state write;
9392
struct ebpf_events_writev_state writev;
9493
struct ebpf_events_chown_state chown;
95-
/* struct ebpf_events_group_dead group_dead; nada */
9694
};
9795
};
9896

non-GPL/Events/Lib/EbpfEvents.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ static int probe_set_autoload(struct btf *btf, struct EventProbe_bpf *obj, uint6
381381
err = err ?: bpf_program__set_autoload(obj->progs.kretprobe__do_filp_open, false);
382382
err = err ?: bpf_program__set_autoload(obj->progs.kprobe__vfs_rename, false);
383383
err = err ?: bpf_program__set_autoload(obj->progs.kretprobe__vfs_rename, false);
384-
err = err ?: bpf_program__set_autoload(obj->progs.kprobe__taskstats_exit, false);
384+
err = err ?: bpf_program__set_autoload(obj->progs.kprobe__disassociate_ctty, false);
385385
err = err ?: bpf_program__set_autoload(obj->progs.kprobe__commit_creds, false);
386386
err = err ?: bpf_program__set_autoload(obj->progs.kretprobe__inet_csk_accept, false);
387387
err = err ?: bpf_program__set_autoload(obj->progs.kprobe__tcp_v4_connect, false);
@@ -403,7 +403,7 @@ static int probe_set_autoload(struct btf *btf, struct EventProbe_bpf *obj, uint6
403403
err = err ?: bpf_program__set_autoload(obj->progs.fexit__do_filp_open, false);
404404
err = err ?: bpf_program__set_autoload(obj->progs.fentry__vfs_rename, false);
405405
err = err ?: bpf_program__set_autoload(obj->progs.fexit__vfs_rename, false);
406-
err = err ?: bpf_program__set_autoload(obj->progs.fentry__taskstats_exit, false);
406+
err = err ?: bpf_program__set_autoload(obj->progs.fentry__disassociate_ctty, false);
407407
err = err ?: bpf_program__set_autoload(obj->progs.fentry__commit_creds, false);
408408
err = err ?: bpf_program__set_autoload(obj->progs.fexit__inet_csk_accept, false);
409409
err = err ?: bpf_program__set_autoload(obj->progs.fexit__tcp_v4_connect, false);
@@ -473,7 +473,7 @@ static bool system_has_bpf_tramp(void)
473473
{.code = BPF_EXIT | BPF_JMP, .dst_reg = 0, .src_reg = 0, .off = 0, .imm = 0}};
474474
int insns_cnt = 2;
475475

476-
btf_id = btf__find_by_name(btf, "taskstats_exit");
476+
btf_id = btf__find_by_name(btf, "disassociate_ctty");
477477
LIBBPF_OPTS(bpf_prog_load_opts, opts, .log_buf = NULL, .log_level = 0,
478478
.expected_attach_type = BPF_TRACE_FENTRY, .attach_btf_id = btf_id);
479479
prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACING, NULL, "GPL", insns, insns_cnt, &opts);

0 commit comments

Comments
 (0)