On 08/27, Jiri Olsa wrote: > > On Tue, Aug 27, 2024 at 12:40:52PM +0200, Oleg Nesterov wrote: > > static bool > > uprobe_multi_link_filter(struct uprobe_consumer *con, struct mm_struct *mm) > > { > > struct bpf_uprobe *uprobe; > > + struct task_struct *task, *t; > > + bool ret = false; > > > > uprobe = container_of(con, struct bpf_uprobe, consumer); > > - return uprobe->link->task->mm == mm; > > + task = uprobe->link->task; > > + > > + rcu_read_lock(); > > + for_each_thread(task, t) { > > + struct mm_struct *mm = READ_ONCE(t->mm); > > + if (mm) { > > + ret = t->mm == mm; > > + break; > > + } > > + } > > + rcu_read_unlock(); > > that seems expensive if there's many threads many threads with ->mm == NULL? In the likely case for_each_thread() stops after the first t->mm check. > could we check the leader first and only if it's gone fallback to this? up to you.. Oleg.