perf probe: Set retprobe flag when probe in address-based alternative mode
authorHe Kuang <hekuang@huawei.com>
Mon, 13 Apr 2015 11:41:28 +0000 (19:41 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 13 Apr 2015 20:25:22 +0000 (17:25 -0300)
When perf probe searched in a debuginfo file and failed, it tried with
an alternative, in function get_alternative_probe_event():

        memcpy(tmp, &pev->point, sizeof(*tmp));
        memset(&pev->point, 0, sizeof(pev->point));

In this case, it drops the retprobe flag and forgets to set it back in
find_alternative_probe_point(), so the problem occurs.

Can be reproduced as following:

  $ perf probe -v -k vmlinux --add='sys_write%return'
  ...
  Added new event:
  Writing event: p:probe/sys_write _stext+1584952
    probe:sys_write      (on sys_write%return)

  $ cat /sys/kernel/debug/tracing/kprobe_events
  p:probe/sys_write _stext+1584952

After this patch:

  $ perf probe -v -k vmlinux --add='sys_write%return'
  Added new event:
  Writing event: r:probe/sys_write SyS_write+0
    probe:sys_write      (on sys_write%return)

  $ cat /sys/kernel/debug/tracing/kprobe_events
  r:probe/sys_write SyS_write

Signed-off-by: He Kuang <hekuang@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1428925290-5623-1-git-send-email-hekuang@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/probe-event.c

index 30545ce2c712d699a00b13b2bbcc63d4f2fc5ee3..5483d98236d387428d21d107662dc6b1ecd84267 100644 (file)
@@ -332,6 +332,7 @@ static int find_alternative_probe_point(struct debuginfo *dinfo,
        else {
                result->offset += pp->offset;
                result->line += pp->line;
+               result->retprobe = pp->retprobe;
                ret = 0;
        }