| #undef TRACE_SYSTEM |
| #define TRACE_SYSTEM filemap |
| |
| #if !defined(_TRACE_FILEMAP_H) || defined(TRACE_HEADER_MULTI_READ) |
| #define _TRACE_FILEMAP_H |
| |
| #include <linux/types.h> |
| #include <linux/tracepoint.h> |
| #include <linux/mm.h> |
| #include <linux/memcontrol.h> |
| #include <linux/device.h> |
| #include <linux/kdev_t.h> |
| |
| DECLARE_EVENT_CLASS(mm_filemap_op_page_cache, |
| |
| TP_PROTO(struct page *page), |
| |
| TP_ARGS(page), |
| |
| TP_STRUCT__entry( |
| __field(struct page *, page) |
| __field(unsigned long, i_ino) |
| __field(unsigned long, index) |
| __field(dev_t, s_dev) |
| ), |
| |
| TP_fast_assign( |
| __entry->page = page; |
| __entry->i_ino = page->mapping->host->i_ino; |
| __entry->index = page->index; |
| if (page->mapping->host->i_sb) |
| __entry->s_dev = page->mapping->host->i_sb->s_dev; |
| else |
| __entry->s_dev = page->mapping->host->i_rdev; |
| ), |
| |
| TP_printk("dev %d:%d ino %lx page=%p pfn=%lu ofs=%lu", |
| MAJOR(__entry->s_dev), MINOR(__entry->s_dev), |
| __entry->i_ino, |
| __entry->page, |
| page_to_pfn(__entry->page), |
| __entry->index << PAGE_SHIFT) |
| ); |
| |
| DEFINE_EVENT(mm_filemap_op_page_cache, mm_filemap_delete_from_page_cache, |
| TP_PROTO(struct page *page), |
| TP_ARGS(page) |
| ); |
| |
| DEFINE_EVENT(mm_filemap_op_page_cache, mm_filemap_add_to_page_cache, |
| TP_PROTO(struct page *page), |
| TP_ARGS(page) |
| ); |
| |
| DECLARE_EVENT_CLASS(mm_filemap_find_page_cache_miss, |
| |
| TP_PROTO(struct file *file, loff_t pos, size_t count, int read), |
| |
| TP_ARGS(file, pos, count, read), |
| |
| TP_STRUCT__entry( |
| __array(char, path, MAX_FILTER_STR_VAL) |
| __field(char *, path_name) |
| __field(loff_t, pos) |
| __field(size_t, count) |
| __field(int, miss) |
| ), |
| |
| TP_fast_assign( |
| __entry->path_name = d_path(&file->f_path, __entry->path, MAX_FILTER_STR_VAL); |
| __entry->pos = pos; |
| __entry->count = count; |
| __entry->miss = 0; |
| if ((pos & ~PAGE_CACHE_MASK) || (count % PAGE_SIZE) || read) { |
| unsigned long ret; |
| rcu_read_lock(); |
| ret = (count ? page_cache_next_hole(file->f_mapping, |
| (pos >> PAGE_CACHE_SHIFT), ((count - 1) >> PAGE_CACHE_SHIFT) + 1) : 0); |
| rcu_read_unlock(); |
| __entry->miss = (ret >= (pos >> PAGE_CACHE_SHIFT) && |
| ret <= ((pos + count - 1) >> PAGE_CACHE_SHIFT)); |
| } |
| ), |
| |
| TP_printk("path_name %s pos %lld count %zu miss %s", |
| __entry->path_name, |
| __entry->pos, __entry->count, |
| (__entry->miss ? "yes" : "no")) |
| ); |
| |
| DEFINE_EVENT(mm_filemap_find_page_cache_miss, mm_filemap_do_generic_file_read, |
| TP_PROTO(struct file *file, loff_t pos, size_t count, int read), |
| TP_ARGS(file, pos, count, read) |
| ); |
| |
| DEFINE_EVENT(mm_filemap_find_page_cache_miss, mm_filemap_generic_perform_write, |
| TP_PROTO(struct file *file, loff_t pos, size_t count, int read), |
| TP_ARGS(file, pos, count, read) |
| ); |
| |
| #endif /* _TRACE_FILEMAP_H */ |
| |
| /* This part must be outside protection */ |
| #include <trace/define_trace.h> |