Tetsuo,

I cannot reproduce the issue.

The transformation from:
  dest = ctx->bx;
to:
  dest = *(volatile uint64_t *)&ctx->bx;

should be safe.

I launched a psql console and did a query:

...
yhs=> SELECT order_id FROM order_details;
 order_id
----------
        6
(1 row)
...

On the usdt side, I did not see anything printout.

I hacked the code to forcefully emit a meaningful string, but it does
not print either. So it looks like the probe function is not called.

int do_start(struct pt_regs *ctx) {
    char *cp = NULL;
    bpf_usdt_readarg(1, ctx, &cp);
    struct { char query[QUERY_MAX]; } data = { };
    bpf_probe_read(&data.query, sizeof(data.query), (void *) cp);
    data.query[0] = 'a'; data.query[1] = 0;
    events.perf_submit(ctx, &data, sizeof(data));
    return 0;
};

Could you double check on your side?

Yonghong

On Mon, Jun 5, 2017 at 3:27 AM, Tetsuo Handa via iovisor-dev
<iovisor-dev@lists.iovisor.org> wrote:
> Hello.
>
> I noticed that b0f891d129a9b372 ("Force udst ctx->#reg load to be volatile")
> broke an USDT probe example shown below.
>
> ----------
> #!/usr/bin/python
>>from bcc import BPF, USDT
> import sys
> import ctypes as ct
>
> def usage():
>     print("USAGE: usdt PID")
>     exit()
> if len(sys.argv) < 1:
>     usage()
> if sys.argv[1][0:1] == "-":
>     usage()
> pid = int(sys.argv[1])
> QUERY_MAX = 504
>
> bpf_text = """
> #include <uapi/linux/ptrace.h>
> #define QUERY_MAX       """ + str(QUERY_MAX) + """
> BPF_PERF_OUTPUT(events);
> int do_start(struct pt_regs *ctx) {
>     char *cp = NULL;
>     bpf_usdt_readarg(1, ctx, &cp);
>     struct { char query[QUERY_MAX]; } data = { };
>     bpf_probe_read(&data.query, sizeof(data.query), (void *) cp);
>     events.perf_submit(ctx, &data, sizeof(data));
>     return 0;
> };
> """
>
> u = USDT(pid=pid)
> u.enable_probe(probe="query__start", fn_name="do_start")
> b = BPF(text=bpf_text, usdt_contexts=[u])
>
> class Data(ct.Structure):
>     _fields_ = [ ("query", ct.c_char * QUERY_MAX) ]
>
> def print_event(cpu, data, size):
>     event = ct.cast(data, ct.POINTER(Data)).contents
>     print("%s" % (event.query))
>
> b["events"].open_perf_buffer(print_event, page_cnt=64)
> while 1:
>     b.kprobe_poll()
> ----------
>
> Since bpf_probe_read() no longer reads PostgreSQL query string
> passed to query__start event, nothing is printed out.
> (Oh, I forgot to check whether cp != NULL.
> Maybe it is bpf_usdt_readarg() which got broken?)
>
> # git bisect log
> # bad: [505c110a5f4f48cff1a501f8b83a548ade6a7739] Add a python test for usdt
> # good: [aa4543ff2d42a2ca38a52963af9d6d078e48809a] Mention that linux-headers 
> deb must be installed.
> git bisect start '505c110a5f4f48cff1a501f8b83a548ade6a7739' 
> 'aa4543ff2d42a2ca38a52963af9d6d078e48809a'
> # good: [a934c903583c415ebed70d03a6c15e9b20c52efa] Add linux/sched.h to list 
> of libbpf.c includes
> git bisect good a934c903583c415ebed70d03a6c15e9b20c52efa
> # bad: [cb8e704ca64de58aab6137faa0b8d6b96f24a257] Merge pull request #1212 
> from iovisor/yhs_dev
> git bisect bad cb8e704ca64de58aab6137faa0b8d6b96f24a257
> # bad: [b0f891d129a9b372e7e8af5b951a1b63985afe26] Force udst ctx->#reg load 
> to be volatile
> git bisect bad b0f891d129a9b372e7e8af5b951a1b63985afe26
> # good: [e7b0ab2dc44b244ef6600630c4e7b16c1f3b123a] Merge pull request #1211 
> from iovisor/libbpf_c_includes
> git bisect good e7b0ab2dc44b244ef6600630c4e7b16c1f3b123a
> # first bad commit: [b0f891d129a9b372e7e8af5b951a1b63985afe26] Force udst 
> ctx->#reg load to be volatile
> _______________________________________________
> iovisor-dev mailing list
> iovisor-dev@lists.iovisor.org
> https://lists.iovisor.org/mailman/listinfo/iovisor-dev
_______________________________________________
iovisor-dev mailing list
iovisor-dev@lists.iovisor.org
https://lists.iovisor.org/mailman/listinfo/iovisor-dev

Reply via email to