Re: [PATCH] tracing: Export key trace event symbols

From: Ron Rechenmacher
Date: Mon Apr 27 2015 - 15:17:49 EST


Steven Rostedt wrote on 04/24/15 16:24:
On Mon, 20 Apr 2015 16:38:11 -0500
Ron Rechenmacher <ron@xxxxxxxx> wrote:

If symbols are not exported, modules can no longer register additional
(module specified) tracepoints like they use to be able to (i.e linux-3.15.x).
Somewhere on or about commit de7b2973903c6cc50b31ee5682a69b2219b9919d
(Author: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx>
Date: Tue Apr 8 17:26:21 2014 -0400
tracepoint: Use struct pointer instead of name hash for reg/unreg tracepoints)
modules which attempted to register additional tracing functions would
get "Unknown symbol" errors. For example: "... Unknown symbol
__tracepoint_sched_switch (err 0)"
Symbols can be exported using the kernel's EXPORT_TRACEPOINT_SYMBOL_GPL macro
to allow modules to once again register their own tracing functions (for at
least some key points in the kernel as provided by this patch).

Signed-off-by: Ron Rechenmacher <ron@xxxxxxxx>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=96051

Hi Ron,

I was talking with Mathieu on IRC and asked him how LTTng gets its
kernel tracepoints, and he told me he uses
for_each_kernel_tracepoint(). That will iterate over all tracepoints
that have been added in the kernel (and is exported GPL).

You can still use that to get the handle onto any tracepoint you need.
It's pretty straight forward (I just wrote a simple module to test it
out), and just compare against the tp->name, to find what you want.

Excellent. Thanks Steve. I was able to get this to work 100% for me.
What should be done about the bug report (96051)?
Will you handle it or should I change it to "resolved as invalid"?


I still would like to get more usage out of the internal code, but this
is your work around you wanted. No need to export new symbols. Just a
little more setup time on module load.

Do you think for_each_kernel_tracepoint() and, additionally, the
tracepoint_probe_register() and tracepoint_probe_unregister() functions
will be around for quite some time? I would imagine as long as
LTTng uses them.

Thanks,
Ron


-- Steve

Here's my mod....


#include <linux/module.h>
#include <linux/ftrace.h>
#include <linux/tracepoint.h>

static func(struct tracepoint *tp, void *ignore)
{
printk("tracepoint: %s\n", tp->name);
}

static int __init my_tp_init(void)
{
for_each_kernel_tracepoint(func, NULL);
return 0;
}

static void __exit my_tp_exit(void)
{
}

module_init(my_tp_init);
module_exit(my_tp_exit);

MODULE_AUTHOR("My name here");
MODULE_DESCRIPTION("Me!");
MODULE_LICENSE("GPL");


--
Ron Rechenmacher
Engineer
Fermi National Accelerator Laboratory
Batavia, IL 60510
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/