On 08/27, Jiri Olsa wrote:
On Tue, Aug 27, 2024 at 12:40:52PM +0200, Oleg Nesterov wrote:
quoted
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.