@@ -239,12 +239,52 @@ struct kmemtrace_user_event_alloc {
239239};
240240
241241static enum print_line_t
242- kmemtrace_print_alloc_user (struct trace_iterator * iter ,
243- struct kmemtrace_alloc_entry * entry )
242+ kmemtrace_print_alloc_user (struct trace_iterator * iter , int flags )
243+ {
244+ struct trace_seq * s = & iter -> seq ;
245+ struct kmemtrace_alloc_entry * entry ;
246+ int ret ;
247+
248+ trace_assign_type (entry , iter -> ent );
249+
250+ ret = trace_seq_printf (s , "type_id %d call_site %pF ptr %lu "
251+ "bytes_req %lu bytes_alloc %lu gfp_flags %lu node %d\n" ,
252+ entry -> type_id , (void * )entry -> call_site , (unsigned long )entry -> ptr ,
253+ (unsigned long )entry -> bytes_req , (unsigned long )entry -> bytes_alloc ,
254+ (unsigned long )entry -> gfp_flags , entry -> node );
255+
256+ if (!ret )
257+ return TRACE_TYPE_PARTIAL_LINE ;
258+ return TRACE_TYPE_HANDLED ;
259+ }
260+
261+ static enum print_line_t
262+ kmemtrace_print_free_user (struct trace_iterator * iter , int flags )
244263{
245- struct kmemtrace_user_event_alloc * ev_alloc ;
246264 struct trace_seq * s = & iter -> seq ;
265+ struct kmemtrace_free_entry * entry ;
266+ int ret ;
267+
268+ trace_assign_type (entry , iter -> ent );
269+
270+ ret = trace_seq_printf (s , "type_id %d call_site %pF ptr %lu\n" ,
271+ entry -> type_id , (void * )entry -> call_site ,
272+ (unsigned long )entry -> ptr );
273+
274+ if (!ret )
275+ return TRACE_TYPE_PARTIAL_LINE ;
276+ return TRACE_TYPE_HANDLED ;
277+ }
278+
279+ static enum print_line_t
280+ kmemtrace_print_alloc_user_bin (struct trace_iterator * iter , int flags )
281+ {
282+ struct trace_seq * s = & iter -> seq ;
283+ struct kmemtrace_alloc_entry * entry ;
247284 struct kmemtrace_user_event * ev ;
285+ struct kmemtrace_user_event_alloc * ev_alloc ;
286+
287+ trace_assign_type (entry , iter -> ent );
248288
249289 ev = trace_seq_reserve (s , sizeof (* ev ));
250290 if (!ev )
@@ -271,12 +311,14 @@ kmemtrace_print_alloc_user(struct trace_iterator *iter,
271311}
272312
273313static enum print_line_t
274- kmemtrace_print_free_user (struct trace_iterator * iter ,
275- struct kmemtrace_free_entry * entry )
314+ kmemtrace_print_free_user_bin (struct trace_iterator * iter , int flags )
276315{
277316 struct trace_seq * s = & iter -> seq ;
317+ struct kmemtrace_free_entry * entry ;
278318 struct kmemtrace_user_event * ev ;
279319
320+ trace_assign_type (entry , iter -> ent );
321+
280322 ev = trace_seq_reserve (s , sizeof (* ev ));
281323 if (!ev )
282324 return TRACE_TYPE_PARTIAL_LINE ;
@@ -294,12 +336,14 @@ kmemtrace_print_free_user(struct trace_iterator *iter,
294336
295337/* The two other following provide a more minimalistic output */
296338static enum print_line_t
297- kmemtrace_print_alloc_compress (struct trace_iterator * iter ,
298- struct kmemtrace_alloc_entry * entry )
339+ kmemtrace_print_alloc_compress (struct trace_iterator * iter )
299340{
341+ struct kmemtrace_alloc_entry * entry ;
300342 struct trace_seq * s = & iter -> seq ;
301343 int ret ;
302344
345+ trace_assign_type (entry , iter -> ent );
346+
303347 /* Alloc entry */
304348 ret = trace_seq_printf (s , " + " );
305349 if (!ret )
@@ -362,12 +406,14 @@ kmemtrace_print_alloc_compress(struct trace_iterator *iter,
362406}
363407
364408static enum print_line_t
365- kmemtrace_print_free_compress (struct trace_iterator * iter ,
366- struct kmemtrace_free_entry * entry )
409+ kmemtrace_print_free_compress (struct trace_iterator * iter )
367410{
411+ struct kmemtrace_free_entry * entry ;
368412 struct trace_seq * s = & iter -> seq ;
369413 int ret ;
370414
415+ trace_assign_type (entry , iter -> ent );
416+
371417 /* Free entry */
372418 ret = trace_seq_printf (s , " - " );
373419 if (!ret )
@@ -421,32 +467,31 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)
421467{
422468 struct trace_entry * entry = iter -> ent ;
423469
424- switch (entry -> type ) {
425- case TRACE_KMEM_ALLOC : {
426- struct kmemtrace_alloc_entry * field ;
427-
428- trace_assign_type (field , entry );
429- if (kmem_tracer_flags .val & TRACE_KMEM_OPT_MINIMAL )
430- return kmemtrace_print_alloc_compress (iter , field );
431- else
432- return kmemtrace_print_alloc_user (iter , field );
433- }
434-
435- case TRACE_KMEM_FREE : {
436- struct kmemtrace_free_entry * field ;
437-
438- trace_assign_type (field , entry );
439- if (kmem_tracer_flags .val & TRACE_KMEM_OPT_MINIMAL )
440- return kmemtrace_print_free_compress (iter , field );
441- else
442- return kmemtrace_print_free_user (iter , field );
443- }
470+ if (!(kmem_tracer_flags .val & TRACE_KMEM_OPT_MINIMAL ))
471+ return TRACE_TYPE_UNHANDLED ;
444472
473+ switch (entry -> type ) {
474+ case TRACE_KMEM_ALLOC :
475+ return kmemtrace_print_alloc_compress (iter );
476+ case TRACE_KMEM_FREE :
477+ return kmemtrace_print_free_compress (iter );
445478 default :
446479 return TRACE_TYPE_UNHANDLED ;
447480 }
448481}
449482
483+ static struct trace_event kmem_trace_alloc = {
484+ .type = TRACE_KMEM_ALLOC ,
485+ .trace = kmemtrace_print_alloc_user ,
486+ .binary = kmemtrace_print_alloc_user_bin ,
487+ };
488+
489+ static struct trace_event kmem_trace_free = {
490+ .type = TRACE_KMEM_FREE ,
491+ .trace = kmemtrace_print_free_user ,
492+ .binary = kmemtrace_print_free_user_bin ,
493+ };
494+
450495static struct tracer kmem_tracer __read_mostly = {
451496 .name = "kmemtrace" ,
452497 .init = kmem_trace_init ,
@@ -463,6 +508,21 @@ void kmemtrace_init(void)
463508
464509static int __init init_kmem_tracer (void )
465510{
466- return register_tracer (& kmem_tracer );
511+ if (!register_ftrace_event (& kmem_trace_alloc )) {
512+ pr_warning ("Warning: could not register kmem events\n" );
513+ return 1 ;
514+ }
515+
516+ if (!register_ftrace_event (& kmem_trace_free )) {
517+ pr_warning ("Warning: could not register kmem events\n" );
518+ return 1 ;
519+ }
520+
521+ if (!register_tracer (& kmem_tracer )) {
522+ pr_warning ("Warning: could not register the kmem tracer\n" );
523+ return 1 ;
524+ }
525+
526+ return 0 ;
467527}
468528device_initcall (init_kmem_tracer );
0 commit comments