2013-12-03 17:09:28 +04:00
/*
* Copyright ( C ) 2009 Red Hat Inc , Steven Rostedt < srostedt @ redhat . com >
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ;
* version 2.1 of the License ( not later ! )
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program ; if not , see < http : //www.gnu.org/licenses>
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include "event-parse.h"
2018-08-29 01:50:38 +03:00
# include "trace-seq.h"
2013-12-03 17:09:28 +04:00
2018-08-08 21:02:47 +03:00
static int call_site_handler ( struct trace_seq * s , struct tep_record * record ,
2018-11-30 18:44:07 +03:00
struct tep_event * event , void * context )
2013-12-03 17:09:28 +04:00
{
2018-09-19 21:56:45 +03:00
struct tep_format_field * field ;
2013-12-03 17:09:28 +04:00
unsigned long long val , addr ;
void * data = record - > data ;
const char * func ;
2018-08-08 21:02:50 +03:00
field = tep_find_field ( event , " call_site " ) ;
2013-12-03 17:09:28 +04:00
if ( ! field )
return 1 ;
2018-08-08 21:02:53 +03:00
if ( tep_read_number_field ( field , data , & val ) )
2013-12-03 17:09:28 +04:00
return 1 ;
2018-08-08 21:03:05 +03:00
func = tep_find_function ( event - > pevent , val ) ;
2013-12-03 17:09:28 +04:00
if ( ! func )
return 1 ;
2018-08-08 21:03:05 +03:00
addr = tep_find_function_address ( event - > pevent , val ) ;
2013-12-03 17:09:28 +04:00
trace_seq_printf ( s , " (%s+0x%x) " , func , ( int ) ( val - addr ) ) ;
return 1 ;
}
2018-08-08 21:02:48 +03:00
int TEP_PLUGIN_LOADER ( struct tep_handle * pevent )
2013-12-03 17:09:28 +04:00
{
2018-08-08 21:03:02 +03:00
tep_register_event_handler ( pevent , - 1 , " kmem " , " kfree " ,
call_site_handler , NULL ) ;
2013-12-03 17:09:28 +04:00
2018-08-08 21:03:02 +03:00
tep_register_event_handler ( pevent , - 1 , " kmem " , " kmalloc " ,
call_site_handler , NULL ) ;
2013-12-03 17:09:28 +04:00
2018-08-08 21:03:02 +03:00
tep_register_event_handler ( pevent , - 1 , " kmem " , " kmalloc_node " ,
call_site_handler , NULL ) ;
2013-12-03 17:09:28 +04:00
2018-08-08 21:03:02 +03:00
tep_register_event_handler ( pevent , - 1 , " kmem " , " kmem_cache_alloc " ,
call_site_handler , NULL ) ;
2013-12-03 17:09:28 +04:00
2018-08-08 21:03:02 +03:00
tep_register_event_handler ( pevent , - 1 , " kmem " ,
" kmem_cache_alloc_node " ,
call_site_handler , NULL ) ;
2013-12-03 17:09:28 +04:00
2018-08-08 21:03:02 +03:00
tep_register_event_handler ( pevent , - 1 , " kmem " , " kmem_cache_free " ,
call_site_handler , NULL ) ;
2013-12-03 17:09:28 +04:00
return 0 ;
}
2014-01-16 06:31:11 +04:00
2018-08-08 21:02:48 +03:00
void TEP_PLUGIN_UNLOADER ( struct tep_handle * pevent )
2014-01-16 06:31:11 +04:00
{
2018-08-08 21:03:02 +03:00
tep_unregister_event_handler ( pevent , - 1 , " kmem " , " kfree " ,
call_site_handler , NULL ) ;
2014-01-16 06:31:11 +04:00
2018-08-08 21:03:02 +03:00
tep_unregister_event_handler ( pevent , - 1 , " kmem " , " kmalloc " ,
call_site_handler , NULL ) ;
2014-01-16 06:31:11 +04:00
2018-08-08 21:03:02 +03:00
tep_unregister_event_handler ( pevent , - 1 , " kmem " , " kmalloc_node " ,
call_site_handler , NULL ) ;
2014-01-16 06:31:11 +04:00
2018-08-08 21:03:02 +03:00
tep_unregister_event_handler ( pevent , - 1 , " kmem " , " kmem_cache_alloc " ,
call_site_handler , NULL ) ;
2014-01-16 06:31:11 +04:00
2018-08-08 21:03:02 +03:00
tep_unregister_event_handler ( pevent , - 1 , " kmem " ,
" kmem_cache_alloc_node " ,
call_site_handler , NULL ) ;
2014-01-16 06:31:11 +04:00
2018-08-08 21:03:02 +03:00
tep_unregister_event_handler ( pevent , - 1 , " kmem " , " kmem_cache_free " ,
call_site_handler , NULL ) ;
2014-01-16 06:31:11 +04:00
}