[IMPROVE] Implement kretprobe skipping 54/46854/4
authorVasiliy Ulyanov <v.ulyanov@samsung.com>
Wed, 26 Aug 2015 08:48:46 +0000 (11:48 +0300)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Fri, 28 Aug 2015 06:34:19 +0000 (23:34 -0700)
If entry_handler returns a non-zero value we will not install
probe on the return address.

Change-Id: Iee2ef0ffadb85d7661b4d46ae30d88cef2d7bc0f
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
kprobe/swap_kprobes.c

index ece1f7f..1a08278 100644 (file)
@@ -686,15 +686,21 @@ static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs)
        /* TODO: test - remove retprobe after func entry but before its exit */
        ri = get_free_rp_inst(rp);
        if (ri != NULL) {
+               int skip = 0;
+
                ri->rp = rp;
                ri->task = current;
 
                if (rp->entry_handler)
-                       rp->entry_handler(ri, regs);
-
-               swap_arch_prepare_kretprobe(ri, regs);
+                       skip = rp->entry_handler(ri, regs);
 
-               add_rp_inst(ri);
+               if (skip) {
+                       add_rp_inst(ri);
+                       recycle_rp_inst(ri);
+               } else {
+                       swap_arch_prepare_kretprobe(ri, regs);
+                       add_rp_inst(ri);
+               }
        } else {
                ++rp->nmissed;
        }