1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM pagemap 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_PAGEMAP_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_PAGEMAP_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/tracepoint.h> 9*4882a593Smuzhiyun #include <linux/mm.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define PAGEMAP_MAPPED 0x0001u 12*4882a593Smuzhiyun #define PAGEMAP_ANONYMOUS 0x0002u 13*4882a593Smuzhiyun #define PAGEMAP_FILE 0x0004u 14*4882a593Smuzhiyun #define PAGEMAP_SWAPCACHE 0x0008u 15*4882a593Smuzhiyun #define PAGEMAP_SWAPBACKED 0x0010u 16*4882a593Smuzhiyun #define PAGEMAP_MAPPEDDISK 0x0020u 17*4882a593Smuzhiyun #define PAGEMAP_BUFFERS 0x0040u 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define trace_pagemap_flags(page) ( \ 20*4882a593Smuzhiyun (PageAnon(page) ? PAGEMAP_ANONYMOUS : PAGEMAP_FILE) | \ 21*4882a593Smuzhiyun (page_mapped(page) ? PAGEMAP_MAPPED : 0) | \ 22*4882a593Smuzhiyun (PageSwapCache(page) ? PAGEMAP_SWAPCACHE : 0) | \ 23*4882a593Smuzhiyun (PageSwapBacked(page) ? PAGEMAP_SWAPBACKED : 0) | \ 24*4882a593Smuzhiyun (PageMappedToDisk(page) ? PAGEMAP_MAPPEDDISK : 0) | \ 25*4882a593Smuzhiyun (page_has_private(page) ? PAGEMAP_BUFFERS : 0) \ 26*4882a593Smuzhiyun ) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun TRACE_EVENT(mm_lru_insertion, 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun TP_PROTO( 31*4882a593Smuzhiyun struct page *page, 32*4882a593Smuzhiyun int lru 33*4882a593Smuzhiyun ), 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun TP_ARGS(page, lru), 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun TP_STRUCT__entry( 38*4882a593Smuzhiyun __field(struct page *, page ) 39*4882a593Smuzhiyun __field(unsigned long, pfn ) 40*4882a593Smuzhiyun __field(int, lru ) 41*4882a593Smuzhiyun __field(unsigned long, flags ) 42*4882a593Smuzhiyun ), 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun TP_fast_assign( 45*4882a593Smuzhiyun __entry->page = page; 46*4882a593Smuzhiyun __entry->pfn = page_to_pfn(page); 47*4882a593Smuzhiyun __entry->lru = lru; 48*4882a593Smuzhiyun __entry->flags = trace_pagemap_flags(page); 49*4882a593Smuzhiyun ), 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* Flag format is based on page-types.c formatting for pagemap */ 52*4882a593Smuzhiyun TP_printk("page=%p pfn=%lu lru=%d flags=%s%s%s%s%s%s", 53*4882a593Smuzhiyun __entry->page, 54*4882a593Smuzhiyun __entry->pfn, 55*4882a593Smuzhiyun __entry->lru, 56*4882a593Smuzhiyun __entry->flags & PAGEMAP_MAPPED ? "M" : " ", 57*4882a593Smuzhiyun __entry->flags & PAGEMAP_ANONYMOUS ? "a" : "f", 58*4882a593Smuzhiyun __entry->flags & PAGEMAP_SWAPCACHE ? "s" : " ", 59*4882a593Smuzhiyun __entry->flags & PAGEMAP_SWAPBACKED ? "b" : " ", 60*4882a593Smuzhiyun __entry->flags & PAGEMAP_MAPPEDDISK ? "d" : " ", 61*4882a593Smuzhiyun __entry->flags & PAGEMAP_BUFFERS ? "B" : " ") 62*4882a593Smuzhiyun ); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun TRACE_EVENT(mm_lru_activate, 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun TP_PROTO(struct page *page), 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun TP_ARGS(page), 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun TP_STRUCT__entry( 71*4882a593Smuzhiyun __field(struct page *, page ) 72*4882a593Smuzhiyun __field(unsigned long, pfn ) 73*4882a593Smuzhiyun ), 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun TP_fast_assign( 76*4882a593Smuzhiyun __entry->page = page; 77*4882a593Smuzhiyun __entry->pfn = page_to_pfn(page); 78*4882a593Smuzhiyun ), 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* Flag format is based on page-types.c formatting for pagemap */ 81*4882a593Smuzhiyun TP_printk("page=%p pfn=%lu", __entry->page, __entry->pfn) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun ); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #endif /* _TRACE_PAGEMAP_H */ 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* This part must be outside protection */ 88*4882a593Smuzhiyun #include <trace/define_trace.h> 89