Skip to content

Commit

Permalink
uprobes: Fold xol_alloc_area() into get_xol_area()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oleg Nesterov committed Feb 8, 2013
1 parent c8a8253 commit 9b545df
Showing 1 changed file with 16 additions and 22 deletions.
38 changes: 16 additions & 22 deletions kernel/events/uprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

/*
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 9b545df

Please sign in to comment.