1*436bf2bcSAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1
2*436bf2bcSAndroid Build Coastguard Worker /*
3*436bf2bcSAndroid Build Coastguard Worker * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
4*436bf2bcSAndroid Build Coastguard Worker */
5*436bf2bcSAndroid Build Coastguard Worker #include <stdio.h>
6*436bf2bcSAndroid Build Coastguard Worker #include <stdlib.h>
7*436bf2bcSAndroid Build Coastguard Worker #include <string.h>
8*436bf2bcSAndroid Build Coastguard Worker
9*436bf2bcSAndroid Build Coastguard Worker #include "event-parse.h"
10*436bf2bcSAndroid Build Coastguard Worker #include "trace-seq.h"
11*436bf2bcSAndroid Build Coastguard Worker
call_site_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)12*436bf2bcSAndroid Build Coastguard Worker static int call_site_handler(struct trace_seq *s, struct tep_record *record,
13*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
14*436bf2bcSAndroid Build Coastguard Worker {
15*436bf2bcSAndroid Build Coastguard Worker struct tep_format_field *field;
16*436bf2bcSAndroid Build Coastguard Worker unsigned long long val, addr;
17*436bf2bcSAndroid Build Coastguard Worker void *data = record->data;
18*436bf2bcSAndroid Build Coastguard Worker const char *func;
19*436bf2bcSAndroid Build Coastguard Worker
20*436bf2bcSAndroid Build Coastguard Worker field = tep_find_field(event, "call_site");
21*436bf2bcSAndroid Build Coastguard Worker if (!field)
22*436bf2bcSAndroid Build Coastguard Worker return 1;
23*436bf2bcSAndroid Build Coastguard Worker
24*436bf2bcSAndroid Build Coastguard Worker if (tep_read_number_field(field, data, &val))
25*436bf2bcSAndroid Build Coastguard Worker return 1;
26*436bf2bcSAndroid Build Coastguard Worker
27*436bf2bcSAndroid Build Coastguard Worker func = tep_find_function(event->tep, val);
28*436bf2bcSAndroid Build Coastguard Worker if (!func)
29*436bf2bcSAndroid Build Coastguard Worker return 1;
30*436bf2bcSAndroid Build Coastguard Worker
31*436bf2bcSAndroid Build Coastguard Worker addr = tep_find_function_address(event->tep, val);
32*436bf2bcSAndroid Build Coastguard Worker
33*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
34*436bf2bcSAndroid Build Coastguard Worker return 1;
35*436bf2bcSAndroid Build Coastguard Worker }
36*436bf2bcSAndroid Build Coastguard Worker
TEP_PLUGIN_LOADER(struct tep_handle * tep)37*436bf2bcSAndroid Build Coastguard Worker int TEP_PLUGIN_LOADER(struct tep_handle *tep)
38*436bf2bcSAndroid Build Coastguard Worker {
39*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kmem", "kfree",
40*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
41*436bf2bcSAndroid Build Coastguard Worker
42*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kmem", "kmalloc",
43*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
44*436bf2bcSAndroid Build Coastguard Worker
45*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kmem", "kmalloc_node",
46*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
47*436bf2bcSAndroid Build Coastguard Worker
48*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kmem", "kmem_cache_alloc",
49*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
50*436bf2bcSAndroid Build Coastguard Worker
51*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kmem",
52*436bf2bcSAndroid Build Coastguard Worker "kmem_cache_alloc_node",
53*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
54*436bf2bcSAndroid Build Coastguard Worker
55*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kmem", "kmem_cache_free",
56*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
57*436bf2bcSAndroid Build Coastguard Worker return 0;
58*436bf2bcSAndroid Build Coastguard Worker }
59*436bf2bcSAndroid Build Coastguard Worker
TEP_PLUGIN_UNLOADER(struct tep_handle * tep)60*436bf2bcSAndroid Build Coastguard Worker void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
61*436bf2bcSAndroid Build Coastguard Worker {
62*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kmem", "kfree",
63*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
64*436bf2bcSAndroid Build Coastguard Worker
65*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kmem", "kmalloc",
66*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
67*436bf2bcSAndroid Build Coastguard Worker
68*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kmem", "kmalloc_node",
69*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
70*436bf2bcSAndroid Build Coastguard Worker
71*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kmem", "kmem_cache_alloc",
72*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
73*436bf2bcSAndroid Build Coastguard Worker
74*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kmem",
75*436bf2bcSAndroid Build Coastguard Worker "kmem_cache_alloc_node",
76*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
77*436bf2bcSAndroid Build Coastguard Worker
78*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kmem", "kmem_cache_free",
79*436bf2bcSAndroid Build Coastguard Worker call_site_handler, NULL);
80*436bf2bcSAndroid Build Coastguard Worker }
81