Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 350091
b: refs/heads/master
c: 9b545df
h: refs/heads/master
i:
  350089: e9d0283
  350087: fdc4f80
v: v3
  • Loading branch information
Oleg Nesterov committed Feb 8, 2013
1 parent 824c4e0 commit 5a686c8
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 23 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c8a82538001e1a68f4a319d5a75de90d1f284731
refs/heads/master: 9b545df809644912552360054c7bbe8b8a9e01fa
38 changes: 16 additions & 22 deletions trunk/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 5a686c8

Please sign in to comment.