uprobes: Fold xol_alloc_area() into get_xol_area()
Currently only xol_get_insn_slot() does get_xol_area() + xol_alloc_area(), but this will have more users and we do not want to copy-and-paste this code. This patch simply moves xol_alloc_area() into get_xol_area() to simplify the current and future code. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Anton Arapov <anton@redhat.com> Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
This commit is contained in:
Родитель
c8a8253800
Коммит
9b545df809
|
@ -1070,27 +1070,21 @@ static int xol_add_vma(struct xol_area *area)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static struct xol_area *get_xol_area(struct mm_struct *mm)
|
||||
{
|
||||
struct xol_area *area;
|
||||
|
||||
area = mm->uprobes_state.xol_area;
|
||||
smp_read_barrier_depends(); /* pairs with wmb in xol_add_vma() */
|
||||
|
||||
return area;
|
||||
}
|
||||
|
||||
/*
|
||||
* xol_alloc_area - Allocate process's xol_area.
|
||||
* This area will be used for storing instructions for execution out of
|
||||
* line.
|
||||
* get_xol_area - Allocate process's xol_area if necessary.
|
||||
* This area will be used for storing instructions for execution out of line.
|
||||
*
|
||||
* Returns the allocated area or NULL.
|
||||
*/
|
||||
static struct xol_area *xol_alloc_area(void)
|
||||
static struct xol_area *get_xol_area(void)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct xol_area *area;
|
||||
|
||||
area = mm->uprobes_state.xol_area;
|
||||
if (area)
|
||||
goto ret;
|
||||
|
||||
area = kzalloc(sizeof(*area), GFP_KERNEL);
|
||||
if (unlikely(!area))
|
||||
goto out;
|
||||
|
@ -1113,7 +1107,10 @@ static struct xol_area *xol_alloc_area(void)
|
|||
free_area:
|
||||
kfree(area);
|
||||
out:
|
||||
return get_xol_area(current->mm);
|
||||
area = mm->uprobes_state.xol_area;
|
||||
ret:
|
||||
smp_read_barrier_depends(); /* pairs with wmb in xol_add_vma() */
|
||||
return area;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1189,14 +1186,11 @@ static unsigned long xol_get_insn_slot(struct uprobe *uprobe, unsigned long slot
|
|||
unsigned long offset;
|
||||
void *vaddr;
|
||||
|
||||
area = get_xol_area(current->mm);
|
||||
if (!area) {
|
||||
area = xol_alloc_area();
|
||||
if (!area)
|
||||
return 0;
|
||||
}
|
||||
current->utask->xol_vaddr = xol_take_insn_slot(area);
|
||||
area = get_xol_area();
|
||||
if (!area)
|
||||
return 0;
|
||||
|
||||
current->utask->xol_vaddr = xol_take_insn_slot(area);
|
||||
/*
|
||||
* Initialize the slot if xol_vaddr points to valid
|
||||
* instruction slot.
|
||||
|
|
Загрузка…
Ссылка в новой задаче