On Tue, Aug 27, 2024 at 04:26:08PM +0200, Oleg Nesterov wrote: > 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. aah the mm will be the same.. right, nice thanks, jirka