aboutsummaryrefslogtreecommitdiffstats
path: root/plugin_kmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugin_kmem.c')
-rw-r--r--plugin_kmem.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/plugin_kmem.c b/plugin_kmem.c
new file mode 100644
index 0000000..d707bf2
--- /dev/null
+++ b/plugin_kmem.c
@@ -0,0 +1,56 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#include "trace-cmd.h"
6
7static int call_site_handler(struct trace_seq *s, struct record *record,
8 struct event_format *event)
9{
10 struct format_field *field;
11 unsigned long long val, addr;
12 void *data = record->data;
13 const char *func;
14
15 field = pevent_find_field(event, "call_site");
16 if (!field)
17 return 1;
18
19 if (pevent_read_number_field(field, data, &val))
20 return 1;
21
22 func = pevent_find_function(event->pevent, val);
23 if (!func)
24 return 1;
25 addr = pevent_find_function_address(event->pevent, val);
26
27 trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
28
29 return 1;
30}
31
32int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
33{
34 pevent_register_event_handler(pevent, -1, "kmem", "kfree",
35 call_site_handler);
36
37 pevent_register_event_handler(pevent, -1, "kmem", "kmalloc",
38 call_site_handler);
39
40 pevent_register_event_handler(pevent, -1, "kmem", "kmalloc_node",
41 call_site_handler);
42
43 pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_alloc",
44 call_site_handler);
45
46 pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_alloc_node",
47 call_site_handler);
48
49 pevent_register_event_handler(pevent, -1, "kmem", "kfree",
50 call_site_handler);
51
52 pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_free",
53 call_site_handler);
54
55 return 0;
56}