Compile tested, 1-5 need the review from bpf maintainers, quite possibly I did some silly mistakes. I tried to cleanup this code because I could not look at it, but it has other problems and imo should be rewritten. 6/6 obviously depends on [PATCH 1/2] introduce __next_thread(), fix next_tid() vs exec() race https://lore.kernel.org/all/20230824143142.GA31222@xxxxxxxxxx/ which was not merged yet. To simplify the review, this is the code after 6/6: static struct task_struct *task_group_seq_get_next(struct bpf_iter_seq_task_common *common, u32 *tid, bool skip_if_dup_files) { struct task_struct *task; struct pid *pid; u32 next_tid; if (!*tid) { /* The first time, the iterator calls this function. */ pid = find_pid_ns(common->pid, common->ns); task = get_pid_task(pid, PIDTYPE_TGID); if (!task) return NULL; *tid = common->pid; common->pid_visiting = common->pid; return task; } /* If the control returns to user space and comes back to the * kernel again, *tid and common->pid_visiting should be the * same for task_seq_start() to pick up the correct task. */ if (*tid == common->pid_visiting) { pid = find_pid_ns(common->pid_visiting, common->ns); task = get_pid_task(pid, PIDTYPE_PID); return task; } task = find_task_by_pid_ns(common->pid_visiting, common->ns); if (!task) return NULL; retry: task = __next_thread(task); if (!task) return NULL; next_tid = __task_pid_nr_ns(task, PIDTYPE_PID, common->ns); if (!next_tid) goto retry; if (skip_if_dup_files && task->files == task->group_leader->files) goto retry; *tid = common->pid_visiting = next_tid; get_task_struct(task); return task; } Oleg.