Skip to content

Commit

Permalink
uprobes: Introduce __create_xol_area()
Browse files Browse the repository at this point in the history
No functional changes, preparation.

Extract the code which actually allocates/installs the new area
into the new helper, __create_xol_area().

While at it remove the unnecessary "ret = ENOMEM" and "ret = 0"
in xol_add_vma(), they both have no effect.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
  • Loading branch information
Oleg Nesterov committed Oct 29, 2013
1 parent b68e074 commit 6441ec8
Showing 1 changed file with 25 additions and 22 deletions.
47 changes: 25 additions & 22 deletions kernel/events/uprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1096,16 +1096,14 @@ void uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned lon
}

/* Slot allocation for XOL */
static int xol_add_vma(struct xol_area *area)
static int xol_add_vma(struct mm_struct *mm, struct xol_area *area)
{
struct mm_struct *mm = current->mm;
int ret = -EALREADY;

down_write(&mm->mmap_sem);
if (mm->uprobes_state.xol_area)
goto fail;

ret = -ENOMEM;
/* Try to map as high as possible, this is only a hint. */
area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, PAGE_SIZE, 0, 0);
if (area->vaddr & ~PAGE_MASK) {
Expand All @@ -1120,28 +1118,17 @@ static int xol_add_vma(struct xol_area *area)

smp_wmb(); /* pairs with get_xol_area() */
mm->uprobes_state.xol_area = area;
ret = 0;
fail:
up_write(&mm->mmap_sem);

return ret;
}

/*
* 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 *get_xol_area(void)
static struct xol_area *__create_xol_area(void)
{
struct mm_struct *mm = current->mm;
struct xol_area *area;
uprobe_opcode_t insn = UPROBE_SWBP_INSN;

area = mm->uprobes_state.xol_area;
if (area)
goto ret;
struct xol_area *area;

area = kzalloc(sizeof(*area), GFP_KERNEL);
if (unlikely(!area))
Expand All @@ -1155,13 +1142,13 @@ static struct xol_area *get_xol_area(void)
if (!area->page)
goto free_bitmap;

/* allocate first slot of task's xol_area for the return probes */
init_waitqueue_head(&area->wq);
/* Reserve the 1st slot for get_trampoline_vaddr() */
set_bit(0, area->bitmap);
copy_to_page(area->page, 0, &insn, UPROBE_SWBP_INSN_SIZE);
atomic_set(&area->slot_count, 1);
init_waitqueue_head(&area->wq);
copy_to_page(area->page, 0, &insn, UPROBE_SWBP_INSN_SIZE);

if (!xol_add_vma(area))
if (!xol_add_vma(mm, area))
return area;

__free_page(area->page);
Expand All @@ -1170,9 +1157,25 @@ static struct xol_area *get_xol_area(void)
free_area:
kfree(area);
out:
return NULL;
}

/*
* 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 *get_xol_area(void)
{
struct mm_struct *mm = current->mm;
struct xol_area *area;

if (!mm->uprobes_state.xol_area)
__create_xol_area();

area = mm->uprobes_state.xol_area;
ret:
smp_read_barrier_depends(); /* pairs with wmb in xol_add_vma() */
smp_read_barrier_depends(); /* pairs with wmb in xol_add_vma() */
return area;
}

Expand Down

0 comments on commit 6441ec8

Please sign in to comment.