[IMPROVE] ARM: move uprobes installation out of exception 34/19534/9
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Mon, 14 Apr 2014 14:53:21 +0000 (18:53 +0400)
committerVasiliy Ulyanov <v.ulyanov@samsung.com>
Mon, 21 Apr 2014 13:09:00 +0000 (06:09 -0700)
Change-Id: I8e200847a84d2016fb81e007befcdd01952c4797
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
us_manager/helper.c
us_manager/pf/pf_group.c
us_manager/sspt/sspt_proc.c
writer/swap_writer_module.c

index 0b27e93..1c61247 100644 (file)
@@ -53,11 +53,26 @@ static int entry_handler_mf(struct kretprobe_instance *ri, struct pt_regs *regs)
 {
        struct pf_data *data = (struct pf_data *)ri->data;
 
+#ifdef CONFIG_ARM
+       data->addr = swap_get_karg(regs, 0);
+#else /* CONFIG_ARM */
        data->addr = swap_get_karg(regs, 2);
+#endif /* CONFIG_ARM */
 
        return 0;
 }
 
+#ifdef CONFIG_ARM
+static unsigned long cb_pf(void *data)
+{
+       unsigned long page_addr = *(unsigned long *)data;
+
+       call_page_fault(current, page_addr);
+
+       return 0;
+}
+#endif /* CONFIG_ARM */
+
 /* Detects when IPs are really loaded into phy mem and installs probes. */
 static int ret_handler_mf(struct kretprobe_instance *ri, struct pt_regs *regs)
 {
@@ -69,7 +84,14 @@ static int ret_handler_mf(struct kretprobe_instance *ri, struct pt_regs *regs)
 
        /* TODO: check return value */
        page_addr = ((struct pf_data *)ri->data)->addr & PAGE_MASK;
+
+#ifdef CONFIG_ARM
+       set_jump_cb((unsigned long)ri->ret_addr, regs, cb_pf,
+                   &page_addr, sizeof(page_addr));
+       ri->ret_addr = (unsigned long *)get_jump_addr();
+#else /* CONFIG_ARM */
        call_page_fault(task, page_addr);
+#endif /* CONFIG_ARM */
 
        return 0;
 }
@@ -476,7 +498,13 @@ void unregister_helper_bottom(void)
 int init_helper(void)
 {
        unsigned long addr;
+
+#ifdef CONFIG_ARM
+       addr = swap_ksyms("do_page_fault");
+#else /* CONFIG_ARM */
        addr = swap_ksyms("handle_mm_fault");
+#endif /* CONFIG_ARM */
+
        if (addr == 0) {
                printk("Cannot find address for handle_mm_fault function!\n");
                return -EINVAL;
index 042c907..ba7f847 100644 (file)
@@ -263,10 +263,25 @@ void call_page_fault(struct task_struct *task, unsigned long page_addr)
                                         NULL;
                        }
 
+                       down_read(&task->mm->mmap_sem);
                        proc_info_msg(task, dentry);
+                       up_read(&task->mm->mmap_sem);
+
+#ifdef CONFIG_ARM
+                       down_write(&task->mm->mmap_sem);
+                       sspt_proc_install(proc);
+                       up_write(&task->mm->mmap_sem);
+#else /* CONFIG_ARM */
                        sspt_proc_install(proc);
+#endif /* CONFIG_ARM */
                } else {
+#ifdef CONFIG_ARM
+                       down_write(&task->mm->mmap_sem);
+                       sspt_proc_install_page(proc, page_addr);
+                       up_write(&task->mm->mmap_sem);
+#else /* CONFIG_ARM */
                        sspt_proc_install_page(proc, page_addr);
+#endif /* CONFIG_ARM */
                }
        }
 }
index f769332..d1c8dca 100644 (file)
 #include <us_manager/us_slot_manager.h>
 #include <writer/swap_writer_module.h>
 
+
+#ifdef CONFIG_ARM
+#define mm_read_lock(task, mm, atomic, lock)                   \
+       mm = task->mm;                                          \
+       lock = 0
+
+#define mm_read_unlock(mm, atomic, lock)
+#else /* CONFIG_ARM */
 #define mm_read_lock(task, mm, atomic, lock)                   \
        mm = atomic ? task->active_mm : get_task_mm(task);      \
        if (mm == NULL) {                                       \
@@ -54,6 +62,8 @@
        if (!atomic) {                                          \
                mmput(mm);                                      \
        }
+#endif /* CONFIG_ARM */
+
 
 static LIST_HEAD(proc_probes_list);
 static DEFINE_RWLOCK(sspt_proc_rwlock);
index fc66c25..7bd1c0b 100644 (file)
@@ -260,7 +260,6 @@ static struct vm_area_struct *find_vma_exe_by_dentry(struct mm_struct *mm, struc
 {
        struct vm_area_struct *vma;
 
-       down_read(&mm->mmap_sem);
        for (vma = mm->mmap; vma; vma = vma->vm_next) {
                if (vma->vm_file && (vma->vm_flags & VM_EXEC) &&
                   (vma->vm_file->f_dentry == dentry))
@@ -269,7 +268,6 @@ static struct vm_area_struct *find_vma_exe_by_dentry(struct mm_struct *mm, struc
 
        vma = NULL;
 out:
-       up_read(&mm->mmap_sem);
 
        return vma;
 }
@@ -301,14 +299,12 @@ static char *pack_libs(char *lib_obj, struct mm_struct *mm, u32 *lib_cnt_p)
 {
        struct vm_area_struct *vma;
 
-       down_read(&mm->mmap_sem);
        for (vma = mm->mmap; vma; vma = vma->vm_next) {
                if (check_vma(vma)) {
                        lib_obj = pack_lib_obj(lib_obj, vma);
                        ++(*lib_cnt_p);
                }
        }
-       up_read(&mm->mmap_sem);
 
        return lib_obj;
 }
@@ -359,6 +355,7 @@ static char *pack_proc_info(char *payload, struct task_struct *task,
        return pack_proc_info_part(end_path, task->mm);
 }
 
+/* called with down\up\_read(&task->mm->mmap_sem) */
 int proc_info_msg(struct task_struct *task, struct dentry *dentry)
 {
        char *buf, *payload, *buf_end;