diff options
| author | David Woodhouse <David.Woodhouse@intel.com> | 2009-09-20 08:55:36 -0400 |
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-09-20 08:55:36 -0400 |
| commit | 6469f540ea37d53db089c8fea9c0c77a3d9353d4 (patch) | |
| tree | 1dc9dc077150d57f4424cae49e711b5dd6e903a1 /include/trace | |
| parent | 304e6d5fe294b80e6d3107f99ec241816390ebcc (diff) | |
| parent | 78f28b7c555359c67c2a0d23f7436e915329421e (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
drivers/mtd/mtdcore.c
Merged in order that I can apply the Nomadik nand/onenand support patches.
Diffstat (limited to 'include/trace')
| -rw-r--r-- | include/trace/define_trace.h | 7 | ||||
| -rw-r--r-- | include/trace/events/block.h | 4 | ||||
| -rw-r--r-- | include/trace/events/ext4.h | 146 | ||||
| -rw-r--r-- | include/trace/events/irq.h | 21 | ||||
| -rw-r--r-- | include/trace/events/jbd2.h | 2 | ||||
| -rw-r--r-- | include/trace/events/kvm.h | 151 | ||||
| -rw-r--r-- | include/trace/events/module.h | 126 | ||||
| -rw-r--r-- | include/trace/events/sched.h | 107 | ||||
| -rw-r--r-- | include/trace/events/skb.h | 20 | ||||
| -rw-r--r-- | include/trace/events/syscalls.h | 70 | ||||
| -rw-r--r-- | include/trace/ftrace.h | 101 | ||||
| -rw-r--r-- | include/trace/syscall.h | 48 |
12 files changed, 702 insertions, 101 deletions
diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h index f7a7ae1e8f90..2a4b3bf74033 100644 --- a/include/trace/define_trace.h +++ b/include/trace/define_trace.h | |||
| @@ -26,6 +26,11 @@ | |||
| 26 | #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ | 26 | #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ |
| 27 | DEFINE_TRACE(name) | 27 | DEFINE_TRACE(name) |
| 28 | 28 | ||
| 29 | #undef TRACE_EVENT_FN | ||
| 30 | #define TRACE_EVENT_FN(name, proto, args, tstruct, \ | ||
| 31 | assign, print, reg, unreg) \ | ||
| 32 | DEFINE_TRACE_FN(name, reg, unreg) | ||
| 33 | |||
| 29 | #undef DECLARE_TRACE | 34 | #undef DECLARE_TRACE |
| 30 | #define DECLARE_TRACE(name, proto, args) \ | 35 | #define DECLARE_TRACE(name, proto, args) \ |
| 31 | DEFINE_TRACE(name) | 36 | DEFINE_TRACE(name) |
| @@ -56,6 +61,8 @@ | |||
| 56 | #include <trace/ftrace.h> | 61 | #include <trace/ftrace.h> |
| 57 | #endif | 62 | #endif |
| 58 | 63 | ||
| 64 | #undef TRACE_EVENT | ||
| 65 | #undef TRACE_EVENT_FN | ||
| 59 | #undef TRACE_HEADER_MULTI_READ | 66 | #undef TRACE_HEADER_MULTI_READ |
| 60 | 67 | ||
| 61 | /* Only undef what we defined in this file */ | 68 | /* Only undef what we defined in this file */ |
diff --git a/include/trace/events/block.h b/include/trace/events/block.h index 9a74b468a229..d86af94691c2 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h | |||
| @@ -171,6 +171,7 @@ TRACE_EVENT(block_rq_complete, | |||
| 171 | (unsigned long long)__entry->sector, | 171 | (unsigned long long)__entry->sector, |
| 172 | __entry->nr_sector, __entry->errors) | 172 | __entry->nr_sector, __entry->errors) |
| 173 | ); | 173 | ); |
| 174 | |||
| 174 | TRACE_EVENT(block_bio_bounce, | 175 | TRACE_EVENT(block_bio_bounce, |
| 175 | 176 | ||
| 176 | TP_PROTO(struct request_queue *q, struct bio *bio), | 177 | TP_PROTO(struct request_queue *q, struct bio *bio), |
| @@ -186,7 +187,8 @@ TRACE_EVENT(block_bio_bounce, | |||
| 186 | ), | 187 | ), |
| 187 | 188 | ||
| 188 | TP_fast_assign( | 189 | TP_fast_assign( |
| 189 | __entry->dev = bio->bi_bdev->bd_dev; | 190 | __entry->dev = bio->bi_bdev ? |
| 191 | bio->bi_bdev->bd_dev : 0; | ||
| 190 | __entry->sector = bio->bi_sector; | 192 | __entry->sector = bio->bi_sector; |
| 191 | __entry->nr_sector = bio->bi_size >> 9; | 193 | __entry->nr_sector = bio->bi_size >> 9; |
| 192 | blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); | 194 | blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); |
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 7d8b5bc74185..c1bd8f1e8b94 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
| @@ -5,10 +5,15 @@ | |||
| 5 | #define _TRACE_EXT4_H | 5 | #define _TRACE_EXT4_H |
| 6 | 6 | ||
| 7 | #include <linux/writeback.h> | 7 | #include <linux/writeback.h> |
| 8 | #include "../../../fs/ext4/ext4.h" | ||
| 9 | #include "../../../fs/ext4/mballoc.h" | ||
| 10 | #include <linux/tracepoint.h> | 8 | #include <linux/tracepoint.h> |
| 11 | 9 | ||
| 10 | struct ext4_allocation_context; | ||
| 11 | struct ext4_allocation_request; | ||
| 12 | struct ext4_prealloc_space; | ||
| 13 | struct ext4_inode_info; | ||
| 14 | |||
| 15 | #define EXT4_I(inode) (container_of(inode, struct ext4_inode_info, vfs_inode)) | ||
| 16 | |||
| 12 | TRACE_EVENT(ext4_free_inode, | 17 | TRACE_EVENT(ext4_free_inode, |
| 13 | TP_PROTO(struct inode *inode), | 18 | TP_PROTO(struct inode *inode), |
| 14 | 19 | ||
| @@ -33,8 +38,8 @@ TRACE_EVENT(ext4_free_inode, | |||
| 33 | ), | 38 | ), |
| 34 | 39 | ||
| 35 | TP_printk("dev %s ino %lu mode %d uid %u gid %u blocks %llu", | 40 | TP_printk("dev %s ino %lu mode %d uid %u gid %u blocks %llu", |
| 36 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->mode, | 41 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 37 | __entry->uid, __entry->gid, | 42 | __entry->mode, __entry->uid, __entry->gid, |
| 38 | (unsigned long long) __entry->blocks) | 43 | (unsigned long long) __entry->blocks) |
| 39 | ); | 44 | ); |
| 40 | 45 | ||
| @@ -56,7 +61,8 @@ TRACE_EVENT(ext4_request_inode, | |||
| 56 | ), | 61 | ), |
| 57 | 62 | ||
| 58 | TP_printk("dev %s dir %lu mode %d", | 63 | TP_printk("dev %s dir %lu mode %d", |
| 59 | jbd2_dev_to_name(__entry->dev), __entry->dir, __entry->mode) | 64 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->dir, |
| 65 | __entry->mode) | ||
| 60 | ); | 66 | ); |
| 61 | 67 | ||
| 62 | TRACE_EVENT(ext4_allocate_inode, | 68 | TRACE_EVENT(ext4_allocate_inode, |
| @@ -79,7 +85,8 @@ TRACE_EVENT(ext4_allocate_inode, | |||
| 79 | ), | 85 | ), |
| 80 | 86 | ||
| 81 | TP_printk("dev %s ino %lu dir %lu mode %d", | 87 | TP_printk("dev %s ino %lu dir %lu mode %d", |
| 82 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->dir, __entry->mode) | 88 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 89 | (unsigned long) __entry->dir, __entry->mode) | ||
| 83 | ); | 90 | ); |
| 84 | 91 | ||
| 85 | TRACE_EVENT(ext4_write_begin, | 92 | TRACE_EVENT(ext4_write_begin, |
| @@ -106,8 +113,8 @@ TRACE_EVENT(ext4_write_begin, | |||
| 106 | ), | 113 | ), |
| 107 | 114 | ||
| 108 | TP_printk("dev %s ino %lu pos %llu len %u flags %u", | 115 | TP_printk("dev %s ino %lu pos %llu len %u flags %u", |
| 109 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len, | 116 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 110 | __entry->flags) | 117 | __entry->pos, __entry->len, __entry->flags) |
| 111 | ); | 118 | ); |
| 112 | 119 | ||
| 113 | TRACE_EVENT(ext4_ordered_write_end, | 120 | TRACE_EVENT(ext4_ordered_write_end, |
| @@ -133,8 +140,8 @@ TRACE_EVENT(ext4_ordered_write_end, | |||
| 133 | ), | 140 | ), |
| 134 | 141 | ||
| 135 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", | 142 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", |
| 136 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len, | 143 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 137 | __entry->copied) | 144 | __entry->pos, __entry->len, __entry->copied) |
| 138 | ); | 145 | ); |
| 139 | 146 | ||
| 140 | TRACE_EVENT(ext4_writeback_write_end, | 147 | TRACE_EVENT(ext4_writeback_write_end, |
| @@ -160,8 +167,8 @@ TRACE_EVENT(ext4_writeback_write_end, | |||
| 160 | ), | 167 | ), |
| 161 | 168 | ||
| 162 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", | 169 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", |
| 163 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len, | 170 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 164 | __entry->copied) | 171 | __entry->pos, __entry->len, __entry->copied) |
| 165 | ); | 172 | ); |
| 166 | 173 | ||
| 167 | TRACE_EVENT(ext4_journalled_write_end, | 174 | TRACE_EVENT(ext4_journalled_write_end, |
| @@ -186,8 +193,8 @@ TRACE_EVENT(ext4_journalled_write_end, | |||
| 186 | ), | 193 | ), |
| 187 | 194 | ||
| 188 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", | 195 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", |
| 189 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len, | 196 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 190 | __entry->copied) | 197 | __entry->pos, __entry->len, __entry->copied) |
| 191 | ); | 198 | ); |
| 192 | 199 | ||
| 193 | TRACE_EVENT(ext4_writepage, | 200 | TRACE_EVENT(ext4_writepage, |
| @@ -209,7 +216,8 @@ TRACE_EVENT(ext4_writepage, | |||
| 209 | ), | 216 | ), |
| 210 | 217 | ||
| 211 | TP_printk("dev %s ino %lu page_index %lu", | 218 | TP_printk("dev %s ino %lu page_index %lu", |
| 212 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->index) | 219 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 220 | __entry->index) | ||
| 213 | ); | 221 | ); |
| 214 | 222 | ||
| 215 | TRACE_EVENT(ext4_da_writepages, | 223 | TRACE_EVENT(ext4_da_writepages, |
| @@ -227,7 +235,6 @@ TRACE_EVENT(ext4_da_writepages, | |||
| 227 | __field( char, nonblocking ) | 235 | __field( char, nonblocking ) |
| 228 | __field( char, for_kupdate ) | 236 | __field( char, for_kupdate ) |
| 229 | __field( char, for_reclaim ) | 237 | __field( char, for_reclaim ) |
| 230 | __field( char, for_writepages ) | ||
| 231 | __field( char, range_cyclic ) | 238 | __field( char, range_cyclic ) |
| 232 | ), | 239 | ), |
| 233 | 240 | ||
| @@ -241,16 +248,50 @@ TRACE_EVENT(ext4_da_writepages, | |||
| 241 | __entry->nonblocking = wbc->nonblocking; | 248 | __entry->nonblocking = wbc->nonblocking; |
| 242 | __entry->for_kupdate = wbc->for_kupdate; | 249 | __entry->for_kupdate = wbc->for_kupdate; |
| 243 | __entry->for_reclaim = wbc->for_reclaim; | 250 | __entry->for_reclaim = wbc->for_reclaim; |
| 244 | __entry->for_writepages = wbc->for_writepages; | ||
| 245 | __entry->range_cyclic = wbc->range_cyclic; | 251 | __entry->range_cyclic = wbc->range_cyclic; |
| 246 | ), | 252 | ), |
| 247 | 253 | ||
| 248 | TP_printk("dev %s ino %lu nr_t_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d for_writepages %d range_cyclic %d", | 254 | TP_printk("dev %s ino %lu nr_to_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d range_cyclic %d", |
| 249 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->nr_to_write, | 255 | jbd2_dev_to_name(__entry->dev), |
| 256 | (unsigned long) __entry->ino, __entry->nr_to_write, | ||
| 250 | __entry->pages_skipped, __entry->range_start, | 257 | __entry->pages_skipped, __entry->range_start, |
| 251 | __entry->range_end, __entry->nonblocking, | 258 | __entry->range_end, __entry->nonblocking, |
| 252 | __entry->for_kupdate, __entry->for_reclaim, | 259 | __entry->for_kupdate, __entry->for_reclaim, |
| 253 | __entry->for_writepages, __entry->range_cyclic) | 260 | __entry->range_cyclic) |
| 261 | ); | ||
| 262 | |||
| 263 | TRACE_EVENT(ext4_da_write_pages, | ||
| 264 | TP_PROTO(struct inode *inode, struct mpage_da_data *mpd), | ||
| 265 | |||
| 266 | TP_ARGS(inode, mpd), | ||
| 267 | |||
| 268 | TP_STRUCT__entry( | ||
| 269 | __field( dev_t, dev ) | ||
| 270 | __field( ino_t, ino ) | ||
| 271 | __field( __u64, b_blocknr ) | ||
| 272 | __field( __u32, b_size ) | ||
| 273 | __field( __u32, b_state ) | ||
| 274 | __field( unsigned long, first_page ) | ||
| 275 | __field( int, io_done ) | ||
| 276 | __field( int, pages_written ) | ||
| 277 | ), | ||
| 278 | |||
| 279 | TP_fast_assign( | ||
| 280 | __entry->dev = inode->i_sb->s_dev; | ||
| 281 | __entry->ino = inode->i_ino; | ||
| 282 | __entry->b_blocknr = mpd->b_blocknr; | ||
| 283 | __entry->b_size = mpd->b_size; | ||
| 284 | __entry->b_state = mpd->b_state; | ||
| 285 | __entry->first_page = mpd->first_page; | ||
| 286 | __entry->io_done = mpd->io_done; | ||
| 287 | __entry->pages_written = mpd->pages_written; | ||
| 288 | ), | ||
| 289 | |||
| 290 | TP_printk("dev %s ino %lu b_blocknr %llu b_size %u b_state 0x%04x first_page %lu io_done %d pages_written %d", | ||
| 291 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | ||
| 292 | __entry->b_blocknr, __entry->b_size, | ||
| 293 | __entry->b_state, __entry->first_page, | ||
| 294 | __entry->io_done, __entry->pages_written) | ||
| 254 | ); | 295 | ); |
| 255 | 296 | ||
| 256 | TRACE_EVENT(ext4_da_writepages_result, | 297 | TRACE_EVENT(ext4_da_writepages_result, |
| @@ -282,7 +323,8 @@ TRACE_EVENT(ext4_da_writepages_result, | |||
| 282 | ), | 323 | ), |
| 283 | 324 | ||
| 284 | TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d", | 325 | TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d", |
| 285 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->ret, | 326 | jbd2_dev_to_name(__entry->dev), |
| 327 | (unsigned long) __entry->ino, __entry->ret, | ||
| 286 | __entry->pages_written, __entry->pages_skipped, | 328 | __entry->pages_written, __entry->pages_skipped, |
| 287 | __entry->encountered_congestion, __entry->more_io, | 329 | __entry->encountered_congestion, __entry->more_io, |
| 288 | __entry->no_nrwrite_index_update) | 330 | __entry->no_nrwrite_index_update) |
| @@ -311,8 +353,8 @@ TRACE_EVENT(ext4_da_write_begin, | |||
| 311 | ), | 353 | ), |
| 312 | 354 | ||
| 313 | TP_printk("dev %s ino %lu pos %llu len %u flags %u", | 355 | TP_printk("dev %s ino %lu pos %llu len %u flags %u", |
| 314 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len, | 356 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 315 | __entry->flags) | 357 | __entry->pos, __entry->len, __entry->flags) |
| 316 | ); | 358 | ); |
| 317 | 359 | ||
| 318 | TRACE_EVENT(ext4_da_write_end, | 360 | TRACE_EVENT(ext4_da_write_end, |
| @@ -338,8 +380,8 @@ TRACE_EVENT(ext4_da_write_end, | |||
| 338 | ), | 380 | ), |
| 339 | 381 | ||
| 340 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", | 382 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", |
| 341 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len, | 383 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 342 | __entry->copied) | 384 | __entry->pos, __entry->len, __entry->copied) |
| 343 | ); | 385 | ); |
| 344 | 386 | ||
| 345 | TRACE_EVENT(ext4_discard_blocks, | 387 | TRACE_EVENT(ext4_discard_blocks, |
| @@ -389,8 +431,8 @@ TRACE_EVENT(ext4_mb_new_inode_pa, | |||
| 389 | ), | 431 | ), |
| 390 | 432 | ||
| 391 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", | 433 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", |
| 392 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pa_pstart, | 434 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 393 | __entry->pa_len, __entry->pa_lstart) | 435 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) |
| 394 | ); | 436 | ); |
| 395 | 437 | ||
| 396 | TRACE_EVENT(ext4_mb_new_group_pa, | 438 | TRACE_EVENT(ext4_mb_new_group_pa, |
| @@ -417,8 +459,8 @@ TRACE_EVENT(ext4_mb_new_group_pa, | |||
| 417 | ), | 459 | ), |
| 418 | 460 | ||
| 419 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", | 461 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", |
| 420 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pa_pstart, | 462 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 421 | __entry->pa_len, __entry->pa_lstart) | 463 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) |
| 422 | ); | 464 | ); |
| 423 | 465 | ||
| 424 | TRACE_EVENT(ext4_mb_release_inode_pa, | 466 | TRACE_EVENT(ext4_mb_release_inode_pa, |
| @@ -444,8 +486,8 @@ TRACE_EVENT(ext4_mb_release_inode_pa, | |||
| 444 | ), | 486 | ), |
| 445 | 487 | ||
| 446 | TP_printk("dev %s ino %lu block %llu count %u", | 488 | TP_printk("dev %s ino %lu block %llu count %u", |
| 447 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->block, | 489 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 448 | __entry->count) | 490 | __entry->block, __entry->count) |
| 449 | ); | 491 | ); |
| 450 | 492 | ||
| 451 | TRACE_EVENT(ext4_mb_release_group_pa, | 493 | TRACE_EVENT(ext4_mb_release_group_pa, |
| @@ -490,7 +532,7 @@ TRACE_EVENT(ext4_discard_preallocations, | |||
| 490 | ), | 532 | ), |
| 491 | 533 | ||
| 492 | TP_printk("dev %s ino %lu", | 534 | TP_printk("dev %s ino %lu", |
| 493 | jbd2_dev_to_name(__entry->dev), __entry->ino) | 535 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino) |
| 494 | ); | 536 | ); |
| 495 | 537 | ||
| 496 | TRACE_EVENT(ext4_mb_discard_preallocations, | 538 | TRACE_EVENT(ext4_mb_discard_preallocations, |
| @@ -545,8 +587,8 @@ TRACE_EVENT(ext4_request_blocks, | |||
| 545 | ), | 587 | ), |
| 546 | 588 | ||
| 547 | TP_printk("dev %s ino %lu flags %u len %u lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", | 589 | TP_printk("dev %s ino %lu flags %u len %u lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", |
| 548 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->flags, | 590 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 549 | __entry->len, | 591 | __entry->flags, __entry->len, |
| 550 | (unsigned long long) __entry->logical, | 592 | (unsigned long long) __entry->logical, |
| 551 | (unsigned long long) __entry->goal, | 593 | (unsigned long long) __entry->goal, |
| 552 | (unsigned long long) __entry->lleft, | 594 | (unsigned long long) __entry->lleft, |
| @@ -589,8 +631,8 @@ TRACE_EVENT(ext4_allocate_blocks, | |||
| 589 | ), | 631 | ), |
| 590 | 632 | ||
| 591 | TP_printk("dev %s ino %lu flags %u len %u block %llu lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", | 633 | TP_printk("dev %s ino %lu flags %u len %u block %llu lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", |
| 592 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->flags, | 634 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 593 | __entry->len, __entry->block, | 635 | __entry->flags, __entry->len, __entry->block, |
| 594 | (unsigned long long) __entry->logical, | 636 | (unsigned long long) __entry->logical, |
| 595 | (unsigned long long) __entry->goal, | 637 | (unsigned long long) __entry->goal, |
| 596 | (unsigned long long) __entry->lleft, | 638 | (unsigned long long) __entry->lleft, |
| @@ -623,8 +665,8 @@ TRACE_EVENT(ext4_free_blocks, | |||
| 623 | ), | 665 | ), |
| 624 | 666 | ||
| 625 | TP_printk("dev %s ino %lu block %llu count %lu metadata %d", | 667 | TP_printk("dev %s ino %lu block %llu count %lu metadata %d", |
| 626 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->block, | 668 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 627 | __entry->count, __entry->metadata) | 669 | __entry->block, __entry->count, __entry->metadata) |
| 628 | ); | 670 | ); |
| 629 | 671 | ||
| 630 | TRACE_EVENT(ext4_sync_file, | 672 | TRACE_EVENT(ext4_sync_file, |
| @@ -647,8 +689,8 @@ TRACE_EVENT(ext4_sync_file, | |||
| 647 | ), | 689 | ), |
| 648 | 690 | ||
| 649 | TP_printk("dev %s ino %ld parent %ld datasync %d ", | 691 | TP_printk("dev %s ino %ld parent %ld datasync %d ", |
| 650 | jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->parent, | 692 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, |
| 651 | __entry->datasync) | 693 | (unsigned long) __entry->parent, __entry->datasync) |
| 652 | ); | 694 | ); |
| 653 | 695 | ||
| 654 | TRACE_EVENT(ext4_sync_fs, | 696 | TRACE_EVENT(ext4_sync_fs, |
| @@ -671,6 +713,30 @@ TRACE_EVENT(ext4_sync_fs, | |||
| 671 | __entry->wait) | 713 | __entry->wait) |
| 672 | ); | 714 | ); |
| 673 | 715 | ||
| 716 | TRACE_EVENT(ext4_alloc_da_blocks, | ||
| 717 | TP_PROTO(struct inode *inode), | ||
| 718 | |||
| 719 | TP_ARGS(inode), | ||
| 720 | |||
| 721 | TP_STRUCT__entry( | ||
| 722 | __field( dev_t, dev ) | ||
| 723 | __field( ino_t, ino ) | ||
| 724 | __field( unsigned int, data_blocks ) | ||
| 725 | __field( unsigned int, meta_blocks ) | ||
| 726 | ), | ||
| 727 | |||
| 728 | TP_fast_assign( | ||
| 729 | __entry->dev = inode->i_sb->s_dev; | ||
| 730 | __entry->ino = inode->i_ino; | ||
| 731 | __entry->data_blocks = EXT4_I(inode)->i_reserved_data_blocks; | ||
| 732 | __entry->meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks; | ||
| 733 | ), | ||
| 734 | |||
| 735 | TP_printk("dev %s ino %lu data_blocks %u meta_blocks %u", | ||
| 736 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | ||
| 737 | __entry->data_blocks, __entry->meta_blocks) | ||
| 738 | ); | ||
| 739 | |||
| 674 | #endif /* _TRACE_EXT4_H */ | 740 | #endif /* _TRACE_EXT4_H */ |
| 675 | 741 | ||
| 676 | /* This part must be outside protection */ | 742 | /* This part must be outside protection */ |
diff --git a/include/trace/events/irq.h b/include/trace/events/irq.h index 1cb0c3aa11e6..b89f9db4a404 100644 --- a/include/trace/events/irq.h +++ b/include/trace/events/irq.h | |||
| @@ -8,16 +8,17 @@ | |||
| 8 | #include <linux/interrupt.h> | 8 | #include <linux/interrupt.h> |
| 9 | 9 | ||
| 10 | #define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq } | 10 | #define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq } |
| 11 | #define show_softirq_name(val) \ | 11 | #define show_softirq_name(val) \ |
| 12 | __print_symbolic(val, \ | 12 | __print_symbolic(val, \ |
| 13 | softirq_name(HI), \ | 13 | softirq_name(HI), \ |
| 14 | softirq_name(TIMER), \ | 14 | softirq_name(TIMER), \ |
| 15 | softirq_name(NET_TX), \ | 15 | softirq_name(NET_TX), \ |
| 16 | softirq_name(NET_RX), \ | 16 | softirq_name(NET_RX), \ |
| 17 | softirq_name(BLOCK), \ | 17 | softirq_name(BLOCK), \ |
| 18 | softirq_name(TASKLET), \ | 18 | softirq_name(BLOCK_IOPOLL), \ |
| 19 | softirq_name(SCHED), \ | 19 | softirq_name(TASKLET), \ |
| 20 | softirq_name(HRTIMER), \ | 20 | softirq_name(SCHED), \ |
| 21 | softirq_name(HRTIMER), \ | ||
| 21 | softirq_name(RCU)) | 22 | softirq_name(RCU)) |
| 22 | 23 | ||
| 23 | /** | 24 | /** |
diff --git a/include/trace/events/jbd2.h b/include/trace/events/jbd2.h index 10813fa0c8d0..b851f0b4701c 100644 --- a/include/trace/events/jbd2.h +++ b/include/trace/events/jbd2.h | |||
| @@ -159,7 +159,7 @@ TRACE_EVENT(jbd2_submit_inode_data, | |||
| 159 | ), | 159 | ), |
| 160 | 160 | ||
| 161 | TP_printk("dev %s ino %lu", | 161 | TP_printk("dev %s ino %lu", |
| 162 | jbd2_dev_to_name(__entry->dev), __entry->ino) | 162 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino) |
| 163 | ); | 163 | ); |
| 164 | 164 | ||
| 165 | #endif /* _TRACE_JBD2_H */ | 165 | #endif /* _TRACE_JBD2_H */ |
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h new file mode 100644 index 000000000000..dbe108455275 --- /dev/null +++ b/include/trace/events/kvm.h | |||
| @@ -0,0 +1,151 @@ | |||
| 1 | #if !defined(_TRACE_KVM_MAIN_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 2 | #define _TRACE_KVM_MAIN_H | ||
| 3 | |||
| 4 | #include <linux/tracepoint.h> | ||
| 5 | |||
| 6 | #undef TRACE_SYSTEM | ||
| 7 | #define TRACE_SYSTEM kvm | ||
| 8 | #define TRACE_INCLUDE_FILE kvm | ||
| 9 | |||
| 10 | #if defined(__KVM_HAVE_IOAPIC) | ||
| 11 | TRACE_EVENT(kvm_set_irq, | ||
| 12 | TP_PROTO(unsigned int gsi, int level, int irq_source_id), | ||
| 13 | TP_ARGS(gsi, level, irq_source_id), | ||
| 14 | |||
| 15 | TP_STRUCT__entry( | ||
| 16 | __field( unsigned int, gsi ) | ||
| 17 | __field( int, level ) | ||
| 18 | __field( int, irq_source_id ) | ||
| 19 | ), | ||
| 20 | |||
| 21 | TP_fast_assign( | ||
| 22 | __entry->gsi = gsi; | ||
| 23 | __entry->level = level; | ||
| 24 | __entry->irq_source_id = irq_source_id; | ||
| 25 | ), | ||
| 26 | |||
| 27 | TP_printk("gsi %u level %d source %d", | ||
| 28 | __entry->gsi, __entry->level, __entry->irq_source_id) | ||
| 29 | ); | ||
| 30 | |||
| 31 | #define kvm_deliver_mode \ | ||
| 32 | {0x0, "Fixed"}, \ | ||
| 33 | {0x1, "LowPrio"}, \ | ||
| 34 | {0x2, "SMI"}, \ | ||
| 35 | {0x3, "Res3"}, \ | ||
| 36 | {0x4, "NMI"}, \ | ||
| 37 | {0x5, "INIT"}, \ | ||
| 38 | {0x6, "SIPI"}, \ | ||
| 39 | {0x7, "ExtINT"} | ||
| 40 | |||
| 41 | TRACE_EVENT(kvm_ioapic_set_irq, | ||
| 42 | TP_PROTO(__u64 e, int pin, bool coalesced), | ||
| 43 | TP_ARGS(e, pin, coalesced), | ||
| 44 | |||
| 45 | TP_STRUCT__entry( | ||
| 46 | __field( __u64, e ) | ||
| 47 | __field( int, pin ) | ||
| 48 | __field( bool, coalesced ) | ||
| 49 | ), | ||
| 50 | |||
| 51 | TP_fast_assign( | ||
| 52 | __entry->e = e; | ||
| 53 | __entry->pin = pin; | ||
| 54 | __entry->coalesced = coalesced; | ||
| 55 | ), | ||
| 56 | |||
| 57 | TP_printk("pin %u dst %x vec=%u (%s|%s|%s%s)%s", | ||
| 58 | __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e, | ||
| 59 | __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), | ||
| 60 | (__entry->e & (1<<11)) ? "logical" : "physical", | ||
| 61 | (__entry->e & (1<<15)) ? "level" : "edge", | ||
| 62 | (__entry->e & (1<<16)) ? "|masked" : "", | ||
| 63 | __entry->coalesced ? " (coalesced)" : "") | ||
| 64 | ); | ||
| 65 | |||
| 66 | TRACE_EVENT(kvm_msi_set_irq, | ||
| 67 | TP_PROTO(__u64 address, __u64 data), | ||
| 68 | TP_ARGS(address, data), | ||
| 69 | |||
| 70 | TP_STRUCT__entry( | ||
| 71 | __field( __u64, address ) | ||
| 72 | __field( __u64, data ) | ||
| 73 | ), | ||
| 74 | |||
| 75 | TP_fast_assign( | ||
| 76 | __entry->address = address; | ||
| 77 | __entry->data = data; | ||
| 78 | ), | ||
| 79 | |||
| 80 | TP_printk("dst %u vec %x (%s|%s|%s%s)", | ||
| 81 | (u8)(__entry->address >> 12), (u8)__entry->data, | ||
| 82 | __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode), | ||
| 83 | (__entry->address & (1<<2)) ? "logical" : "physical", | ||
| 84 | (__entry->data & (1<<15)) ? "level" : "edge", | ||
| 85 | (__entry->address & (1<<3)) ? "|rh" : "") | ||
| 86 | ); | ||
| 87 | |||
| 88 | #define kvm_irqchips \ | ||
| 89 | {KVM_IRQCHIP_PIC_MASTER, "PIC master"}, \ | ||
| 90 | {KVM_IRQCHIP_PIC_SLAVE, "PIC slave"}, \ | ||
| 91 | {KVM_IRQCHIP_IOAPIC, "IOAPIC"} | ||
| 92 | |||
| 93 | TRACE_EVENT(kvm_ack_irq, | ||
| 94 | TP_PROTO(unsigned int irqchip, unsigned int pin), | ||
| 95 | TP_ARGS(irqchip, pin), | ||
| 96 | |||
| 97 | TP_STRUCT__entry( | ||
| 98 | __field( unsigned int, irqchip ) | ||
| 99 | __field( unsigned int, pin ) | ||
| 100 | ), | ||
| 101 | |||
| 102 | TP_fast_assign( | ||
| 103 | __entry->irqchip = irqchip; | ||
| 104 | __entry->pin = pin; | ||
| 105 | ), | ||
| 106 | |||
| 107 | TP_printk("irqchip %s pin %u", | ||
| 108 | __print_symbolic(__entry->irqchip, kvm_irqchips), | ||
| 109 | __entry->pin) | ||
| 110 | ); | ||
| 111 | |||
| 112 | |||
| 113 | |||
| 114 | #endif /* defined(__KVM_HAVE_IOAPIC) */ | ||
| 115 | |||
| 116 | #define KVM_TRACE_MMIO_READ_UNSATISFIED 0 | ||
| 117 | #define KVM_TRACE_MMIO_READ 1 | ||
| 118 | #define KVM_TRACE_MMIO_WRITE 2 | ||
| 119 | |||
| 120 | #define kvm_trace_symbol_mmio \ | ||
| 121 | { KVM_TRACE_MMIO_READ_UNSATISFIED, "unsatisfied-read" }, \ | ||
| 122 | { KVM_TRACE_MMIO_READ, "read" }, \ | ||
| 123 | { KVM_TRACE_MMIO_WRITE, "write" } | ||
| 124 | |||
| 125 | TRACE_EVENT(kvm_mmio, | ||
| 126 | TP_PROTO(int type, int len, u64 gpa, u64 val), | ||
| 127 | TP_ARGS(type, len, gpa, val), | ||
| 128 | |||
| 129 | TP_STRUCT__entry( | ||
| 130 | __field( u32, type ) | ||
| 131 | __field( u32, len ) | ||
| 132 | __field( u64, gpa ) | ||
| 133 | __field( u64, val ) | ||
| 134 | ), | ||
| 135 | |||
| 136 | TP_fast_assign( | ||
| 137 | __entry->type = type; | ||
| 138 | __entry->len = len; | ||
| 139 | __entry->gpa = gpa; | ||
| 140 | __entry->val = val; | ||
| 141 | ), | ||
| 142 | |||
| 143 | TP_printk("mmio %s len %u gpa 0x%llx val 0x%llx", | ||
| 144 | __print_symbolic(__entry->type, kvm_trace_symbol_mmio), | ||
| 145 | __entry->len, __entry->gpa, __entry->val) | ||
| 146 | ); | ||
| 147 | |||
| 148 | #endif /* _TRACE_KVM_MAIN_H */ | ||
| 149 | |||
| 150 | /* This part must be outside protection */ | ||
| 151 | #include <trace/define_trace.h> | ||
diff --git a/include/trace/events/module.h b/include/trace/events/module.h new file mode 100644 index 000000000000..84160fb18478 --- /dev/null +++ b/include/trace/events/module.h | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | #undef TRACE_SYSTEM | ||
| 2 | #define TRACE_SYSTEM module | ||
| 3 | |||
| 4 | #if !defined(_TRACE_MODULE_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 5 | #define _TRACE_MODULE_H | ||
| 6 | |||
| 7 | #include <linux/tracepoint.h> | ||
| 8 | |||
| 9 | #ifdef CONFIG_MODULES | ||
| 10 | |||
| 11 | struct module; | ||
| 12 | |||
| 13 | #define show_module_flags(flags) __print_flags(flags, "", \ | ||
| 14 | { (1UL << TAINT_PROPRIETARY_MODULE), "P" }, \ | ||
| 15 | { (1UL << TAINT_FORCED_MODULE), "F" }, \ | ||
| 16 | { (1UL << TAINT_CRAP), "C" }) | ||
| 17 | |||
| 18 | TRACE_EVENT(module_load, | ||
| 19 | |||
| 20 | TP_PROTO(struct module *mod), | ||
| 21 | |||
| 22 | TP_ARGS(mod), | ||
| 23 | |||
| 24 | TP_STRUCT__entry( | ||
| 25 | __field( unsigned int, taints ) | ||
| 26 | __string( name, mod->name ) | ||
| 27 | ), | ||
| 28 | |||
| 29 | TP_fast_assign( | ||
| 30 | __entry->taints = mod->taints; | ||
| 31 | __assign_str(name, mod->name); | ||
| 32 | ), | ||
| 33 | |||
| 34 | TP_printk("%s %s", __get_str(name), show_module_flags(__entry->taints)) | ||
| 35 | ); | ||
| 36 | |||
| 37 | TRACE_EVENT(module_free, | ||
| 38 | |||
| 39 | TP_PROTO(struct module *mod), | ||
| 40 | |||
| 41 | TP_ARGS(mod), | ||
| 42 | |||
| 43 | TP_STRUCT__entry( | ||
| 44 | __string( name, mod->name ) | ||
| 45 | ), | ||
| 46 | |||
| 47 | TP_fast_assign( | ||
| 48 | __assign_str(name, mod->name); | ||
| 49 | ), | ||
| 50 | |||
| 51 | TP_printk("%s", __get_str(name)) | ||
| 52 | ); | ||
| 53 | |||
| 54 | TRACE_EVENT(module_get, | ||
| 55 | |||
| 56 | TP_PROTO(struct module *mod, unsigned long ip, int refcnt), | ||
| 57 | |||
| 58 | TP_ARGS(mod, ip, refcnt), | ||
| 59 | |||
| 60 | TP_STRUCT__entry( | ||
| 61 | __field( unsigned long, ip ) | ||
| 62 | __field( int, refcnt ) | ||
| 63 | __string( name, mod->name ) | ||
| 64 | ), | ||
| 65 | |||
| 66 | TP_fast_assign( | ||
| 67 | __entry->ip = ip; | ||
| 68 | __entry->refcnt = refcnt; | ||
| 69 | __assign_str(name, mod->name); | ||
| 70 | ), | ||
| 71 | |||
| 72 | TP_printk("%s call_site=%pf refcnt=%d", | ||
| 73 | __get_str(name), (void *)__entry->ip, __entry->refcnt) | ||
| 74 | ); | ||
| 75 | |||
| 76 | TRACE_EVENT(module_put, | ||
| 77 | |||
| 78 | TP_PROTO(struct module *mod, unsigned long ip, int refcnt), | ||
| 79 | |||
| 80 | TP_ARGS(mod, ip, refcnt), | ||
| 81 | |||
| 82 | TP_STRUCT__entry( | ||
| 83 | __field( unsigned long, ip ) | ||
| 84 | __field( int, refcnt ) | ||
| 85 | __string( name, mod->name ) | ||
| 86 | ), | ||
| 87 | |||
| 88 | TP_fast_assign( | ||
| 89 | __entry->ip = ip; | ||
| 90 | __entry->refcnt = refcnt; | ||
| 91 | __assign_str(name, mod->name); | ||
| 92 | ), | ||
| 93 | |||
| 94 | TP_printk("%s call_site=%pf refcnt=%d", | ||
| 95 | __get_str(name), (void *)__entry->ip, __entry->refcnt) | ||
| 96 | ); | ||
| 97 | |||
| 98 | TRACE_EVENT(module_request, | ||
| 99 | |||
| 100 | TP_PROTO(char *name, bool wait, unsigned long ip), | ||
| 101 | |||
| 102 | TP_ARGS(name, wait, ip), | ||
| 103 | |||
| 104 | TP_STRUCT__entry( | ||
| 105 | __field( bool, wait ) | ||
| 106 | __field( unsigned long, ip ) | ||
| 107 | __string( name, name ) | ||
| 108 | ), | ||
| 109 | |||
| 110 | TP_fast_assign( | ||
| 111 | __entry->wait = wait; | ||
| 112 | __entry->ip = ip; | ||
| 113 | __assign_str(name, name); | ||
| 114 | ), | ||
| 115 | |||
| 116 | TP_printk("%s wait=%d call_site=%pf", | ||
| 117 | __get_str(name), (int)__entry->wait, (void *)__entry->ip) | ||
| 118 | ); | ||
| 119 | |||
| 120 | #endif /* CONFIG_MODULES */ | ||
| 121 | |||
| 122 | #endif /* _TRACE_MODULE_H */ | ||
| 123 | |||
| 124 | /* This part must be outside protection */ | ||
| 125 | #include <trace/define_trace.h> | ||
| 126 | |||
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 8949bb7eb082..b48f1ad7c946 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h | |||
| @@ -94,6 +94,7 @@ TRACE_EVENT(sched_wakeup, | |||
| 94 | __field( pid_t, pid ) | 94 | __field( pid_t, pid ) |
| 95 | __field( int, prio ) | 95 | __field( int, prio ) |
| 96 | __field( int, success ) | 96 | __field( int, success ) |
| 97 | __field( int, cpu ) | ||
| 97 | ), | 98 | ), |
| 98 | 99 | ||
| 99 | TP_fast_assign( | 100 | TP_fast_assign( |
| @@ -101,11 +102,12 @@ TRACE_EVENT(sched_wakeup, | |||
| 101 | __entry->pid = p->pid; | 102 | __entry->pid = p->pid; |
| 102 | __entry->prio = p->prio; | 103 | __entry->prio = p->prio; |
| 103 | __entry->success = success; | 104 | __entry->success = success; |
| 105 | __entry->cpu = task_cpu(p); | ||
| 104 | ), | 106 | ), |
| 105 | 107 | ||
| 106 | TP_printk("task %s:%d [%d] success=%d", | 108 | TP_printk("task %s:%d [%d] success=%d [%03d]", |
| 107 | __entry->comm, __entry->pid, __entry->prio, | 109 | __entry->comm, __entry->pid, __entry->prio, |
| 108 | __entry->success) | 110 | __entry->success, __entry->cpu) |
| 109 | ); | 111 | ); |
| 110 | 112 | ||
| 111 | /* | 113 | /* |
| @@ -125,6 +127,7 @@ TRACE_EVENT(sched_wakeup_new, | |||
| 125 | __field( pid_t, pid ) | 127 | __field( pid_t, pid ) |
| 126 | __field( int, prio ) | 128 | __field( int, prio ) |
| 127 | __field( int, success ) | 129 | __field( int, success ) |
| 130 | __field( int, cpu ) | ||
| 128 | ), | 131 | ), |
| 129 | 132 | ||
| 130 | TP_fast_assign( | 133 | TP_fast_assign( |
| @@ -132,11 +135,12 @@ TRACE_EVENT(sched_wakeup_new, | |||
| 132 | __entry->pid = p->pid; | 135 | __entry->pid = p->pid; |
| 133 | __entry->prio = p->prio; | 136 | __entry->prio = p->prio; |
| 134 | __entry->success = success; | 137 | __entry->success = success; |
| 138 | __entry->cpu = task_cpu(p); | ||
| 135 | ), | 139 | ), |
| 136 | 140 | ||
| 137 | TP_printk("task %s:%d [%d] success=%d", | 141 | TP_printk("task %s:%d [%d] success=%d [%03d]", |
| 138 | __entry->comm, __entry->pid, __entry->prio, | 142 | __entry->comm, __entry->pid, __entry->prio, |
| 139 | __entry->success) | 143 | __entry->success, __entry->cpu) |
| 140 | ); | 144 | ); |
| 141 | 145 | ||
| 142 | /* | 146 | /* |
| @@ -340,6 +344,101 @@ TRACE_EVENT(sched_signal_send, | |||
| 340 | __entry->sig, __entry->comm, __entry->pid) | 344 | __entry->sig, __entry->comm, __entry->pid) |
| 341 | ); | 345 | ); |
| 342 | 346 | ||
| 347 | /* | ||
| 348 | * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE | ||
| 349 | * adding sched_stat support to SCHED_FIFO/RR would be welcome. | ||
| 350 | */ | ||
| 351 | |||
| 352 | /* | ||
| 353 | * Tracepoint for accounting wait time (time the task is runnable | ||
| 354 | * but not actually running due to scheduler contention). | ||
| 355 | */ | ||
| 356 | TRACE_EVENT(sched_stat_wait, | ||
| 357 | |||
| 358 | TP_PROTO(struct task_struct *tsk, u64 delay), | ||
| 359 | |||
| 360 | TP_ARGS(tsk, delay), | ||
| 361 | |||
| 362 | TP_STRUCT__entry( | ||
| 363 | __array( char, comm, TASK_COMM_LEN ) | ||
| 364 | __field( pid_t, pid ) | ||
| 365 | __field( u64, delay ) | ||
| 366 | ), | ||
| 367 | |||
| 368 | TP_fast_assign( | ||
| 369 | memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); | ||
| 370 | __entry->pid = tsk->pid; | ||
| 371 | __entry->delay = delay; | ||
| 372 | ) | ||
| 373 | TP_perf_assign( | ||
| 374 | __perf_count(delay); | ||
| 375 | ), | ||
| 376 | |||
| 377 | TP_printk("task: %s:%d wait: %Lu [ns]", | ||
| 378 | __entry->comm, __entry->pid, | ||
| 379 | (unsigned long long)__entry->delay) | ||
| 380 | ); | ||
| 381 | |||
| 382 | /* | ||
| 383 | * Tracepoint for accounting sleep time (time the task is not runnable, | ||
| 384 | * including iowait, see below). | ||
| 385 | */ | ||
| 386 | TRACE_EVENT(sched_stat_sleep, | ||
| 387 | |||
| 388 | TP_PROTO(struct task_struct *tsk, u64 delay), | ||
| 389 | |||
| 390 | TP_ARGS(tsk, delay), | ||
| 391 | |||
| 392 | TP_STRUCT__entry( | ||
| 393 | __array( char, comm, TASK_COMM_LEN ) | ||
| 394 | __field( pid_t, pid ) | ||
| 395 | __field( u64, delay ) | ||
| 396 | ), | ||
| 397 | |||
| 398 | TP_fast_assign( | ||
| 399 | memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); | ||
| 400 | __entry->pid = tsk->pid; | ||
| 401 | __entry->delay = delay; | ||
| 402 | ) | ||
| 403 | TP_perf_assign( | ||
| 404 | __perf_count(delay); | ||
| 405 | ), | ||
| 406 | |||
| 407 | TP_printk("task: %s:%d sleep: %Lu [ns]", | ||
| 408 | __entry->comm, __entry->pid, | ||
| 409 | (unsigned long long)__entry->delay) | ||
| 410 | ); | ||
| 411 | |||
| 412 | /* | ||
| 413 | * Tracepoint for accounting iowait time (time the task is not runnable | ||
| 414 | * due to waiting on IO to complete). | ||
| 415 | */ | ||
| 416 | TRACE_EVENT(sched_stat_iowait, | ||
| 417 | |||
| 418 | TP_PROTO(struct task_struct *tsk, u64 delay), | ||
| 419 | |||
| 420 | TP_ARGS(tsk, delay), | ||
| 421 | |||
| 422 | TP_STRUCT__entry( | ||
| 423 | __array( char, comm, TASK_COMM_LEN ) | ||
| 424 | __field( pid_t, pid ) | ||
| 425 | __field( u64, delay ) | ||
| 426 | ), | ||
| 427 | |||
| 428 | TP_fast_assign( | ||
| 429 | memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); | ||
| 430 | __entry->pid = tsk->pid; | ||
| 431 | __entry->delay = delay; | ||
| 432 | ) | ||
| 433 | TP_perf_assign( | ||
| 434 | __perf_count(delay); | ||
| 435 | ), | ||
| 436 | |||
| 437 | TP_printk("task: %s:%d iowait: %Lu [ns]", | ||
| 438 | __entry->comm, __entry->pid, | ||
| 439 | (unsigned long long)__entry->delay) | ||
| 440 | ); | ||
| 441 | |||
| 343 | #endif /* _TRACE_SCHED_H */ | 442 | #endif /* _TRACE_SCHED_H */ |
| 344 | 443 | ||
| 345 | /* This part must be outside protection */ | 444 | /* This part must be outside protection */ |
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h index e499863b9669..4b2be6dc76f0 100644 --- a/include/trace/events/skb.h +++ b/include/trace/events/skb.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #define _TRACE_SKB_H | 5 | #define _TRACE_SKB_H |
| 6 | 6 | ||
| 7 | #include <linux/skbuff.h> | 7 | #include <linux/skbuff.h> |
| 8 | #include <linux/netdevice.h> | ||
| 8 | #include <linux/tracepoint.h> | 9 | #include <linux/tracepoint.h> |
| 9 | 10 | ||
| 10 | /* | 11 | /* |
| @@ -34,6 +35,25 @@ TRACE_EVENT(kfree_skb, | |||
| 34 | __entry->skbaddr, __entry->protocol, __entry->location) | 35 | __entry->skbaddr, __entry->protocol, __entry->location) |
| 35 | ); | 36 | ); |
| 36 | 37 | ||
| 38 | TRACE_EVENT(skb_copy_datagram_iovec, | ||
| 39 | |||
| 40 | TP_PROTO(const struct sk_buff *skb, int len), | ||
| 41 | |||
| 42 | TP_ARGS(skb, len), | ||
| 43 | |||
| 44 | TP_STRUCT__entry( | ||
| 45 | __field( const void *, skbaddr ) | ||
| 46 | __field( int, len ) | ||
| 47 | ), | ||
| 48 | |||
| 49 | TP_fast_assign( | ||
| 50 | __entry->skbaddr = skb; | ||
| 51 | __entry->len = len; | ||
| 52 | ), | ||
| 53 | |||
| 54 | TP_printk("skbaddr=%p len=%d", __entry->skbaddr, __entry->len) | ||
| 55 | ); | ||
| 56 | |||
| 37 | #endif /* _TRACE_SKB_H */ | 57 | #endif /* _TRACE_SKB_H */ |
| 38 | 58 | ||
| 39 | /* This part must be outside protection */ | 59 | /* This part must be outside protection */ |
diff --git a/include/trace/events/syscalls.h b/include/trace/events/syscalls.h new file mode 100644 index 000000000000..397dff2dbd5a --- /dev/null +++ b/include/trace/events/syscalls.h | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | #undef TRACE_SYSTEM | ||
| 2 | #define TRACE_SYSTEM syscalls | ||
| 3 | |||
| 4 | #if !defined(_TRACE_EVENTS_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 5 | #define _TRACE_EVENTS_SYSCALLS_H | ||
| 6 | |||
| 7 | #include <linux/tracepoint.h> | ||
| 8 | |||
| 9 | #include <asm/ptrace.h> | ||
| 10 | #include <asm/syscall.h> | ||
| 11 | |||
| 12 | |||
| 13 | #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS | ||
| 14 | |||
| 15 | extern void syscall_regfunc(void); | ||
| 16 | extern void syscall_unregfunc(void); | ||
| 17 | |||
| 18 | TRACE_EVENT_FN(sys_enter, | ||
| 19 | |||
| 20 | TP_PROTO(struct pt_regs *regs, long id), | ||
| 21 | |||
| 22 | TP_ARGS(regs, id), | ||
| 23 | |||
| 24 | TP_STRUCT__entry( | ||
| 25 | __field( long, id ) | ||
| 26 | __array( unsigned long, args, 6 ) | ||
| 27 | ), | ||
| 28 | |||
| 29 | TP_fast_assign( | ||
| 30 | __entry->id = id; | ||
| 31 | syscall_get_arguments(current, regs, 0, 6, __entry->args); | ||
| 32 | ), | ||
| 33 | |||
| 34 | TP_printk("NR %ld (%lx, %lx, %lx, %lx, %lx, %lx)", | ||
| 35 | __entry->id, | ||
| 36 | __entry->args[0], __entry->args[1], __entry->args[2], | ||
| 37 | __entry->args[3], __entry->args[4], __entry->args[5]), | ||
| 38 | |||
| 39 | syscall_regfunc, syscall_unregfunc | ||
| 40 | ); | ||
| 41 | |||
| 42 | TRACE_EVENT_FN(sys_exit, | ||
| 43 | |||
| 44 | TP_PROTO(struct pt_regs *regs, long ret), | ||
| 45 | |||
| 46 | TP_ARGS(regs, ret), | ||
| 47 | |||
| 48 | TP_STRUCT__entry( | ||
| 49 | __field( long, id ) | ||
| 50 | __field( long, ret ) | ||
| 51 | ), | ||
| 52 | |||
| 53 | TP_fast_assign( | ||
| 54 | __entry->id = syscall_get_nr(current, regs); | ||
| 55 | __entry->ret = ret; | ||
| 56 | ), | ||
| 57 | |||
| 58 | TP_printk("NR %ld = %ld", | ||
| 59 | __entry->id, __entry->ret), | ||
| 60 | |||
| 61 | syscall_regfunc, syscall_unregfunc | ||
| 62 | ); | ||
| 63 | |||
| 64 | #endif /* CONFIG_HAVE_SYSCALL_TRACEPOINTS */ | ||
| 65 | |||
| 66 | #endif /* _TRACE_EVENTS_SYSCALLS_H */ | ||
| 67 | |||
| 68 | /* This part must be outside protection */ | ||
| 69 | #include <trace/define_trace.h> | ||
| 70 | |||
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index f64fbaae781a..72a3b437b829 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
| @@ -21,11 +21,14 @@ | |||
| 21 | #undef __field | 21 | #undef __field |
| 22 | #define __field(type, item) type item; | 22 | #define __field(type, item) type item; |
| 23 | 23 | ||
| 24 | #undef __field_ext | ||
| 25 | #define __field_ext(type, item, filter_type) type item; | ||
| 26 | |||
| 24 | #undef __array | 27 | #undef __array |
| 25 | #define __array(type, item, len) type item[len]; | 28 | #define __array(type, item, len) type item[len]; |
| 26 | 29 | ||
| 27 | #undef __dynamic_array | 30 | #undef __dynamic_array |
| 28 | #define __dynamic_array(type, item, len) unsigned short __data_loc_##item; | 31 | #define __dynamic_array(type, item, len) u32 __data_loc_##item; |
| 29 | 32 | ||
| 30 | #undef __string | 33 | #undef __string |
| 31 | #define __string(item, src) __dynamic_array(char, item, -1) | 34 | #define __string(item, src) __dynamic_array(char, item, -1) |
| @@ -42,6 +45,16 @@ | |||
| 42 | }; \ | 45 | }; \ |
| 43 | static struct ftrace_event_call event_##name | 46 | static struct ftrace_event_call event_##name |
| 44 | 47 | ||
| 48 | #undef __cpparg | ||
| 49 | #define __cpparg(arg...) arg | ||
| 50 | |||
| 51 | /* Callbacks are meaningless to ftrace. */ | ||
| 52 | #undef TRACE_EVENT_FN | ||
| 53 | #define TRACE_EVENT_FN(name, proto, args, tstruct, \ | ||
| 54 | assign, print, reg, unreg) \ | ||
| 55 | TRACE_EVENT(name, __cpparg(proto), __cpparg(args), \ | ||
| 56 | __cpparg(tstruct), __cpparg(assign), __cpparg(print)) \ | ||
| 57 | |||
| 45 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 58 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
| 46 | 59 | ||
| 47 | 60 | ||
| @@ -51,23 +64,27 @@ | |||
| 51 | * Include the following: | 64 | * Include the following: |
| 52 | * | 65 | * |
| 53 | * struct ftrace_data_offsets_<call> { | 66 | * struct ftrace_data_offsets_<call> { |
| 54 | * int <item1>; | 67 | * u32 <item1>; |
| 55 | * int <item2>; | 68 | * u32 <item2>; |
| 56 | * [...] | 69 | * [...] |
| 57 | * }; | 70 | * }; |
| 58 | * | 71 | * |
| 59 | * The __dynamic_array() macro will create each int <item>, this is | 72 | * The __dynamic_array() macro will create each u32 <item>, this is |
| 60 | * to keep the offset of each array from the beginning of the event. | 73 | * to keep the offset of each array from the beginning of the event. |
| 74 | * The size of an array is also encoded, in the higher 16 bits of <item>. | ||
| 61 | */ | 75 | */ |
| 62 | 76 | ||
| 63 | #undef __field | 77 | #undef __field |
| 64 | #define __field(type, item); | 78 | #define __field(type, item) |
| 79 | |||
| 80 | #undef __field_ext | ||
| 81 | #define __field_ext(type, item, filter_type) | ||
| 65 | 82 | ||
| 66 | #undef __array | 83 | #undef __array |
| 67 | #define __array(type, item, len) | 84 | #define __array(type, item, len) |
| 68 | 85 | ||
| 69 | #undef __dynamic_array | 86 | #undef __dynamic_array |
| 70 | #define __dynamic_array(type, item, len) int item; | 87 | #define __dynamic_array(type, item, len) u32 item; |
| 71 | 88 | ||
| 72 | #undef __string | 89 | #undef __string |
| 73 | #define __string(item, src) __dynamic_array(char, item, -1) | 90 | #define __string(item, src) __dynamic_array(char, item, -1) |
| @@ -109,6 +126,9 @@ | |||
| 109 | if (!ret) \ | 126 | if (!ret) \ |
| 110 | return 0; | 127 | return 0; |
| 111 | 128 | ||
| 129 | #undef __field_ext | ||
| 130 | #define __field_ext(type, item, filter_type) __field(type, item) | ||
| 131 | |||
| 112 | #undef __array | 132 | #undef __array |
| 113 | #define __array(type, item, len) \ | 133 | #define __array(type, item, len) \ |
| 114 | ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \ | 134 | ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \ |
| @@ -120,7 +140,7 @@ | |||
| 120 | 140 | ||
| 121 | #undef __dynamic_array | 141 | #undef __dynamic_array |
| 122 | #define __dynamic_array(type, item, len) \ | 142 | #define __dynamic_array(type, item, len) \ |
| 123 | ret = trace_seq_printf(s, "\tfield:__data_loc " #item ";\t" \ | 143 | ret = trace_seq_printf(s, "\tfield:__data_loc " #type "[] " #item ";\t"\ |
| 124 | "offset:%u;\tsize:%u;\n", \ | 144 | "offset:%u;\tsize:%u;\n", \ |
| 125 | (unsigned int)offsetof(typeof(field), \ | 145 | (unsigned int)offsetof(typeof(field), \ |
| 126 | __data_loc_##item), \ | 146 | __data_loc_##item), \ |
| @@ -150,7 +170,8 @@ | |||
| 150 | #undef TRACE_EVENT | 170 | #undef TRACE_EVENT |
| 151 | #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ | 171 | #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ |
| 152 | static int \ | 172 | static int \ |
| 153 | ftrace_format_##call(struct trace_seq *s) \ | 173 | ftrace_format_##call(struct ftrace_event_call *unused, \ |
| 174 | struct trace_seq *s) \ | ||
| 154 | { \ | 175 | { \ |
| 155 | struct ftrace_raw_##call field __attribute__((unused)); \ | 176 | struct ftrace_raw_##call field __attribute__((unused)); \ |
| 156 | int ret = 0; \ | 177 | int ret = 0; \ |
| @@ -210,7 +231,7 @@ ftrace_format_##call(struct trace_seq *s) \ | |||
| 210 | 231 | ||
| 211 | #undef __get_dynamic_array | 232 | #undef __get_dynamic_array |
| 212 | #define __get_dynamic_array(field) \ | 233 | #define __get_dynamic_array(field) \ |
| 213 | ((void *)__entry + __entry->__data_loc_##field) | 234 | ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) |
| 214 | 235 | ||
| 215 | #undef __get_str | 236 | #undef __get_str |
| 216 | #define __get_str(field) (char *)__get_dynamic_array(field) | 237 | #define __get_str(field) (char *)__get_dynamic_array(field) |
| @@ -218,9 +239,9 @@ ftrace_format_##call(struct trace_seq *s) \ | |||
| 218 | #undef __print_flags | 239 | #undef __print_flags |
| 219 | #define __print_flags(flag, delim, flag_array...) \ | 240 | #define __print_flags(flag, delim, flag_array...) \ |
| 220 | ({ \ | 241 | ({ \ |
| 221 | static const struct trace_print_flags flags[] = \ | 242 | static const struct trace_print_flags __flags[] = \ |
| 222 | { flag_array, { -1, NULL }}; \ | 243 | { flag_array, { -1, NULL }}; \ |
| 223 | ftrace_print_flags_seq(p, delim, flag, flags); \ | 244 | ftrace_print_flags_seq(p, delim, flag, __flags); \ |
| 224 | }) | 245 | }) |
| 225 | 246 | ||
| 226 | #undef __print_symbolic | 247 | #undef __print_symbolic |
| @@ -233,7 +254,7 @@ ftrace_format_##call(struct trace_seq *s) \ | |||
| 233 | 254 | ||
| 234 | #undef TRACE_EVENT | 255 | #undef TRACE_EVENT |
| 235 | #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ | 256 | #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ |
| 236 | enum print_line_t \ | 257 | static enum print_line_t \ |
| 237 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | 258 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ |
| 238 | { \ | 259 | { \ |
| 239 | struct trace_seq *s = &iter->seq; \ | 260 | struct trace_seq *s = &iter->seq; \ |
| @@ -263,46 +284,48 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | |||
| 263 | 284 | ||
| 264 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 285 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
| 265 | 286 | ||
| 266 | #undef __field | 287 | #undef __field_ext |
| 267 | #define __field(type, item) \ | 288 | #define __field_ext(type, item, filter_type) \ |
| 268 | ret = trace_define_field(event_call, #type, #item, \ | 289 | ret = trace_define_field(event_call, #type, #item, \ |
| 269 | offsetof(typeof(field), item), \ | 290 | offsetof(typeof(field), item), \ |
| 270 | sizeof(field.item), is_signed_type(type)); \ | 291 | sizeof(field.item), \ |
| 292 | is_signed_type(type), filter_type); \ | ||
| 271 | if (ret) \ | 293 | if (ret) \ |
| 272 | return ret; | 294 | return ret; |
| 273 | 295 | ||
| 296 | #undef __field | ||
| 297 | #define __field(type, item) __field_ext(type, item, FILTER_OTHER) | ||
| 298 | |||
| 274 | #undef __array | 299 | #undef __array |
| 275 | #define __array(type, item, len) \ | 300 | #define __array(type, item, len) \ |
| 276 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | 301 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
| 277 | ret = trace_define_field(event_call, #type "[" #len "]", #item, \ | 302 | ret = trace_define_field(event_call, #type "[" #len "]", #item, \ |
| 278 | offsetof(typeof(field), item), \ | 303 | offsetof(typeof(field), item), \ |
| 279 | sizeof(field.item), 0); \ | 304 | sizeof(field.item), 0, FILTER_OTHER); \ |
| 280 | if (ret) \ | 305 | if (ret) \ |
| 281 | return ret; | 306 | return ret; |
| 282 | 307 | ||
| 283 | #undef __dynamic_array | 308 | #undef __dynamic_array |
| 284 | #define __dynamic_array(type, item, len) \ | 309 | #define __dynamic_array(type, item, len) \ |
| 285 | ret = trace_define_field(event_call, "__data_loc" "[" #type "]", #item,\ | 310 | ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \ |
| 286 | offsetof(typeof(field), __data_loc_##item), \ | 311 | offsetof(typeof(field), __data_loc_##item), \ |
| 287 | sizeof(field.__data_loc_##item), 0); | 312 | sizeof(field.__data_loc_##item), 0, \ |
| 313 | FILTER_OTHER); | ||
| 288 | 314 | ||
| 289 | #undef __string | 315 | #undef __string |
| 290 | #define __string(item, src) __dynamic_array(char, item, -1) | 316 | #define __string(item, src) __dynamic_array(char, item, -1) |
| 291 | 317 | ||
| 292 | #undef TRACE_EVENT | 318 | #undef TRACE_EVENT |
| 293 | #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ | 319 | #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ |
| 294 | int \ | 320 | static int \ |
| 295 | ftrace_define_fields_##call(void) \ | 321 | ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ |
| 296 | { \ | 322 | { \ |
| 297 | struct ftrace_raw_##call field; \ | 323 | struct ftrace_raw_##call field; \ |
| 298 | struct ftrace_event_call *event_call = &event_##call; \ | ||
| 299 | int ret; \ | 324 | int ret; \ |
| 300 | \ | 325 | \ |
| 301 | __common_field(int, type, 1); \ | 326 | ret = trace_define_common_fields(event_call); \ |
| 302 | __common_field(unsigned char, flags, 0); \ | 327 | if (ret) \ |
| 303 | __common_field(unsigned char, preempt_count, 0); \ | 328 | return ret; \ |
| 304 | __common_field(int, pid, 1); \ | ||
| 305 | __common_field(int, tgid, 1); \ | ||
| 306 | \ | 329 | \ |
| 307 | tstruct; \ | 330 | tstruct; \ |
| 308 | \ | 331 | \ |
| @@ -321,6 +344,9 @@ ftrace_define_fields_##call(void) \ | |||
| 321 | #undef __field | 344 | #undef __field |
| 322 | #define __field(type, item) | 345 | #define __field(type, item) |
| 323 | 346 | ||
| 347 | #undef __field_ext | ||
| 348 | #define __field_ext(type, item, filter_type) | ||
| 349 | |||
| 324 | #undef __array | 350 | #undef __array |
| 325 | #define __array(type, item, len) | 351 | #define __array(type, item, len) |
| 326 | 352 | ||
| @@ -328,6 +354,7 @@ ftrace_define_fields_##call(void) \ | |||
| 328 | #define __dynamic_array(type, item, len) \ | 354 | #define __dynamic_array(type, item, len) \ |
| 329 | __data_offsets->item = __data_size + \ | 355 | __data_offsets->item = __data_size + \ |
| 330 | offsetof(typeof(*entry), __data); \ | 356 | offsetof(typeof(*entry), __data); \ |
| 357 | __data_offsets->item |= (len * sizeof(type)) << 16; \ | ||
| 331 | __data_size += (len) * sizeof(type); | 358 | __data_size += (len) * sizeof(type); |
| 332 | 359 | ||
| 333 | #undef __string | 360 | #undef __string |
| @@ -433,13 +460,15 @@ static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ | |||
| 433 | * { | 460 | * { |
| 434 | * struct ring_buffer_event *event; | 461 | * struct ring_buffer_event *event; |
| 435 | * struct ftrace_raw_<call> *entry; <-- defined in stage 1 | 462 | * struct ftrace_raw_<call> *entry; <-- defined in stage 1 |
| 463 | * struct ring_buffer *buffer; | ||
| 436 | * unsigned long irq_flags; | 464 | * unsigned long irq_flags; |
| 437 | * int pc; | 465 | * int pc; |
| 438 | * | 466 | * |
| 439 | * local_save_flags(irq_flags); | 467 | * local_save_flags(irq_flags); |
| 440 | * pc = preempt_count(); | 468 | * pc = preempt_count(); |
| 441 | * | 469 | * |
| 442 | * event = trace_current_buffer_lock_reserve(event_<call>.id, | 470 | * event = trace_current_buffer_lock_reserve(&buffer, |
| 471 | * event_<call>.id, | ||
| 443 | * sizeof(struct ftrace_raw_<call>), | 472 | * sizeof(struct ftrace_raw_<call>), |
| 444 | * irq_flags, pc); | 473 | * irq_flags, pc); |
| 445 | * if (!event) | 474 | * if (!event) |
| @@ -449,7 +478,7 @@ static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ | |||
| 449 | * <assign>; <-- Here we assign the entries by the __field and | 478 | * <assign>; <-- Here we assign the entries by the __field and |
| 450 | * __array macros. | 479 | * __array macros. |
| 451 | * | 480 | * |
| 452 | * trace_current_buffer_unlock_commit(event, irq_flags, pc); | 481 | * trace_current_buffer_unlock_commit(buffer, event, irq_flags, pc); |
| 453 | * } | 482 | * } |
| 454 | * | 483 | * |
| 455 | * static int ftrace_raw_reg_event_<call>(void) | 484 | * static int ftrace_raw_reg_event_<call>(void) |
| @@ -541,6 +570,7 @@ static void ftrace_raw_event_##call(proto) \ | |||
| 541 | struct ftrace_event_call *event_call = &event_##call; \ | 570 | struct ftrace_event_call *event_call = &event_##call; \ |
| 542 | struct ring_buffer_event *event; \ | 571 | struct ring_buffer_event *event; \ |
| 543 | struct ftrace_raw_##call *entry; \ | 572 | struct ftrace_raw_##call *entry; \ |
| 573 | struct ring_buffer *buffer; \ | ||
| 544 | unsigned long irq_flags; \ | 574 | unsigned long irq_flags; \ |
| 545 | int __data_size; \ | 575 | int __data_size; \ |
| 546 | int pc; \ | 576 | int pc; \ |
| @@ -550,7 +580,8 @@ static void ftrace_raw_event_##call(proto) \ | |||
| 550 | \ | 580 | \ |
| 551 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ | 581 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ |
| 552 | \ | 582 | \ |
| 553 | event = trace_current_buffer_lock_reserve(event_##call.id, \ | 583 | event = trace_current_buffer_lock_reserve(&buffer, \ |
| 584 | event_##call.id, \ | ||
| 554 | sizeof(*entry) + __data_size, \ | 585 | sizeof(*entry) + __data_size, \ |
| 555 | irq_flags, pc); \ | 586 | irq_flags, pc); \ |
| 556 | if (!event) \ | 587 | if (!event) \ |
| @@ -562,11 +593,12 @@ static void ftrace_raw_event_##call(proto) \ | |||
| 562 | \ | 593 | \ |
| 563 | { assign; } \ | 594 | { assign; } \ |
| 564 | \ | 595 | \ |
| 565 | if (!filter_current_check_discard(event_call, entry, event)) \ | 596 | if (!filter_current_check_discard(buffer, event_call, entry, event)) \ |
| 566 | trace_nowake_buffer_unlock_commit(event, irq_flags, pc); \ | 597 | trace_nowake_buffer_unlock_commit(buffer, \ |
| 598 | event, irq_flags, pc); \ | ||
| 567 | } \ | 599 | } \ |
| 568 | \ | 600 | \ |
| 569 | static int ftrace_raw_reg_event_##call(void) \ | 601 | static int ftrace_raw_reg_event_##call(void *ptr) \ |
| 570 | { \ | 602 | { \ |
| 571 | int ret; \ | 603 | int ret; \ |
| 572 | \ | 604 | \ |
| @@ -577,7 +609,7 @@ static int ftrace_raw_reg_event_##call(void) \ | |||
| 577 | return ret; \ | 609 | return ret; \ |
| 578 | } \ | 610 | } \ |
| 579 | \ | 611 | \ |
| 580 | static void ftrace_raw_unreg_event_##call(void) \ | 612 | static void ftrace_raw_unreg_event_##call(void *ptr) \ |
| 581 | { \ | 613 | { \ |
| 582 | unregister_trace_##call(ftrace_raw_event_##call); \ | 614 | unregister_trace_##call(ftrace_raw_event_##call); \ |
| 583 | } \ | 615 | } \ |
| @@ -595,7 +627,6 @@ static int ftrace_raw_init_event_##call(void) \ | |||
| 595 | return -ENODEV; \ | 627 | return -ENODEV; \ |
| 596 | event_##call.id = id; \ | 628 | event_##call.id = id; \ |
| 597 | INIT_LIST_HEAD(&event_##call.fields); \ | 629 | INIT_LIST_HEAD(&event_##call.fields); \ |
| 598 | init_preds(&event_##call); \ | ||
| 599 | return 0; \ | 630 | return 0; \ |
| 600 | } \ | 631 | } \ |
| 601 | \ | 632 | \ |
diff --git a/include/trace/syscall.h b/include/trace/syscall.h index 8cfe515cbc47..5dc283ba5ae0 100644 --- a/include/trace/syscall.h +++ b/include/trace/syscall.h | |||
| @@ -1,8 +1,13 @@ | |||
| 1 | #ifndef _TRACE_SYSCALL_H | 1 | #ifndef _TRACE_SYSCALL_H |
| 2 | #define _TRACE_SYSCALL_H | 2 | #define _TRACE_SYSCALL_H |
| 3 | 3 | ||
| 4 | #include <linux/tracepoint.h> | ||
| 5 | #include <linux/unistd.h> | ||
| 6 | #include <linux/ftrace_event.h> | ||
| 7 | |||
| 4 | #include <asm/ptrace.h> | 8 | #include <asm/ptrace.h> |
| 5 | 9 | ||
| 10 | |||
| 6 | /* | 11 | /* |
| 7 | * A syscall entry in the ftrace syscalls array. | 12 | * A syscall entry in the ftrace syscalls array. |
| 8 | * | 13 | * |
| @@ -10,26 +15,49 @@ | |||
| 10 | * @nb_args: number of parameters it takes | 15 | * @nb_args: number of parameters it takes |
| 11 | * @types: list of types as strings | 16 | * @types: list of types as strings |
| 12 | * @args: list of args as strings (args[i] matches types[i]) | 17 | * @args: list of args as strings (args[i] matches types[i]) |
| 18 | * @enter_id: associated ftrace enter event id | ||
| 19 | * @exit_id: associated ftrace exit event id | ||
| 20 | * @enter_event: associated syscall_enter trace event | ||
| 21 | * @exit_event: associated syscall_exit trace event | ||
| 13 | */ | 22 | */ |
| 14 | struct syscall_metadata { | 23 | struct syscall_metadata { |
| 15 | const char *name; | 24 | const char *name; |
| 16 | int nb_args; | 25 | int nb_args; |
| 17 | const char **types; | 26 | const char **types; |
| 18 | const char **args; | 27 | const char **args; |
| 28 | int enter_id; | ||
| 29 | int exit_id; | ||
| 30 | |||
| 31 | struct ftrace_event_call *enter_event; | ||
| 32 | struct ftrace_event_call *exit_event; | ||
| 19 | }; | 33 | }; |
| 20 | 34 | ||
| 21 | #ifdef CONFIG_FTRACE_SYSCALLS | 35 | #ifdef CONFIG_FTRACE_SYSCALLS |
| 22 | extern void arch_init_ftrace_syscalls(void); | ||
| 23 | extern struct syscall_metadata *syscall_nr_to_meta(int nr); | 36 | extern struct syscall_metadata *syscall_nr_to_meta(int nr); |
| 24 | extern void start_ftrace_syscalls(void); | 37 | extern int syscall_name_to_nr(char *name); |
| 25 | extern void stop_ftrace_syscalls(void); | 38 | void set_syscall_enter_id(int num, int id); |
| 26 | extern void ftrace_syscall_enter(struct pt_regs *regs); | 39 | void set_syscall_exit_id(int num, int id); |
| 27 | extern void ftrace_syscall_exit(struct pt_regs *regs); | 40 | extern struct trace_event event_syscall_enter; |
| 28 | #else | 41 | extern struct trace_event event_syscall_exit; |
| 29 | static inline void start_ftrace_syscalls(void) { } | 42 | extern int reg_event_syscall_enter(void *ptr); |
| 30 | static inline void stop_ftrace_syscalls(void) { } | 43 | extern void unreg_event_syscall_enter(void *ptr); |
| 31 | static inline void ftrace_syscall_enter(struct pt_regs *regs) { } | 44 | extern int reg_event_syscall_exit(void *ptr); |
| 32 | static inline void ftrace_syscall_exit(struct pt_regs *regs) { } | 45 | extern void unreg_event_syscall_exit(void *ptr); |
| 46 | extern int syscall_enter_format(struct ftrace_event_call *call, | ||
| 47 | struct trace_seq *s); | ||
| 48 | extern int syscall_exit_format(struct ftrace_event_call *call, | ||
| 49 | struct trace_seq *s); | ||
| 50 | extern int syscall_enter_define_fields(struct ftrace_event_call *call); | ||
| 51 | extern int syscall_exit_define_fields(struct ftrace_event_call *call); | ||
| 52 | enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags); | ||
| 53 | enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags); | ||
| 54 | #endif | ||
| 55 | #ifdef CONFIG_EVENT_PROFILE | ||
| 56 | int reg_prof_syscall_enter(char *name); | ||
| 57 | void unreg_prof_syscall_enter(char *name); | ||
| 58 | int reg_prof_syscall_exit(char *name); | ||
| 59 | void unreg_prof_syscall_exit(char *name); | ||
| 60 | |||
| 33 | #endif | 61 | #endif |
| 34 | 62 | ||
| 35 | #endif /* _TRACE_SYSCALL_H */ | 63 | #endif /* _TRACE_SYSCALL_H */ |
