Change xol_add_vma() to use _install_special_mapping(), this way
we can name the vma installed by uprobes. Currently it looks like
private anonymous mapping, this is confusing and complicates the
debugging. With this change /proc/$pid/maps reports "[uprobes]".

Signed-off-by: Oleg Nesterov <[email protected]>
---
 kernel/events/uprobes.c |   30 ++++++++++++++++++++----------
 1 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index bd35bee..6a9c5e0 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -96,17 +96,18 @@ struct uprobe {
  * allocated.
  */
 struct xol_area {
-       wait_queue_head_t       wq;             /* if all slots are busy */
-       atomic_t                slot_count;     /* number of in-use slots */
-       unsigned long           *bitmap;        /* 0 = free slot */
-       struct page             *pages[2];
+       wait_queue_head_t               wq;             /* if all slots are 
busy */
+       atomic_t                        slot_count;     /* number of in-use 
slots */
+       unsigned long                   *bitmap;        /* 0 = free slot */
 
+       struct vm_special_mapping       xol_mapping;
+       struct page                     *pages[2];
        /*
         * We keep the vma's vm_start rather than a pointer to the vma
         * itself.  The probed process or a naughty kernel module could make
         * the vma go away, and we must handle that reasonably gracefully.
         */
-       unsigned long           vaddr;          /* Page(s) of instruction slots 
*/
+       unsigned long                   vaddr;          /* Page(s) of 
instruction slots */
 };
 
 /*
@@ -1125,11 +1126,14 @@ void uprobe_munmap(struct vm_area_struct *vma, unsigned 
long start, unsigned lon
 /* Slot allocation for XOL */
 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area)
 {
-       int ret = -EALREADY;
+       struct vm_area_struct *vma;
+       int ret;
 
        down_write(&mm->mmap_sem);
-       if (mm->uprobes_state.xol_area)
+       if (mm->uprobes_state.xol_area) {
+               ret = -EALREADY;
                goto fail;
+       }
 
        if (!area->vaddr) {
                /* Try to map as high as possible, this is only a hint. */
@@ -1141,11 +1145,15 @@ static int xol_add_vma(struct mm_struct *mm, struct 
xol_area *area)
                }
        }
 
-       ret = install_special_mapping(mm, area->vaddr, PAGE_SIZE,
-                               VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO, 
area->pages);
-       if (ret)
+       vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE,
+                               VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO,
+                               &area->xol_mapping);
+       if (IS_ERR(vma)) {
+               ret = PTR_ERR(vma);
                goto fail;
+       }
 
+       ret = 0;
        smp_wmb();      /* pairs with get_xol_area() */
        mm->uprobes_state.xol_area = area;
  fail:
@@ -1168,6 +1176,8 @@ static struct xol_area *__create_xol_area(unsigned long 
vaddr)
        if (!area->bitmap)
                goto free_area;
 
+       area->xol_mapping.name = "[uprobes]";
+       area->xol_mapping.pages = area->pages;
        area->pages[0] = alloc_page(GFP_HIGHUSER);
        if (!area->pages[0])
                goto free_bitmap;
-- 
1.5.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to