On Wed, Jun 06, 2012 at 12:55:12PM +0200, Sasha Levin wrote: > Add tracepoints to frontswap API. > > Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx> > --- > include/trace/events/frontswap.h | 167 ++++++++++++++++++++++++++++++++++++++ > mm/frontswap.c | 14 +++ > 2 files changed, 181 insertions(+), 0 deletions(-) > create mode 100644 include/trace/events/frontswap.h > > diff --git a/include/trace/events/frontswap.h b/include/trace/events/frontswap.h > new file mode 100644 > index 0000000..d6c4934 > --- /dev/null > +++ b/include/trace/events/frontswap.h > @@ -0,0 +1,167 @@ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM frontswap > + > +#if !defined(_TRACE_FRONTSWAP_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _TRACE_FRONTSWAP_H > + > +#include <linux/tracepoint.h> > + > +struct frontswap_ops; > + > +TRACE_EVENT(frontswap_init, > + TP_PROTO(unsigned int type, void *sis, void *frontswap_map), > + TP_ARGS(type, sis, frontswap_map), > + > + TP_STRUCT__entry( > + __field( unsigned int, type ) > + __field( void *, sis ) > + __field( void *, frontswap_map ) > + ), > + > + TP_fast_assign( > + __entry->type = type; > + __entry->sis = sis; > + __entry->frontswap_map = frontswap_map; > + ), > + > + TP_printk("type: %u sis: %p frontswap_map: %p", > + __entry->type, __entry->sis, __entry->frontswap_map) > +); > + > +TRACE_EVENT(frontswap_register_ops, > + TP_PROTO(struct frontswap_ops *old, struct frontswap_ops *new), > + TP_ARGS(old, new), > + > + TP_STRUCT__entry( > + __field(struct frontswap_ops *, old ) > + __field(struct frontswap_ops *, new ) > + ), > + > + TP_fast_assign( > + __entry->old = old; > + __entry->new = new; > + ), > + > + TP_printk("old: {init=%p put_page=%p get_page=%p invalidate_page=%p invalidate_area=%p}" > + " new: {init=%p put_page=%p get_page=%p invalidate_page=%p invalidate_area=%p}", > + __entry->old->init,__entry->old->put_page,__entry->old->get_page, > + __entry->old->invalidate_page,__entry->old->invalidate_area,__entry->new->init, > + __entry->new->put_page,__entry->new->get_page,__entry->new->invalidate_page, s/get_page/load s/put_page/store > + __entry->new->invalidate_area) > +); > + > +TRACE_EVENT(frontswap_put_page, Its not called put_page anymore. > + TP_PROTO(void *page, int dup, int ret), > + TP_ARGS(page, dup, ret), > + > + TP_STRUCT__entry( > + __field( int, dup ) > + __field( int, ret ) > + __field( void *, page ) > + ), > + > + TP_fast_assign( > + __entry->dup = dup; > + __entry->ret = ret; > + __entry->page = page; > + ), > + > + TP_printk("page: %p dup: %d ret: %d", > + __entry->page, __entry->dup, __entry->ret) > +); > + > +TRACE_EVENT(frontswap_get_page, Ditto > + TP_PROTO(void *page, int ret), > + TP_ARGS(page, ret), > + > + TP_STRUCT__entry( > + __field( int, ret ) > + __field( void *, page ) > + ), > + > + TP_fast_assign( > + __entry->ret = ret; > + __entry->page = page; > + ), > + > + TP_printk("page: %p ret: %d", > + __entry->page, __entry->ret) > +); > + > +TRACE_EVENT(frontswap_invalidate_page, > + TP_PROTO(int type, unsigned long offset, void *sis, int test), > + TP_ARGS(type, offset, sis, test), > + > + TP_STRUCT__entry( > + __field( int, type ) > + __field( unsigned long, offset ) > + __field( void *, sis ) > + __field( int, test ) > + ), > + > + TP_fast_assign( > + __entry->type = type; > + __entry->offset = offset; > + __entry->sis = sis; > + __entry->test = test; > + ), > + > + TP_printk("type: %d offset: %lu sys: %p frontswap_test: %d", > + __entry->type, __entry->offset, __entry->sis, __entry->test) > +); > + > +TRACE_EVENT(frontswap_invalidate_area, Ditto. > + TP_PROTO(int type, void *sis, void *map), > + TP_ARGS(type, sis, map), > + > + TP_STRUCT__entry( > + __field( int, type ) > + __field( void *, map ) > + __field( void *, sis ) > + ), > + > + TP_fast_assign( > + __entry->type = type; > + __entry->sis = sis; > + __entry->map = map; > + ), > + > + TP_printk("type: %d sys: %p map: %p", > + __entry->type, __entry->sis, __entry->map) > +); > + > +TRACE_EVENT(frontswap_curr_pages, > + TP_PROTO(unsigned long totalpages), > + TP_ARGS(totalpages), > + > + TP_STRUCT__entry( > + __field(unsigned long, totalpages ) > + ), > + > + TP_fast_assign( > + __entry->totalpages = totalpages; > + ), > + > + TP_printk("total pages: %lu", > + __entry->totalpages) > +); > + > +TRACE_EVENT(frontswap_shrink, > + TP_PROTO(unsigned long target_pages), > + TP_ARGS(target_pages), > + > + TP_STRUCT__entry( > + __field(unsigned long, target_pages ) > + ), > + > + TP_fast_assign( > + __entry->target_pages = target_pages; > + ), > + > + TP_printk("target pages: %lu", > + __entry->target_pages) > +); > + > +#endif /* _TRACE_FRONTSWAP_H */ > + > +#include <trace/define_trace.h> > diff --git a/mm/frontswap.c b/mm/frontswap.c > index bf99c7d..b98df99 100644 > --- a/mm/frontswap.c > +++ b/mm/frontswap.c > @@ -11,6 +11,7 @@ > * This work is licensed under the terms of the GNU GPL, version 2. > */ > > +#define CREATE_TRACE_POINTS > #include <linux/mm.h> > #include <linux/mman.h> > #include <linux/swap.h> > @@ -23,6 +24,7 @@ > #include <linux/debugfs.h> > #include <linux/frontswap.h> > #include <linux/swapfile.h> > +#include <trace/events/frontswap.h> > > /* > * frontswap_ops is set by frontswap_register_ops to contain the pointers > @@ -66,6 +68,7 @@ struct frontswap_ops frontswap_register_ops(struct frontswap_ops *ops) > { > struct frontswap_ops old = frontswap_ops; > > + trace_frontswap_register_ops(&old, ops); > frontswap_ops = *ops; > frontswap_enabled = 1; > return old; > @@ -87,6 +90,9 @@ void __frontswap_init(unsigned type) > struct swap_info_struct *sis = swap_info[type]; > > BUG_ON(sis == NULL); > + > + trace_frontswap_init(type, sis, sis->frontswap_map); > + > if (sis->frontswap_map == NULL) > return; > frontswap_ops.init(type); > @@ -113,6 +119,7 @@ int __frontswap_put_page(struct page *page) > if (frontswap_test(sis, offset)) > dup = 1; > ret = frontswap_ops.put_page(type, offset, page); > + trace_frontswap_put_page(page, dup, ret); Uh, why a different parameter layout? > if (ret == 0) { > frontswap_set(sis, offset); > frontswap_succ_puts++; > @@ -153,6 +160,7 @@ int __frontswap_get_page(struct page *page) > BUG_ON(sis == NULL); > if (frontswap_test(sis, offset)) > ret = frontswap_ops.get_page(type, offset, page); > + trace_frontswap_get_page(page, ret); > if (ret == 0) > frontswap_gets++; > return ret; > @@ -168,6 +176,7 @@ void __frontswap_invalidate_page(unsigned type, pgoff_t offset) > struct swap_info_struct *sis = swap_info[type]; > > BUG_ON(sis == NULL); > + trace_frontswap_invalidate_page(type, offset, sis, frontswap_test(sis, offset)); > if (frontswap_test(sis, offset)) { > frontswap_ops.invalidate_page(type, offset); > atomic_dec(&sis->frontswap_pages); > @@ -186,6 +195,7 @@ void __frontswap_invalidate_area(unsigned type) > struct swap_info_struct *sis = swap_info[type]; > > BUG_ON(sis == NULL); > + trace_frontswap_invalidate_area(type, sis, sis->frontswap_map); > if (sis->frontswap_map == NULL) > return; > frontswap_ops.invalidate_area(type); > @@ -274,6 +284,8 @@ void frontswap_shrink(unsigned long target_pages) > unsigned long pages_to_unuse = 0; > int type, ret; > > + trace_frontswap_shrink(target_pages); > + > /* > * we don't want to hold swap_lock while doing a very > * lengthy try_to_unuse, but swap_list may change > @@ -301,6 +313,8 @@ unsigned long frontswap_curr_pages(void) > totalpages = __frontswap_curr_pages(); > spin_unlock(&swap_lock); > > + trace_frontswap_curr_pages(totalpages); > + > return totalpages; > } > EXPORT_SYMBOL(frontswap_curr_pages); > -- > 1.7.8.6 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>