uprobes: Change the callsite of uprobe_copy_process()

Preparation for the next patches.

Move the callsite of uprobe_copy_process() in copy_process() down
to the succesfull return. We do not care if copy_process() fails,
uprobe_free_utask() won't be called in this case so the wrong
->utask != NULL doesn't matter.

OTOH, with this change we know that copy_process() can't fail when
uprobe_copy_process() is called, the new task should either return
to user-mode or call do_exit(). This way uprobe_copy_process() can:

	1. setup p->utask != NULL if necessary

	2. setup uprobes_state.xol_area

	3. use task_work_add(p)

Also, move the definition of uprobe_copy_process() down so that it
can see get_utask().

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
This commit is contained in:
Oleg Nesterov 2013-10-13 21:18:31 +02:00
Родитель c2d3f25dda
Коммит b68e074910
2 изменённых файлов: 9 добавлений и 9 удалений

Просмотреть файл

@ -1344,14 +1344,6 @@ void uprobe_free_utask(struct task_struct *t)
t->utask = NULL; t->utask = NULL;
} }
/*
* Called in context of a new clone/fork from copy_process.
*/
void uprobe_copy_process(struct task_struct *t)
{
t->utask = NULL;
}
/* /*
* Allocate a uprobe_task object for the task if if necessary. * Allocate a uprobe_task object for the task if if necessary.
* Called when the thread hits a breakpoint. * Called when the thread hits a breakpoint.
@ -1367,6 +1359,14 @@ static struct uprobe_task *get_utask(void)
return current->utask; return current->utask;
} }
/*
* Called in context of a new clone/fork from copy_process.
*/
void uprobe_copy_process(struct task_struct *t)
{
t->utask = NULL;
}
/* /*
* Current area->vaddr notion assume the trampoline address is always * Current area->vaddr notion assume the trampoline address is always
* equal area->vaddr. * equal area->vaddr.

Просмотреть файл

@ -1373,7 +1373,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
INIT_LIST_HEAD(&p->pi_state_list); INIT_LIST_HEAD(&p->pi_state_list);
p->pi_state_cache = NULL; p->pi_state_cache = NULL;
#endif #endif
uprobe_copy_process(p);
/* /*
* sigaltstack should be cleared when sharing the same VM * sigaltstack should be cleared when sharing the same VM
*/ */
@ -1490,6 +1489,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
perf_event_fork(p); perf_event_fork(p);
trace_task_newtask(p, clone_flags); trace_task_newtask(p, clone_flags);
uprobe_copy_process(p);
return p; return p;