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} 95