Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing, mm: Record pfn instead of pointer to struct page

The struct page is opaque for userspace tools, so it'd be better to save
pfn in order to identify page frames.

The textual output of $debugfs/tracing/trace file remains unchanged and
only raw (binary) data format is changed - but thanks to libtraceevent,
userspace tools which deal with the raw data (like perf and trace-cmd)
can parse the format easily. So impact on the userspace will also be
minimal.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Based-on-patch-by: Joonsoo Kim <js1304@gmail.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/1428298576-9785-3-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
9fdd8a87 066450be

+29 -29
+4 -4
include/trace/events/filemap.h
··· 18 18 TP_ARGS(page), 19 19 20 20 TP_STRUCT__entry( 21 - __field(struct page *, page) 21 + __field(unsigned long, pfn) 22 22 __field(unsigned long, i_ino) 23 23 __field(unsigned long, index) 24 24 __field(dev_t, s_dev) 25 25 ), 26 26 27 27 TP_fast_assign( 28 - __entry->page = page; 28 + __entry->pfn = page_to_pfn(page); 29 29 __entry->i_ino = page->mapping->host->i_ino; 30 30 __entry->index = page->index; 31 31 if (page->mapping->host->i_sb) ··· 37 37 TP_printk("dev %d:%d ino %lx page=%p pfn=%lu ofs=%lu", 38 38 MAJOR(__entry->s_dev), MINOR(__entry->s_dev), 39 39 __entry->i_ino, 40 - __entry->page, 41 - page_to_pfn(__entry->page), 40 + pfn_to_page(__entry->pfn), 41 + __entry->pfn, 42 42 __entry->index << PAGE_SHIFT) 43 43 ); 44 44
+21 -21
include/trace/events/kmem.h
··· 154 154 TP_ARGS(page, order), 155 155 156 156 TP_STRUCT__entry( 157 - __field( struct page *, page ) 157 + __field( unsigned long, pfn ) 158 158 __field( unsigned int, order ) 159 159 ), 160 160 161 161 TP_fast_assign( 162 - __entry->page = page; 162 + __entry->pfn = page_to_pfn(page); 163 163 __entry->order = order; 164 164 ), 165 165 166 166 TP_printk("page=%p pfn=%lu order=%d", 167 - __entry->page, 168 - page_to_pfn(__entry->page), 167 + pfn_to_page(__entry->pfn), 168 + __entry->pfn, 169 169 __entry->order) 170 170 ); 171 171 ··· 176 176 TP_ARGS(page, cold), 177 177 178 178 TP_STRUCT__entry( 179 - __field( struct page *, page ) 179 + __field( unsigned long, pfn ) 180 180 __field( int, cold ) 181 181 ), 182 182 183 183 TP_fast_assign( 184 - __entry->page = page; 184 + __entry->pfn = page_to_pfn(page); 185 185 __entry->cold = cold; 186 186 ), 187 187 188 188 TP_printk("page=%p pfn=%lu order=0 cold=%d", 189 - __entry->page, 190 - page_to_pfn(__entry->page), 189 + pfn_to_page(__entry->pfn), 190 + __entry->pfn, 191 191 __entry->cold) 192 192 ); 193 193 ··· 199 199 TP_ARGS(page, order, gfp_flags, migratetype), 200 200 201 201 TP_STRUCT__entry( 202 - __field( struct page *, page ) 202 + __field( unsigned long, pfn ) 203 203 __field( unsigned int, order ) 204 204 __field( gfp_t, gfp_flags ) 205 205 __field( int, migratetype ) 206 206 ), 207 207 208 208 TP_fast_assign( 209 - __entry->page = page; 209 + __entry->pfn = page ? page_to_pfn(page) : -1UL; 210 210 __entry->order = order; 211 211 __entry->gfp_flags = gfp_flags; 212 212 __entry->migratetype = migratetype; 213 213 ), 214 214 215 215 TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", 216 - __entry->page, 217 - __entry->page ? page_to_pfn(__entry->page) : 0, 216 + __entry->pfn != -1UL ? pfn_to_page(__entry->pfn) : NULL, 217 + __entry->pfn != -1UL ? __entry->pfn : 0, 218 218 __entry->order, 219 219 __entry->migratetype, 220 220 show_gfp_flags(__entry->gfp_flags)) ··· 227 227 TP_ARGS(page, order, migratetype), 228 228 229 229 TP_STRUCT__entry( 230 - __field( struct page *, page ) 230 + __field( unsigned long, pfn ) 231 231 __field( unsigned int, order ) 232 232 __field( int, migratetype ) 233 233 ), 234 234 235 235 TP_fast_assign( 236 - __entry->page = page; 236 + __entry->pfn = page ? page_to_pfn(page) : -1UL; 237 237 __entry->order = order; 238 238 __entry->migratetype = migratetype; 239 239 ), 240 240 241 241 TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", 242 - __entry->page, 243 - __entry->page ? page_to_pfn(__entry->page) : 0, 242 + __entry->pfn != -1UL ? pfn_to_page(__entry->pfn) : NULL, 243 + __entry->pfn != -1UL ? __entry->pfn : 0, 244 244 __entry->order, 245 245 __entry->migratetype, 246 246 __entry->order == 0) ··· 260 260 TP_ARGS(page, order, migratetype), 261 261 262 262 TP_printk("page=%p pfn=%lu order=%d migratetype=%d", 263 - __entry->page, page_to_pfn(__entry->page), 263 + pfn_to_page(__entry->pfn), __entry->pfn, 264 264 __entry->order, __entry->migratetype) 265 265 ); 266 266 ··· 275 275 alloc_migratetype, fallback_migratetype), 276 276 277 277 TP_STRUCT__entry( 278 - __field( struct page *, page ) 278 + __field( unsigned long, pfn ) 279 279 __field( int, alloc_order ) 280 280 __field( int, fallback_order ) 281 281 __field( int, alloc_migratetype ) ··· 284 284 ), 285 285 286 286 TP_fast_assign( 287 - __entry->page = page; 287 + __entry->pfn = page_to_pfn(page); 288 288 __entry->alloc_order = alloc_order; 289 289 __entry->fallback_order = fallback_order; 290 290 __entry->alloc_migratetype = alloc_migratetype; ··· 294 294 ), 295 295 296 296 TP_printk("page=%p pfn=%lu alloc_order=%d fallback_order=%d pageblock_order=%d alloc_migratetype=%d fallback_migratetype=%d fragmenting=%d change_ownership=%d", 297 - __entry->page, 298 - page_to_pfn(__entry->page), 297 + pfn_to_page(__entry->pfn), 298 + __entry->pfn, 299 299 __entry->alloc_order, 300 300 __entry->fallback_order, 301 301 pageblock_order,
+4 -4
include/trace/events/vmscan.h
··· 336 336 TP_ARGS(page, reclaim_flags), 337 337 338 338 TP_STRUCT__entry( 339 - __field(struct page *, page) 339 + __field(unsigned long, pfn) 340 340 __field(int, reclaim_flags) 341 341 ), 342 342 343 343 TP_fast_assign( 344 - __entry->page = page; 344 + __entry->pfn = page_to_pfn(page); 345 345 __entry->reclaim_flags = reclaim_flags; 346 346 ), 347 347 348 348 TP_printk("page=%p pfn=%lu flags=%s", 349 - __entry->page, 350 - page_to_pfn(__entry->page), 349 + pfn_to_page(__entry->pfn), 350 + __entry->pfn, 351 351 show_reclaim_flags(__entry->reclaim_flags)) 352 352 ); 353 353