From: Vyacheslav Cherkashin Date: Thu, 8 Nov 2012 14:10:11 +0000 (+0400) Subject: Merge branch 'dev' into new_dpf X-Git-Tag: Tizen_SDK_2.3~716^2~59 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d6e53dc7caa4b88eba17a0c32335fa2fa903be92;p=kernel%2Fswap-modules.git Merge branch 'dev' into new_dpf Conflicts: src/modules/driver/storage.h src/modules/driver/us_proc_inst.c --- d6e53dc7caa4b88eba17a0c32335fa2fa903be92 diff --cc driver/us_proc_inst.c index 8e9c9a7,0dcba9c..b54fd46 --- a/driver/us_proc_inst.c +++ b/driver/us_proc_inst.c @@@ -1012,7 -1027,12 +1022,12 @@@ int deinst_usr_space_proc (void if (iRet) EPRINTF ("uninstall_kernel_probe(do_exit) result=%d!", iRet); + iRet = uninstall_kernel_probe (unmap_addr, US_PROC_UNMAP_INSTLD, + 0, &unmap_probe); + if (iRet) + EPRINTF ("uninstall_kernel_probe(do_munmap) result=%d!", iRet); + - if (!strcmp(us_proc_info.path,"*")) + if (is_libonly()) { for_each_process (task) { @@@ -1622,38 -1385,160 +1645,145 @@@ void do_exit_probe_pre_code (void } EXPORT_SYMBOL_GPL(do_exit_probe_pre_code); + static int check_addr(unsigned long addr, unsigned long start, size_t len) + { + if ((addr >= start) && (addr < start + (unsigned long)len)) { + return 1; + } + + return 0; + } + + static int remove_unmap_probes(struct task_struct *task, inst_us_proc_t* task_inst_info, unsigned long start, size_t len) + { + int i, k, err; + us_proc_otg_ip_t *p; + unsigned long addr; + const int atomic = 1; + + for (i = 0; i < task_inst_info->libs_count; ++i) { + for (k = 0; k < task_inst_info->p_libs[i].ips_count; ++k) { + if (task_inst_info->p_libs[i].p_ips[k].installed) { + addr = task_inst_info->p_libs[i].p_ips[k].jprobe.kp.addr; + if (check_addr(addr, start, len)) { - err = unregister_usprobe(task, &task_inst_info->p_libs[i].p_ips[k], atomic); ++ err = unregister_usprobe(task, &task_inst_info->p_libs[i].p_ips[k], atomic, 1); + if (err != 0) { + EPRINTF("failed to uninstall IP at %p. Error %d!", task_inst_info->p_libs[i].p_ips[k].jprobe.kp.addr, err); + continue; + } + task_inst_info->unres_ips_count++; + task_inst_info->p_libs[i].p_ips[k].installed = 0; + } + } + } + for (k = 0; k < task_inst_info->p_libs[i].vtps_count; ++k) { + if (task_inst_info->p_libs[i].p_vtps[k].installed) { + addr = task_inst_info->p_libs[i].p_vtps[k].jprobe.kp.addr; + if (check_addr(addr, start, len)) { + dbi_unregister_ujprobe(task, &task_inst_info->p_libs[i].p_vtps[k].jprobe, atomic); + task_inst_info->unres_vtps_count++; + task_inst_info->p_libs[i].p_vtps[k].installed = 0; + } + } + } + } + #ifdef __ANDROID + if (is_java_inst_enabled()) { + us_proc_ip_t *entp = &task_inst_info->libdvm_entry_ip; + if (entp->installed) { + addr = entp->jprobe.kp.addr; + if (check_addr(addr, start, len)) { - unregister_usprobe(task, entp, atomic); ++ unregister_usprobe(task, entp, atomic, 1); + entp->installed = 0; + } + } + us_proc_ip_t *retp = &task_inst_info->libdvm_return_ip; + if (retp->installed) { + addr = retp->jprobe.kp.addr; + if (check_addr(addr, start, len)) { - unregister_usprobe(task, retp, atomic); ++ unregister_usprobe(task, retp, atomic, 1); + retp->installed = 0; + } + } + } + #endif /* __ANDROID */ + list_for_each_entry_rcu (p, &otg_us_proc_info, list) { + if (!p->ip.installed) { + continue; + } + + addr = p->ip.jprobe.kp.addr; + if (check_addr(addr, start, len) == 0) { + continue; + } + - err = unregister_usprobe(task, &p->ip, atomic); ++ err = unregister_usprobe(task, &p->ip, atomic, 1); + if (err != 0) { + EPRINTF("failed to uninstall IP at %p. Error %d!", + p->ip.jprobe.kp.addr, err); + continue; + } + p->ip.installed = 0; + } + + return 0; + } + + void do_munmap_probe_pre_code(struct mm_struct *mm, unsigned long start, size_t len) + { + inst_us_proc_t *task_inst_info = NULL; + struct task_struct *task = current; + + //if user-space instrumentation is not set + if (!us_proc_info.path || task->tgid != task->pid) + return; + + if (!strcmp(us_proc_info.path,"*")) { + task_inst_info = get_task_inst_node(task); + } else { + if (task->tgid == us_proc_info.tgid) { + task_inst_info = &us_proc_info; + } + } + + if (task_inst_info) { + remove_unmap_probes(task, task_inst_info, start, len); + } + } + EXPORT_SYMBOL_GPL(do_munmap_probe_pre_code); + void mm_release_probe_pre_code(void) { - int iRet, del = 0; + int iRet; struct task_struct *task; - inst_us_proc_t *task_inst_info = NULL; - //if user-space instrumentation is not set - if (!us_proc_info.path || current->tgid != current->pid) + if (!is_us_instrumentation() || current->tgid != current->pid) { return; + } - if (!strcmp(us_proc_info.path,"*")) - { - task_inst_info = get_task_inst_node(current); - if (task_inst_info) - { - iRet = uninstall_mapped_ips (current, task_inst_info, 1); - if (iRet != 0) + if (is_libonly()) { + inst_us_proc_t *task_inst_info = get_task_inst_node(current); + if (task_inst_info) { + iRet = uninstall_us_proc_probes(current, task_inst_info->pp, US_NOT_RP2); + if (iRet != 0) { EPRINTF ("failed to uninstall IPs (%d)!", iRet); - dbi_unregister_all_uprobes(current, 1); - } - } - else - { - if (current->tgid != us_proc_info.tgid) - return; - del = 1; - // look for another process with the same tgid - rcu_read_lock (); - for_each_process (task) - { - if ((task->pid != current->pid) && (task->tgid == us_proc_info.tgid)) - { - del = 0; - break; } + + dbi_unregister_all_uprobes(current, 1); } - rcu_read_unlock (); - if (del) - { + } else { + if (current->tgid == us_proc_info.tgid && current->tgid == current->pid) { int i; - iRet = uninstall_mapped_ips (current, &us_proc_info, 1); - if (iRet != 0) + iRet = uninstall_us_proc_probes(current, us_proc_info.pp, US_NOT_RP2); + if (iRet != 0) { EPRINTF ("failed to uninstall IPs (%d)!", iRet); + } + dbi_unregister_all_uprobes(current, 1); us_proc_info.tgid = 0; - for(i = 0; i < us_proc_info.libs_count; i++) + for(i = 0; i < us_proc_info.libs_count; i++) { us_proc_info.p_libs[i].loaded = 0; + } } } }