do_each_thread(g, p) { if (child->mm != mm) continue;  if (thread_matches(p, addr)) { child = p; goto out; } } while_each_thread(g, p); 
find_thread_for_addr (struct task_struct *child, unsigned long addr){	struct task_struct *g, *p;	struct mm_struct *mm;	int mm_users;	if (!(mm = get_task_mm(child)))		return child;	/* -1 because of our get_task_mm(): */	mm_users = atomic_read(&mm->mm_users) - 1;	if (mm_users <= 1)		goto out;		/* not multi-threaded */	/*	 * First, traverse the child's thread-list.  Good for scalability with	 * NPTL-threads.	 */	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)			continue;		if (thread_matches(p, addr)) {			child = p;			goto out;		}	} while_each_thread(g, p);  out:	mmput(mm);	return child;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/4ac0068f44f192f2de95a7bb36df3e19767a45fb/ptrace.c/clean/arch/ia64/kernel/ptrace.c