From 2d9d3e0c6534ce8a97f91ce31789bd42fc4c05b7 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Sat, 29 Mar 2014 20:36:33 +0400 Subject: [PATCH] [FIX] race condition, when stopped US instrumentation Change-Id: I2f2a85b1b1c6b53215f0990e19ccc32df2f1eb7a Signed-off-by: Vyacheslav Cherkashin --- us_manager/helper.c | 5 ++++- us_manager/helper.h | 3 ++- us_manager/pf/pf_group.c | 11 +---------- us_manager/us_manager.c | 3 ++- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/us_manager/helper.c b/us_manager/helper.c index 2ba98ef..4de32a5 100644 --- a/us_manager/helper.c +++ b/us_manager/helper.c @@ -321,11 +321,14 @@ unregister_unmap: return ret; } -void unregister_helper(void) +void unregister_helper_top(void) { /* uninstall kretprobe with 'handle_mm_fault' */ dbi_unregister_kretprobe(&mf_kretprobe); +} +void unregister_helper_bottom(void) +{ /* uninstall kretprobe with 'do_mmap_pgoff' */ dbi_unregister_kretprobe(&mmap_kretprobe); diff --git a/us_manager/helper.h b/us_manager/helper.h index 62c37e0..d893371 100644 --- a/us_manager/helper.h +++ b/us_manager/helper.h @@ -36,6 +36,7 @@ int init_helper(void); void uninit_helper(void); int register_helper(void); -void unregister_helper(void); +void unregister_helper_top(void); +void unregister_helper_bottom(void); #endif /* _HELPER_H */ diff --git a/us_manager/pf/pf_group.c b/us_manager/pf/pf_group.c index fafd699..b8f01df 100644 --- a/us_manager/pf/pf_group.c +++ b/us_manager/pf/pf_group.c @@ -276,7 +276,6 @@ void uninstall_proc(struct sspt_proc *proc) struct task_struct *task = proc->task; struct pf_group *pfg; struct pl_struct *pls; - int i; list_for_each_entry(pfg, &pfg_list, list) { pls = find_pl_struct(pfg, task); @@ -287,15 +286,7 @@ void uninstall_proc(struct sspt_proc *proc) } task_lock(task); - for (i = 0; task->mm == NULL; ++i) { - task_unlock(task); - if (i >= 10) - BUG(); - - schedule(); - task_lock(task); - } - + BUG_ON(task->mm == NULL); sspt_proc_uninstall(proc, task, US_UNREGS_PROBE); task_unlock(task); diff --git a/us_manager/us_manager.c b/us_manager/us_manager.c index 5fe353e..8c5f3f2 100644 --- a/us_manager/us_manager.c +++ b/us_manager/us_manager.c @@ -43,8 +43,9 @@ static enum status_type status = ST_OFF; static void do_usm_stop(void) { - unregister_helper(); + unregister_helper_top(); uninstall_all(); + unregister_helper_bottom(); sspt_proc_free_all(); } -- 2.7.4