Linux Audio

Check our new training course

Loading...
v3.15
 1/*
 2 * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
 3 *
 4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 5 * This program is free software; you can redistribute it and/or
 6 * modify it under the terms of the GNU Lesser General Public
 7 * License as published by the Free Software Foundation;
 8 * version 2.1 of the License (not later!)
 9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not,  see <http://www.gnu.org/licenses>
17 *
18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 */
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23
24#include "event-parse.h"
25
26static int call_site_handler(struct trace_seq *s, struct pevent_record *record,
27			     struct event_format *event, void *context)
28{
29	struct format_field *field;
30	unsigned long long val, addr;
31	void *data = record->data;
32	const char *func;
33
34	field = pevent_find_field(event, "call_site");
35	if (!field)
36		return 1;
37
38	if (pevent_read_number_field(field, data, &val))
39		return 1;
40
41	func = pevent_find_function(event->pevent, val);
42	if (!func)
43		return 1;
44
45	addr = pevent_find_function_address(event->pevent, val);
46
47	trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
48	return 1;
49}
50
51int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
52{
53	pevent_register_event_handler(pevent, -1, "kmem", "kfree",
54				      call_site_handler, NULL);
55
56	pevent_register_event_handler(pevent, -1, "kmem", "kmalloc",
57				      call_site_handler, NULL);
58
59	pevent_register_event_handler(pevent, -1, "kmem", "kmalloc_node",
60				      call_site_handler, NULL);
61
62	pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_alloc",
63				      call_site_handler, NULL);
64
65	pevent_register_event_handler(pevent, -1, "kmem",
66				      "kmem_cache_alloc_node",
67				      call_site_handler, NULL);
68
69	pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_free",
70				      call_site_handler, NULL);
71	return 0;
72}
73
74void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
75{
76	pevent_unregister_event_handler(pevent, -1, "kmem", "kfree",
77					call_site_handler, NULL);
78
79	pevent_unregister_event_handler(pevent, -1, "kmem", "kmalloc",
80					call_site_handler, NULL);
81
82	pevent_unregister_event_handler(pevent, -1, "kmem", "kmalloc_node",
83					call_site_handler, NULL);
84
85	pevent_unregister_event_handler(pevent, -1, "kmem", "kmem_cache_alloc",
86					call_site_handler, NULL);
87
88	pevent_unregister_event_handler(pevent, -1, "kmem",
89					"kmem_cache_alloc_node",
90					call_site_handler, NULL);
91
92	pevent_unregister_event_handler(pevent, -1, "kmem", "kmem_cache_free",
93					call_site_handler, NULL);
94}
v4.6
 1/*
 2 * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
 3 *
 4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 5 * This program is free software; you can redistribute it and/or
 6 * modify it under the terms of the GNU Lesser General Public
 7 * License as published by the Free Software Foundation;
 8 * version 2.1 of the License (not later!)
 9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not,  see <http://www.gnu.org/licenses>
17 *
18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 */
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23
24#include "event-parse.h"
25
26static int call_site_handler(struct trace_seq *s, struct pevent_record *record,
27			     struct event_format *event, void *context)
28{
29	struct format_field *field;
30	unsigned long long val, addr;
31	void *data = record->data;
32	const char *func;
33
34	field = pevent_find_field(event, "call_site");
35	if (!field)
36		return 1;
37
38	if (pevent_read_number_field(field, data, &val))
39		return 1;
40
41	func = pevent_find_function(event->pevent, val);
42	if (!func)
43		return 1;
44
45	addr = pevent_find_function_address(event->pevent, val);
46
47	trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
48	return 1;
49}
50
51int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
52{
53	pevent_register_event_handler(pevent, -1, "kmem", "kfree",
54				      call_site_handler, NULL);
55
56	pevent_register_event_handler(pevent, -1, "kmem", "kmalloc",
57				      call_site_handler, NULL);
58
59	pevent_register_event_handler(pevent, -1, "kmem", "kmalloc_node",
60				      call_site_handler, NULL);
61
62	pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_alloc",
63				      call_site_handler, NULL);
64
65	pevent_register_event_handler(pevent, -1, "kmem",
66				      "kmem_cache_alloc_node",
67				      call_site_handler, NULL);
68
69	pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_free",
70				      call_site_handler, NULL);
71	return 0;
72}
73
74void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
75{
76	pevent_unregister_event_handler(pevent, -1, "kmem", "kfree",
77					call_site_handler, NULL);
78
79	pevent_unregister_event_handler(pevent, -1, "kmem", "kmalloc",
80					call_site_handler, NULL);
81
82	pevent_unregister_event_handler(pevent, -1, "kmem", "kmalloc_node",
83					call_site_handler, NULL);
84
85	pevent_unregister_event_handler(pevent, -1, "kmem", "kmem_cache_alloc",
86					call_site_handler, NULL);
87
88	pevent_unregister_event_handler(pevent, -1, "kmem",
89					"kmem_cache_alloc_node",
90					call_site_handler, NULL);
91
92	pevent_unregister_event_handler(pevent, -1, "kmem", "kmem_cache_free",
93					call_site_handler, NULL);
94}