linux/tools/lib/traceevent/plugin_kmem.c
<<
>>
Prefs
   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