Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9590204d authored by Tony Luck's avatar Tony Luck
Browse files

Pull optimize-ptrace-threads into release branch

parents 8496f2a4 4ac0068f
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -589,6 +589,7 @@ find_thread_for_addr (struct task_struct *child, unsigned long addr)
{
	struct task_struct *g, *p;
	struct mm_struct *mm;
	struct list_head *this, *next;
	int mm_users;

	if (!(mm = get_task_mm(child)))
@@ -600,28 +601,21 @@ find_thread_for_addr (struct task_struct *child, unsigned long addr)
		goto out;		/* not multi-threaded */

	/*
	 * First, traverse the child's thread-list.  Good for scalability with
	 * NPTL-threads.
	 * Traverse the current process' children list.  Every task that
	 * one attaches to becomes a child.  And it is only attached children
	 * of the debugger that are of interest (ptrace_check_attach checks
	 * for this).
	 */
	p = child;
	do {
		if (thread_matches(p, addr)) {
			child = p;
			goto out;
		}
		if (mm_users-- <= 1)
			goto out;
	} while ((p = next_thread(p)) != child);

	do_each_thread(g, p) {
		if (child->mm != mm)
 	list_for_each_safe(this, next, &current->children) {
		p = list_entry(this, struct task_struct, sibling);
		if (p->mm != mm)
			continue;

		if (thread_matches(p, addr)) {
			child = p;
			goto out;
		}
	} while_each_thread(g, p);
	}

  out:
	mmput(mm);
	return child;