lkml.org 
[lkml]   [2010]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [patch] trace: Add user-space event tracing/injection

    * hp <hp.reichert@xse.de> wrote:

    > Ingo Molnar <mingo <at> elte.hu> writes:
    >
    > >
    > >
    > > * Darren Hart <dvhart <at> linux.intel.com> wrote:
    > >
    > > > Ideally I would like to see something just like trace_printf()
    > > > without having to define it myself in each of my testcases. [...]
    > >
    > > We can make the prctl a single-argument thing, at the cost of not allowing \0
    > in the
    > > content. (which is probably sane anyway)
    > >
    > > That way deployment is super-simple:
    > >
    > > prctl(35, "My Trace Message");
    > > ...
    > >
    > > if (asprintf(&msg, "My Trace Message: %d\n", 1234) != -1) {
    > > prctl(35, *msg);
    > > free(*msg);
    > > }
    > >
    > > Thanks,
    > >
    > > Ingo
    > >
    > I like this approach - it is doing it nearly the same way I did it with an extra
    > k-mod (no patch needed) and a debugfs entry handled in that mod.
    > I only see one thing with the string only data - I am doing stuff where there
    > are long recording times with also a lot of user events,
    > in such an environment I need more semantics on the event contents.
    > In my k-mod solution there's an event ID and the opportunity to log binary data.
    > As prctl() has 4 additional args after the option, it would be possible to use
    > it in the following way:
    > prtctl( 35, int eventID, int data_type, int msglen, void *buf);
    > or without the data_type
    > prtctl( 35, int eventID, int msglen, void *buf);
    > decoding would be of more effort but it would be worth
    >
    > The event definition would be like this (with data_type):
    >
    > TRACE_EVENT(user,
    > TP_PROTO(int id, int dtype, int dlen, unsigned char *bytes),
    > TP_ARGS(id, dtype, dlen, bytes),
    > TP_STRUCT__entry(
    > __field(int, ev_id)
    > __field(int, ev_type)
    > __dynamic_array(unsigned char, ev_data, dlen)
    > ),
    > TP_fast_assign(
    > __entry->ev_id = id;
    > __entry->ev_type = dtype;
    > memcpy(__get_dynamic_array(ev_data), bytes, dlen);
    > ),
    >
    > TP_printk("ID: %d type: %s data: %s", __entry->ev_id,
    > __print_symbolic(__entry->ev_type, {0,"V"}, {1,"I"}, {2,"S"}, {4,"B"}),
    > __entry->ev_type == 0 ? "n/a" : __get_str(ev_data))
    > );
    >
    >
    > What do you think about this?

    The transport was not limited to strings - it's a memory buffer of 'len' bytes.

    In that sense 'ev_id' and 'ev_type' above is really just hardcoding something that
    the app might not care about.

    For example with the patch i sent one could send 1 byte messages - no other
    overhead. (beyond the standard record header)

    While if an app does want to use an (ev_id, ev_type), it can still do so. Or if an
    app wants to do some other message type, that can be done too - it's free-form.

    Thanks,

    Ingo


    \
     
     \ /
      Last update: 2010-11-18 19:59    [W:4.229 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site