Merge branch 'tracing/urgent' into tracing/core
Merge reason: Pick up latest fixes and update to latest upstream. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -5,10 +5,16 @@
|
||||
#define _TRACE_EXT4_H
|
||||
|
||||
#include <linux/writeback.h>
|
||||
#include "../../../fs/ext4/ext4.h"
|
||||
#include "../../../fs/ext4/mballoc.h"
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
struct ext4_allocation_context;
|
||||
struct ext4_allocation_request;
|
||||
struct ext4_prealloc_space;
|
||||
struct ext4_inode_info;
|
||||
struct mpage_da_data;
|
||||
|
||||
#define EXT4_I(inode) (container_of(inode, struct ext4_inode_info, vfs_inode))
|
||||
|
||||
TRACE_EVENT(ext4_free_inode,
|
||||
TP_PROTO(struct inode *inode),
|
||||
|
||||
@@ -33,8 +39,8 @@ TRACE_EVENT(ext4_free_inode,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu mode %d uid %u gid %u blocks %llu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->mode,
|
||||
__entry->uid, __entry->gid,
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->mode, __entry->uid, __entry->gid,
|
||||
(unsigned long long) __entry->blocks)
|
||||
);
|
||||
|
||||
@@ -56,7 +62,8 @@ TRACE_EVENT(ext4_request_inode,
|
||||
),
|
||||
|
||||
TP_printk("dev %s dir %lu mode %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->dir, __entry->mode)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->dir,
|
||||
__entry->mode)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_allocate_inode,
|
||||
@@ -79,7 +86,8 @@ TRACE_EVENT(ext4_allocate_inode,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu dir %lu mode %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->dir, __entry->mode)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
(unsigned long) __entry->dir, __entry->mode)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_write_begin,
|
||||
@@ -106,8 +114,8 @@ TRACE_EVENT(ext4_write_begin,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pos %llu len %u flags %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len,
|
||||
__entry->flags)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pos, __entry->len, __entry->flags)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_ordered_write_end,
|
||||
@@ -133,8 +141,8 @@ TRACE_EVENT(ext4_ordered_write_end,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pos %llu len %u copied %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len,
|
||||
__entry->copied)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pos, __entry->len, __entry->copied)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_writeback_write_end,
|
||||
@@ -160,8 +168,8 @@ TRACE_EVENT(ext4_writeback_write_end,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pos %llu len %u copied %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len,
|
||||
__entry->copied)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pos, __entry->len, __entry->copied)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_journalled_write_end,
|
||||
@@ -186,8 +194,8 @@ TRACE_EVENT(ext4_journalled_write_end,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pos %llu len %u copied %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len,
|
||||
__entry->copied)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pos, __entry->len, __entry->copied)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_writepage,
|
||||
@@ -209,7 +217,8 @@ TRACE_EVENT(ext4_writepage,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu page_index %lu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->index)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_da_writepages,
|
||||
@@ -228,6 +237,7 @@ TRACE_EVENT(ext4_da_writepages,
|
||||
__field( char, for_kupdate )
|
||||
__field( char, for_reclaim )
|
||||
__field( char, range_cyclic )
|
||||
__field( pgoff_t, writeback_index )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
@@ -241,14 +251,51 @@ TRACE_EVENT(ext4_da_writepages,
|
||||
__entry->for_kupdate = wbc->for_kupdate;
|
||||
__entry->for_reclaim = wbc->for_reclaim;
|
||||
__entry->range_cyclic = wbc->range_cyclic;
|
||||
__entry->writeback_index = inode->i_mapping->writeback_index;
|
||||
),
|
||||
|
||||
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 range_cyclic %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->nr_to_write,
|
||||
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 writeback_index %lu",
|
||||
jbd2_dev_to_name(__entry->dev),
|
||||
(unsigned long) __entry->ino, __entry->nr_to_write,
|
||||
__entry->pages_skipped, __entry->range_start,
|
||||
__entry->range_end, __entry->nonblocking,
|
||||
__entry->for_kupdate, __entry->for_reclaim,
|
||||
__entry->range_cyclic)
|
||||
__entry->range_cyclic,
|
||||
(unsigned long) __entry->writeback_index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_da_write_pages,
|
||||
TP_PROTO(struct inode *inode, struct mpage_da_data *mpd),
|
||||
|
||||
TP_ARGS(inode, mpd),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
__field( __u64, b_blocknr )
|
||||
__field( __u32, b_size )
|
||||
__field( __u32, b_state )
|
||||
__field( unsigned long, first_page )
|
||||
__field( int, io_done )
|
||||
__field( int, pages_written )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->ino = inode->i_ino;
|
||||
__entry->b_blocknr = mpd->b_blocknr;
|
||||
__entry->b_size = mpd->b_size;
|
||||
__entry->b_state = mpd->b_state;
|
||||
__entry->first_page = mpd->first_page;
|
||||
__entry->io_done = mpd->io_done;
|
||||
__entry->pages_written = mpd->pages_written;
|
||||
),
|
||||
|
||||
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",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->b_blocknr, __entry->b_size,
|
||||
__entry->b_state, __entry->first_page,
|
||||
__entry->io_done, __entry->pages_written)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_da_writepages_result,
|
||||
@@ -266,6 +313,7 @@ TRACE_EVENT(ext4_da_writepages_result,
|
||||
__field( char, encountered_congestion )
|
||||
__field( char, more_io )
|
||||
__field( char, no_nrwrite_index_update )
|
||||
__field( pgoff_t, writeback_index )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
@@ -277,13 +325,16 @@ TRACE_EVENT(ext4_da_writepages_result,
|
||||
__entry->encountered_congestion = wbc->encountered_congestion;
|
||||
__entry->more_io = wbc->more_io;
|
||||
__entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update;
|
||||
__entry->writeback_index = inode->i_mapping->writeback_index;
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->ret,
|
||||
TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d writeback_index %lu",
|
||||
jbd2_dev_to_name(__entry->dev),
|
||||
(unsigned long) __entry->ino, __entry->ret,
|
||||
__entry->pages_written, __entry->pages_skipped,
|
||||
__entry->encountered_congestion, __entry->more_io,
|
||||
__entry->no_nrwrite_index_update)
|
||||
__entry->no_nrwrite_index_update,
|
||||
(unsigned long) __entry->writeback_index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_da_write_begin,
|
||||
@@ -309,8 +360,8 @@ TRACE_EVENT(ext4_da_write_begin,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pos %llu len %u flags %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len,
|
||||
__entry->flags)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pos, __entry->len, __entry->flags)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_da_write_end,
|
||||
@@ -336,8 +387,8 @@ TRACE_EVENT(ext4_da_write_end,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pos %llu len %u copied %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pos, __entry->len,
|
||||
__entry->copied)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pos, __entry->len, __entry->copied)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_discard_blocks,
|
||||
@@ -387,8 +438,8 @@ TRACE_EVENT(ext4_mb_new_inode_pa,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pa_pstart,
|
||||
__entry->pa_len, __entry->pa_lstart)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pa_pstart, __entry->pa_len, __entry->pa_lstart)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mb_new_group_pa,
|
||||
@@ -415,8 +466,8 @@ TRACE_EVENT(ext4_mb_new_group_pa,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->pa_pstart,
|
||||
__entry->pa_len, __entry->pa_lstart)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->pa_pstart, __entry->pa_len, __entry->pa_lstart)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mb_release_inode_pa,
|
||||
@@ -442,8 +493,8 @@ TRACE_EVENT(ext4_mb_release_inode_pa,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu block %llu count %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->block,
|
||||
__entry->count)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->block, __entry->count)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mb_release_group_pa,
|
||||
@@ -488,7 +539,7 @@ TRACE_EVENT(ext4_discard_preallocations,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mb_discard_preallocations,
|
||||
@@ -543,8 +594,8 @@ TRACE_EVENT(ext4_request_blocks,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu flags %u len %u lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->flags,
|
||||
__entry->len,
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->flags, __entry->len,
|
||||
(unsigned long long) __entry->logical,
|
||||
(unsigned long long) __entry->goal,
|
||||
(unsigned long long) __entry->lleft,
|
||||
@@ -587,8 +638,8 @@ TRACE_EVENT(ext4_allocate_blocks,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu flags %u len %u block %llu lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->flags,
|
||||
__entry->len, __entry->block,
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->flags, __entry->len, __entry->block,
|
||||
(unsigned long long) __entry->logical,
|
||||
(unsigned long long) __entry->goal,
|
||||
(unsigned long long) __entry->lleft,
|
||||
@@ -621,8 +672,8 @@ TRACE_EVENT(ext4_free_blocks,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu block %llu count %lu metadata %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->block,
|
||||
__entry->count, __entry->metadata)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->block, __entry->count, __entry->metadata)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_sync_file,
|
||||
@@ -645,8 +696,8 @@ TRACE_EVENT(ext4_sync_file,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %ld parent %ld datasync %d ",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->parent,
|
||||
__entry->datasync)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
(unsigned long) __entry->parent, __entry->datasync)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_sync_fs,
|
||||
@@ -669,6 +720,193 @@ TRACE_EVENT(ext4_sync_fs,
|
||||
__entry->wait)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_alloc_da_blocks,
|
||||
TP_PROTO(struct inode *inode),
|
||||
|
||||
TP_ARGS(inode),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
__field( unsigned int, data_blocks )
|
||||
__field( unsigned int, meta_blocks )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->ino = inode->i_ino;
|
||||
__entry->data_blocks = EXT4_I(inode)->i_reserved_data_blocks;
|
||||
__entry->meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks;
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu data_blocks %u meta_blocks %u",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->data_blocks, __entry->meta_blocks)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mballoc_alloc,
|
||||
TP_PROTO(struct ext4_allocation_context *ac),
|
||||
|
||||
TP_ARGS(ac),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
__field( __u16, found )
|
||||
__field( __u16, groups )
|
||||
__field( __u16, buddy )
|
||||
__field( __u16, flags )
|
||||
__field( __u16, tail )
|
||||
__field( __u8, cr )
|
||||
__field( __u32, orig_logical )
|
||||
__field( int, orig_start )
|
||||
__field( __u32, orig_group )
|
||||
__field( int, orig_len )
|
||||
__field( __u32, goal_logical )
|
||||
__field( int, goal_start )
|
||||
__field( __u32, goal_group )
|
||||
__field( int, goal_len )
|
||||
__field( __u32, result_logical )
|
||||
__field( int, result_start )
|
||||
__field( __u32, result_group )
|
||||
__field( int, result_len )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = ac->ac_inode->i_sb->s_dev;
|
||||
__entry->ino = ac->ac_inode->i_ino;
|
||||
__entry->found = ac->ac_found;
|
||||
__entry->flags = ac->ac_flags;
|
||||
__entry->groups = ac->ac_groups_scanned;
|
||||
__entry->buddy = ac->ac_buddy;
|
||||
__entry->tail = ac->ac_tail;
|
||||
__entry->cr = ac->ac_criteria;
|
||||
__entry->orig_logical = ac->ac_o_ex.fe_logical;
|
||||
__entry->orig_start = ac->ac_o_ex.fe_start;
|
||||
__entry->orig_group = ac->ac_o_ex.fe_group;
|
||||
__entry->orig_len = ac->ac_o_ex.fe_len;
|
||||
__entry->goal_logical = ac->ac_g_ex.fe_logical;
|
||||
__entry->goal_start = ac->ac_g_ex.fe_start;
|
||||
__entry->goal_group = ac->ac_g_ex.fe_group;
|
||||
__entry->goal_len = ac->ac_g_ex.fe_len;
|
||||
__entry->result_logical = ac->ac_f_ex.fe_logical;
|
||||
__entry->result_start = ac->ac_f_ex.fe_start;
|
||||
__entry->result_group = ac->ac_f_ex.fe_group;
|
||||
__entry->result_len = ac->ac_f_ex.fe_len;
|
||||
),
|
||||
|
||||
TP_printk("dev %s inode %lu orig %u/%d/%u@%u goal %u/%d/%u@%u "
|
||||
"result %u/%d/%u@%u blks %u grps %u cr %u flags 0x%04x "
|
||||
"tail %u broken %u",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->orig_group, __entry->orig_start,
|
||||
__entry->orig_len, __entry->orig_logical,
|
||||
__entry->goal_group, __entry->goal_start,
|
||||
__entry->goal_len, __entry->goal_logical,
|
||||
__entry->result_group, __entry->result_start,
|
||||
__entry->result_len, __entry->result_logical,
|
||||
__entry->found, __entry->groups, __entry->cr,
|
||||
__entry->flags, __entry->tail,
|
||||
__entry->buddy ? 1 << __entry->buddy : 0)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mballoc_prealloc,
|
||||
TP_PROTO(struct ext4_allocation_context *ac),
|
||||
|
||||
TP_ARGS(ac),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
__field( __u32, orig_logical )
|
||||
__field( int, orig_start )
|
||||
__field( __u32, orig_group )
|
||||
__field( int, orig_len )
|
||||
__field( __u32, result_logical )
|
||||
__field( int, result_start )
|
||||
__field( __u32, result_group )
|
||||
__field( int, result_len )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = ac->ac_inode->i_sb->s_dev;
|
||||
__entry->ino = ac->ac_inode->i_ino;
|
||||
__entry->orig_logical = ac->ac_o_ex.fe_logical;
|
||||
__entry->orig_start = ac->ac_o_ex.fe_start;
|
||||
__entry->orig_group = ac->ac_o_ex.fe_group;
|
||||
__entry->orig_len = ac->ac_o_ex.fe_len;
|
||||
__entry->result_logical = ac->ac_b_ex.fe_logical;
|
||||
__entry->result_start = ac->ac_b_ex.fe_start;
|
||||
__entry->result_group = ac->ac_b_ex.fe_group;
|
||||
__entry->result_len = ac->ac_b_ex.fe_len;
|
||||
),
|
||||
|
||||
TP_printk("dev %s inode %lu orig %u/%d/%u@%u result %u/%d/%u@%u",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->orig_group, __entry->orig_start,
|
||||
__entry->orig_len, __entry->orig_logical,
|
||||
__entry->result_group, __entry->result_start,
|
||||
__entry->result_len, __entry->result_logical)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mballoc_discard,
|
||||
TP_PROTO(struct ext4_allocation_context *ac),
|
||||
|
||||
TP_ARGS(ac),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
__field( __u32, result_logical )
|
||||
__field( int, result_start )
|
||||
__field( __u32, result_group )
|
||||
__field( int, result_len )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = ac->ac_inode->i_sb->s_dev;
|
||||
__entry->ino = ac->ac_inode->i_ino;
|
||||
__entry->result_logical = ac->ac_b_ex.fe_logical;
|
||||
__entry->result_start = ac->ac_b_ex.fe_start;
|
||||
__entry->result_group = ac->ac_b_ex.fe_group;
|
||||
__entry->result_len = ac->ac_b_ex.fe_len;
|
||||
),
|
||||
|
||||
TP_printk("dev %s inode %lu extent %u/%d/%u@%u ",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->result_group, __entry->result_start,
|
||||
__entry->result_len, __entry->result_logical)
|
||||
);
|
||||
|
||||
TRACE_EVENT(ext4_mballoc_free,
|
||||
TP_PROTO(struct ext4_allocation_context *ac),
|
||||
|
||||
TP_ARGS(ac),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
__field( __u32, result_logical )
|
||||
__field( int, result_start )
|
||||
__field( __u32, result_group )
|
||||
__field( int, result_len )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = ac->ac_inode->i_sb->s_dev;
|
||||
__entry->ino = ac->ac_inode->i_ino;
|
||||
__entry->result_logical = ac->ac_b_ex.fe_logical;
|
||||
__entry->result_start = ac->ac_b_ex.fe_start;
|
||||
__entry->result_group = ac->ac_b_ex.fe_group;
|
||||
__entry->result_len = ac->ac_b_ex.fe_len;
|
||||
),
|
||||
|
||||
TP_printk("dev %s inode %lu extent %u/%d/%u@%u ",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
|
||||
__entry->result_group, __entry->result_start,
|
||||
__entry->result_len, __entry->result_logical)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_EXT4_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
@@ -7,6 +7,9 @@
|
||||
#include <linux/jbd2.h>
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
struct transaction_chp_stats_s;
|
||||
struct transaction_run_stats_s;
|
||||
|
||||
TRACE_EVENT(jbd2_checkpoint,
|
||||
|
||||
TP_PROTO(journal_t *journal, int result),
|
||||
@@ -159,7 +162,82 @@ TRACE_EVENT(jbd2_submit_inode_data,
|
||||
),
|
||||
|
||||
TP_printk("dev %s ino %lu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->ino)
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino)
|
||||
);
|
||||
|
||||
TRACE_EVENT(jbd2_run_stats,
|
||||
TP_PROTO(dev_t dev, unsigned long tid,
|
||||
struct transaction_run_stats_s *stats),
|
||||
|
||||
TP_ARGS(dev, tid, stats),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( unsigned long, tid )
|
||||
__field( unsigned long, wait )
|
||||
__field( unsigned long, running )
|
||||
__field( unsigned long, locked )
|
||||
__field( unsigned long, flushing )
|
||||
__field( unsigned long, logging )
|
||||
__field( __u32, handle_count )
|
||||
__field( __u32, blocks )
|
||||
__field( __u32, blocks_logged )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev;
|
||||
__entry->tid = tid;
|
||||
__entry->wait = stats->rs_wait;
|
||||
__entry->running = stats->rs_running;
|
||||
__entry->locked = stats->rs_locked;
|
||||
__entry->flushing = stats->rs_flushing;
|
||||
__entry->logging = stats->rs_logging;
|
||||
__entry->handle_count = stats->rs_handle_count;
|
||||
__entry->blocks = stats->rs_blocks;
|
||||
__entry->blocks_logged = stats->rs_blocks_logged;
|
||||
),
|
||||
|
||||
TP_printk("dev %s tid %lu wait %u running %u locked %u flushing %u "
|
||||
"logging %u handle_count %u blocks %u blocks_logged %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->tid,
|
||||
jiffies_to_msecs(__entry->wait),
|
||||
jiffies_to_msecs(__entry->running),
|
||||
jiffies_to_msecs(__entry->locked),
|
||||
jiffies_to_msecs(__entry->flushing),
|
||||
jiffies_to_msecs(__entry->logging),
|
||||
__entry->handle_count, __entry->blocks,
|
||||
__entry->blocks_logged)
|
||||
);
|
||||
|
||||
TRACE_EVENT(jbd2_checkpoint_stats,
|
||||
TP_PROTO(dev_t dev, unsigned long tid,
|
||||
struct transaction_chp_stats_s *stats),
|
||||
|
||||
TP_ARGS(dev, tid, stats),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( unsigned long, tid )
|
||||
__field( unsigned long, chp_time )
|
||||
__field( __u32, forced_to_close )
|
||||
__field( __u32, written )
|
||||
__field( __u32, dropped )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev;
|
||||
__entry->tid = tid;
|
||||
__entry->chp_time = stats->cs_chp_time;
|
||||
__entry->forced_to_close= stats->cs_forced_to_close;
|
||||
__entry->written = stats->cs_written;
|
||||
__entry->dropped = stats->cs_dropped;
|
||||
),
|
||||
|
||||
TP_printk("dev %s tid %lu chp_time %u forced_to_close %u "
|
||||
"written %u dropped %u",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->tid,
|
||||
jiffies_to_msecs(__entry->chp_time),
|
||||
__entry->forced_to_close, __entry->written, __entry->dropped)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_JBD2_H */
|
||||
|
@@ -225,6 +225,169 @@ TRACE_EVENT(kmem_cache_free,
|
||||
|
||||
TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr)
|
||||
);
|
||||
|
||||
TRACE_EVENT(mm_page_free_direct,
|
||||
|
||||
TP_PROTO(struct page *page, unsigned int order),
|
||||
|
||||
TP_ARGS(page, order),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( struct page *, page )
|
||||
__field( unsigned int, order )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->page = page;
|
||||
__entry->order = order;
|
||||
),
|
||||
|
||||
TP_printk("page=%p pfn=%lu order=%d",
|
||||
__entry->page,
|
||||
page_to_pfn(__entry->page),
|
||||
__entry->order)
|
||||
);
|
||||
|
||||
TRACE_EVENT(mm_pagevec_free,
|
||||
|
||||
TP_PROTO(struct page *page, int cold),
|
||||
|
||||
TP_ARGS(page, cold),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( struct page *, page )
|
||||
__field( int, cold )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->page = page;
|
||||
__entry->cold = cold;
|
||||
),
|
||||
|
||||
TP_printk("page=%p pfn=%lu order=0 cold=%d",
|
||||
__entry->page,
|
||||
page_to_pfn(__entry->page),
|
||||
__entry->cold)
|
||||
);
|
||||
|
||||
TRACE_EVENT(mm_page_alloc,
|
||||
|
||||
TP_PROTO(struct page *page, unsigned int order,
|
||||
gfp_t gfp_flags, int migratetype),
|
||||
|
||||
TP_ARGS(page, order, gfp_flags, migratetype),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( struct page *, page )
|
||||
__field( unsigned int, order )
|
||||
__field( gfp_t, gfp_flags )
|
||||
__field( int, migratetype )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->page = page;
|
||||
__entry->order = order;
|
||||
__entry->gfp_flags = gfp_flags;
|
||||
__entry->migratetype = migratetype;
|
||||
),
|
||||
|
||||
TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s",
|
||||
__entry->page,
|
||||
page_to_pfn(__entry->page),
|
||||
__entry->order,
|
||||
__entry->migratetype,
|
||||
show_gfp_flags(__entry->gfp_flags))
|
||||
);
|
||||
|
||||
TRACE_EVENT(mm_page_alloc_zone_locked,
|
||||
|
||||
TP_PROTO(struct page *page, unsigned int order, int migratetype),
|
||||
|
||||
TP_ARGS(page, order, migratetype),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( struct page *, page )
|
||||
__field( unsigned int, order )
|
||||
__field( int, migratetype )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->page = page;
|
||||
__entry->order = order;
|
||||
__entry->migratetype = migratetype;
|
||||
),
|
||||
|
||||
TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d",
|
||||
__entry->page,
|
||||
page_to_pfn(__entry->page),
|
||||
__entry->order,
|
||||
__entry->migratetype,
|
||||
__entry->order == 0)
|
||||
);
|
||||
|
||||
TRACE_EVENT(mm_page_pcpu_drain,
|
||||
|
||||
TP_PROTO(struct page *page, int order, int migratetype),
|
||||
|
||||
TP_ARGS(page, order, migratetype),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( struct page *, page )
|
||||
__field( int, order )
|
||||
__field( int, migratetype )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->page = page;
|
||||
__entry->order = order;
|
||||
__entry->migratetype = migratetype;
|
||||
),
|
||||
|
||||
TP_printk("page=%p pfn=%lu order=%d migratetype=%d",
|
||||
__entry->page,
|
||||
page_to_pfn(__entry->page),
|
||||
__entry->order,
|
||||
__entry->migratetype)
|
||||
);
|
||||
|
||||
TRACE_EVENT(mm_page_alloc_extfrag,
|
||||
|
||||
TP_PROTO(struct page *page,
|
||||
int alloc_order, int fallback_order,
|
||||
int alloc_migratetype, int fallback_migratetype),
|
||||
|
||||
TP_ARGS(page,
|
||||
alloc_order, fallback_order,
|
||||
alloc_migratetype, fallback_migratetype),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( struct page *, page )
|
||||
__field( int, alloc_order )
|
||||
__field( int, fallback_order )
|
||||
__field( int, alloc_migratetype )
|
||||
__field( int, fallback_migratetype )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->page = page;
|
||||
__entry->alloc_order = alloc_order;
|
||||
__entry->fallback_order = fallback_order;
|
||||
__entry->alloc_migratetype = alloc_migratetype;
|
||||
__entry->fallback_migratetype = fallback_migratetype;
|
||||
),
|
||||
|
||||
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",
|
||||
__entry->page,
|
||||
page_to_pfn(__entry->page),
|
||||
__entry->alloc_order,
|
||||
__entry->fallback_order,
|
||||
pageblock_order,
|
||||
__entry->alloc_migratetype,
|
||||
__entry->fallback_migratetype,
|
||||
__entry->fallback_order < pageblock_order,
|
||||
__entry->alloc_migratetype == __entry->fallback_migratetype)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_KMEM_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
81
include/trace/events/power.h
Normal file
81
include/trace/events/power.h
Normal file
@@ -0,0 +1,81 @@
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM power
|
||||
|
||||
#if !defined(_TRACE_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_POWER_H
|
||||
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#ifndef _TRACE_POWER_ENUM_
|
||||
#define _TRACE_POWER_ENUM_
|
||||
enum {
|
||||
POWER_NONE = 0,
|
||||
POWER_CSTATE = 1,
|
||||
POWER_PSTATE = 2,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
TRACE_EVENT(power_start,
|
||||
|
||||
TP_PROTO(unsigned int type, unsigned int state),
|
||||
|
||||
TP_ARGS(type, state),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( u64, type )
|
||||
__field( u64, state )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->type = type;
|
||||
__entry->state = state;
|
||||
),
|
||||
|
||||
TP_printk("type=%lu state=%lu", (unsigned long)__entry->type, (unsigned long)__entry->state)
|
||||
);
|
||||
|
||||
TRACE_EVENT(power_end,
|
||||
|
||||
TP_PROTO(int dummy),
|
||||
|
||||
TP_ARGS(dummy),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( u64, dummy )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dummy = 0xffff;
|
||||
),
|
||||
|
||||
TP_printk("dummy=%lu", (unsigned long)__entry->dummy)
|
||||
|
||||
);
|
||||
|
||||
|
||||
TRACE_EVENT(power_frequency,
|
||||
|
||||
TP_PROTO(unsigned int type, unsigned int state),
|
||||
|
||||
TP_ARGS(type, state),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( u64, type )
|
||||
__field( u64, state )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->type = type;
|
||||
__entry->state = state;
|
||||
),
|
||||
|
||||
TP_printk("type=%lu state=%lu", (unsigned long)__entry->type, (unsigned long) __entry->state)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_POWER_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
@@ -379,6 +379,39 @@ TRACE_EVENT(sched_stat_wait,
|
||||
(unsigned long long)__entry->delay)
|
||||
);
|
||||
|
||||
/*
|
||||
* Tracepoint for accounting runtime (time the task is executing
|
||||
* on a CPU).
|
||||
*/
|
||||
TRACE_EVENT(sched_stat_runtime,
|
||||
|
||||
TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
|
||||
|
||||
TP_ARGS(tsk, runtime, vruntime),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array( char, comm, TASK_COMM_LEN )
|
||||
__field( pid_t, pid )
|
||||
__field( u64, runtime )
|
||||
__field( u64, vruntime )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
|
||||
__entry->pid = tsk->pid;
|
||||
__entry->runtime = runtime;
|
||||
__entry->vruntime = vruntime;
|
||||
)
|
||||
TP_perf_assign(
|
||||
__perf_count(runtime);
|
||||
),
|
||||
|
||||
TP_printk("task: %s:%d runtime: %Lu [ns], vruntime: %Lu [ns]",
|
||||
__entry->comm, __entry->pid,
|
||||
(unsigned long long)__entry->runtime,
|
||||
(unsigned long long)__entry->vruntime)
|
||||
);
|
||||
|
||||
/*
|
||||
* Tracepoint for accounting sleep time (time the task is not runnable,
|
||||
* including iowait, see below).
|
||||
|
342
include/trace/events/timer.h
Normal file
342
include/trace/events/timer.h
Normal file
@@ -0,0 +1,342 @@
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM timer
|
||||
|
||||
#if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_TIMER_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/timer.h>
|
||||
|
||||
/**
|
||||
* timer_init - called when the timer is initialized
|
||||
* @timer: pointer to struct timer_list
|
||||
*/
|
||||
TRACE_EVENT(timer_init,
|
||||
|
||||
TP_PROTO(struct timer_list *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
),
|
||||
|
||||
TP_printk("timer %p", __entry->timer)
|
||||
);
|
||||
|
||||
/**
|
||||
* timer_start - called when the timer is started
|
||||
* @timer: pointer to struct timer_list
|
||||
* @expires: the timers expiry time
|
||||
*/
|
||||
TRACE_EVENT(timer_start,
|
||||
|
||||
TP_PROTO(struct timer_list *timer, unsigned long expires),
|
||||
|
||||
TP_ARGS(timer, expires),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
__field( void *, function )
|
||||
__field( unsigned long, expires )
|
||||
__field( unsigned long, now )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
__entry->function = timer->function;
|
||||
__entry->expires = expires;
|
||||
__entry->now = jiffies;
|
||||
),
|
||||
|
||||
TP_printk("timer %p: func %pf, expires %lu, timeout %ld",
|
||||
__entry->timer, __entry->function, __entry->expires,
|
||||
(long)__entry->expires - __entry->now)
|
||||
);
|
||||
|
||||
/**
|
||||
* timer_expire_entry - called immediately before the timer callback
|
||||
* @timer: pointer to struct timer_list
|
||||
*
|
||||
* Allows to determine the timer latency.
|
||||
*/
|
||||
TRACE_EVENT(timer_expire_entry,
|
||||
|
||||
TP_PROTO(struct timer_list *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
__field( unsigned long, now )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
__entry->now = jiffies;
|
||||
),
|
||||
|
||||
TP_printk("timer %p: now %lu", __entry->timer, __entry->now)
|
||||
);
|
||||
|
||||
/**
|
||||
* timer_expire_exit - called immediately after the timer callback returns
|
||||
* @timer: pointer to struct timer_list
|
||||
*
|
||||
* When used in combination with the timer_expire_entry tracepoint we can
|
||||
* determine the runtime of the timer callback function.
|
||||
*
|
||||
* NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might
|
||||
* be invalid. We solely track the pointer.
|
||||
*/
|
||||
TRACE_EVENT(timer_expire_exit,
|
||||
|
||||
TP_PROTO(struct timer_list *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(void *, timer )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
),
|
||||
|
||||
TP_printk("timer %p", __entry->timer)
|
||||
);
|
||||
|
||||
/**
|
||||
* timer_cancel - called when the timer is canceled
|
||||
* @timer: pointer to struct timer_list
|
||||
*/
|
||||
TRACE_EVENT(timer_cancel,
|
||||
|
||||
TP_PROTO(struct timer_list *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
),
|
||||
|
||||
TP_printk("timer %p", __entry->timer)
|
||||
);
|
||||
|
||||
/**
|
||||
* hrtimer_init - called when the hrtimer is initialized
|
||||
* @timer: pointer to struct hrtimer
|
||||
* @clockid: the hrtimers clock
|
||||
* @mode: the hrtimers mode
|
||||
*/
|
||||
TRACE_EVENT(hrtimer_init,
|
||||
|
||||
TP_PROTO(struct hrtimer *timer, clockid_t clockid,
|
||||
enum hrtimer_mode mode),
|
||||
|
||||
TP_ARGS(timer, clockid, mode),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
__field( clockid_t, clockid )
|
||||
__field( enum hrtimer_mode, mode )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
__entry->clockid = clockid;
|
||||
__entry->mode = mode;
|
||||
),
|
||||
|
||||
TP_printk("hrtimer %p, clockid %s, mode %s", __entry->timer,
|
||||
__entry->clockid == CLOCK_REALTIME ?
|
||||
"CLOCK_REALTIME" : "CLOCK_MONOTONIC",
|
||||
__entry->mode == HRTIMER_MODE_ABS ?
|
||||
"HRTIMER_MODE_ABS" : "HRTIMER_MODE_REL")
|
||||
);
|
||||
|
||||
/**
|
||||
* hrtimer_start - called when the hrtimer is started
|
||||
* @timer: pointer to struct hrtimer
|
||||
*/
|
||||
TRACE_EVENT(hrtimer_start,
|
||||
|
||||
TP_PROTO(struct hrtimer *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
__field( void *, function )
|
||||
__field( s64, expires )
|
||||
__field( s64, softexpires )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
__entry->function = timer->function;
|
||||
__entry->expires = hrtimer_get_expires(timer).tv64;
|
||||
__entry->softexpires = hrtimer_get_softexpires(timer).tv64;
|
||||
),
|
||||
|
||||
TP_printk("hrtimer %p, func %pf, expires %llu, softexpires %llu",
|
||||
__entry->timer, __entry->function,
|
||||
(unsigned long long)ktime_to_ns((ktime_t) {
|
||||
.tv64 = __entry->expires }),
|
||||
(unsigned long long)ktime_to_ns((ktime_t) {
|
||||
.tv64 = __entry->softexpires }))
|
||||
);
|
||||
|
||||
/**
|
||||
* htimmer_expire_entry - called immediately before the hrtimer callback
|
||||
* @timer: pointer to struct hrtimer
|
||||
* @now: pointer to variable which contains current time of the
|
||||
* timers base.
|
||||
*
|
||||
* Allows to determine the timer latency.
|
||||
*/
|
||||
TRACE_EVENT(hrtimer_expire_entry,
|
||||
|
||||
TP_PROTO(struct hrtimer *timer, ktime_t *now),
|
||||
|
||||
TP_ARGS(timer, now),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
__field( s64, now )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
__entry->now = now->tv64;
|
||||
),
|
||||
|
||||
TP_printk("hrtimer %p, now %llu", __entry->timer,
|
||||
(unsigned long long)ktime_to_ns((ktime_t) {
|
||||
.tv64 = __entry->now }))
|
||||
);
|
||||
|
||||
/**
|
||||
* hrtimer_expire_exit - called immediately after the hrtimer callback returns
|
||||
* @timer: pointer to struct hrtimer
|
||||
*
|
||||
* When used in combination with the hrtimer_expire_entry tracepoint we can
|
||||
* determine the runtime of the callback function.
|
||||
*/
|
||||
TRACE_EVENT(hrtimer_expire_exit,
|
||||
|
||||
TP_PROTO(struct hrtimer *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
),
|
||||
|
||||
TP_printk("hrtimer %p", __entry->timer)
|
||||
);
|
||||
|
||||
/**
|
||||
* hrtimer_cancel - called when the hrtimer is canceled
|
||||
* @timer: pointer to struct hrtimer
|
||||
*/
|
||||
TRACE_EVENT(hrtimer_cancel,
|
||||
|
||||
TP_PROTO(struct hrtimer *timer),
|
||||
|
||||
TP_ARGS(timer),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( void *, timer )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->timer = timer;
|
||||
),
|
||||
|
||||
TP_printk("hrtimer %p", __entry->timer)
|
||||
);
|
||||
|
||||
/**
|
||||
* itimer_state - called when itimer is started or canceled
|
||||
* @which: name of the interval timer
|
||||
* @value: the itimers value, itimer is canceled if value->it_value is
|
||||
* zero, otherwise it is started
|
||||
* @expires: the itimers expiry time
|
||||
*/
|
||||
TRACE_EVENT(itimer_state,
|
||||
|
||||
TP_PROTO(int which, const struct itimerval *const value,
|
||||
cputime_t expires),
|
||||
|
||||
TP_ARGS(which, value, expires),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, which )
|
||||
__field( cputime_t, expires )
|
||||
__field( long, value_sec )
|
||||
__field( long, value_usec )
|
||||
__field( long, interval_sec )
|
||||
__field( long, interval_usec )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->which = which;
|
||||
__entry->expires = expires;
|
||||
__entry->value_sec = value->it_value.tv_sec;
|
||||
__entry->value_usec = value->it_value.tv_usec;
|
||||
__entry->interval_sec = value->it_interval.tv_sec;
|
||||
__entry->interval_usec = value->it_interval.tv_usec;
|
||||
),
|
||||
|
||||
TP_printk("which %d, expires %lu, it_value %lu.%lu, it_interval %lu.%lu",
|
||||
__entry->which, __entry->expires,
|
||||
__entry->value_sec, __entry->value_usec,
|
||||
__entry->interval_sec, __entry->interval_usec)
|
||||
);
|
||||
|
||||
/**
|
||||
* itimer_expire - called when itimer expires
|
||||
* @which: type of the interval timer
|
||||
* @pid: pid of the process which owns the timer
|
||||
* @now: current time, used to calculate the latency of itimer
|
||||
*/
|
||||
TRACE_EVENT(itimer_expire,
|
||||
|
||||
TP_PROTO(int which, struct pid *pid, cputime_t now),
|
||||
|
||||
TP_ARGS(which, pid, now),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int , which )
|
||||
__field( pid_t, pid )
|
||||
__field( cputime_t, now )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->which = which;
|
||||
__entry->now = now;
|
||||
__entry->pid = pid_nr(pid);
|
||||
),
|
||||
|
||||
TP_printk("which %d, pid %d, now %lu", __entry->which,
|
||||
(int) __entry->pid, __entry->now)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_TIMER_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
@@ -26,7 +26,7 @@ TRACE_EVENT(workqueue_insertion,
|
||||
__entry->func = work->func;
|
||||
),
|
||||
|
||||
TP_printk("thread=%s:%d func=%pF", __entry->thread_comm,
|
||||
TP_printk("thread=%s:%d func=%pf", __entry->thread_comm,
|
||||
__entry->thread_pid, __entry->func)
|
||||
);
|
||||
|
||||
@@ -48,7 +48,7 @@ TRACE_EVENT(workqueue_execution,
|
||||
__entry->func = work->func;
|
||||
),
|
||||
|
||||
TP_printk("thread=%s:%d func=%pF", __entry->thread_comm,
|
||||
TP_printk("thread=%s:%d func=%pf", __entry->thread_comm,
|
||||
__entry->thread_pid, __entry->func)
|
||||
);
|
||||
|
||||
|
@@ -378,24 +378,18 @@ static inline int ftrace_get_offsets_##call( \
|
||||
#ifdef CONFIG_EVENT_PROFILE
|
||||
|
||||
/*
|
||||
* Generate the functions needed for tracepoint perf_counter support.
|
||||
* Generate the functions needed for tracepoint perf_event support.
|
||||
*
|
||||
* NOTE: The insertion profile callback (ftrace_profile_<call>) is defined later
|
||||
*
|
||||
* static int ftrace_profile_enable_<call>(struct ftrace_event_call *event_call)
|
||||
* static int ftrace_profile_enable_<call>(void)
|
||||
* {
|
||||
* int ret = 0;
|
||||
*
|
||||
* if (!atomic_inc_return(&event_call->profile_count))
|
||||
* ret = register_trace_<call>(ftrace_profile_<call>);
|
||||
*
|
||||
* return ret;
|
||||
* return register_trace_<call>(ftrace_profile_<call>);
|
||||
* }
|
||||
*
|
||||
* static void ftrace_profile_disable_<call>(struct ftrace_event_call *event_call)
|
||||
* static void ftrace_profile_disable_<call>(void)
|
||||
* {
|
||||
* if (atomic_add_negative(-1, &event->call->profile_count))
|
||||
* unregister_trace_<call>(ftrace_profile_<call>);
|
||||
* unregister_trace_<call>(ftrace_profile_<call>);
|
||||
* }
|
||||
*
|
||||
*/
|
||||
@@ -405,20 +399,14 @@ static inline int ftrace_get_offsets_##call( \
|
||||
\
|
||||
static void ftrace_profile_##call(proto); \
|
||||
\
|
||||
static int ftrace_profile_enable_##call(struct ftrace_event_call *event_call) \
|
||||
static int ftrace_profile_enable_##call(void) \
|
||||
{ \
|
||||
int ret = 0; \
|
||||
\
|
||||
if (!atomic_inc_return(&event_call->profile_count)) \
|
||||
ret = register_trace_##call(ftrace_profile_##call); \
|
||||
\
|
||||
return ret; \
|
||||
return register_trace_##call(ftrace_profile_##call); \
|
||||
} \
|
||||
\
|
||||
static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\
|
||||
static void ftrace_profile_disable_##call(void) \
|
||||
{ \
|
||||
if (atomic_add_negative(-1, &event_call->profile_count)) \
|
||||
unregister_trace_##call(ftrace_profile_##call); \
|
||||
unregister_trace_##call(ftrace_profile_##call); \
|
||||
}
|
||||
|
||||
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
|
||||
@@ -656,15 +644,16 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
|
||||
* {
|
||||
* struct ftrace_data_offsets_<call> __maybe_unused __data_offsets;
|
||||
* struct ftrace_event_call *event_call = &event_<call>;
|
||||
* extern void perf_tpcounter_event(int, u64, u64, void *, int);
|
||||
* extern void perf_tp_event(int, u64, u64, void *, int);
|
||||
* struct ftrace_raw_##call *entry;
|
||||
* u64 __addr = 0, __count = 1;
|
||||
* unsigned long irq_flags;
|
||||
* struct trace_entry *ent;
|
||||
* int __entry_size;
|
||||
* int __data_size;
|
||||
* int __cpu
|
||||
* int pc;
|
||||
*
|
||||
* local_save_flags(irq_flags);
|
||||
* pc = preempt_count();
|
||||
*
|
||||
* __data_size = ftrace_get_offsets_<call>(&__data_offsets, args);
|
||||
@@ -675,25 +664,34 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
|
||||
* sizeof(u64));
|
||||
* __entry_size -= sizeof(u32);
|
||||
*
|
||||
* do {
|
||||
* char raw_data[__entry_size]; <- allocate our sample in the stack
|
||||
* struct trace_entry *ent;
|
||||
* // Protect the non nmi buffer
|
||||
* // This also protects the rcu read side
|
||||
* local_irq_save(irq_flags);
|
||||
* __cpu = smp_processor_id();
|
||||
*
|
||||
* zero dead bytes from alignment to avoid stack leak to userspace:
|
||||
* if (in_nmi())
|
||||
* raw_data = rcu_dereference(trace_profile_buf_nmi);
|
||||
* else
|
||||
* raw_data = rcu_dereference(trace_profile_buf);
|
||||
*
|
||||
* *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL;
|
||||
* entry = (struct ftrace_raw_<call> *)raw_data;
|
||||
* ent = &entry->ent;
|
||||
* tracing_generic_entry_update(ent, irq_flags, pc);
|
||||
* ent->type = event_call->id;
|
||||
* if (!raw_data)
|
||||
* goto end;
|
||||
*
|
||||
* <tstruct> <- do some jobs with dynamic arrays
|
||||
* raw_data = per_cpu_ptr(raw_data, __cpu);
|
||||
*
|
||||
* <assign> <- affect our values
|
||||
* //zero dead bytes from alignment to avoid stack leak to userspace:
|
||||
* *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL;
|
||||
* entry = (struct ftrace_raw_<call> *)raw_data;
|
||||
* ent = &entry->ent;
|
||||
* tracing_generic_entry_update(ent, irq_flags, pc);
|
||||
* ent->type = event_call->id;
|
||||
*
|
||||
* perf_tpcounter_event(event_call->id, __addr, __count, entry,
|
||||
* __entry_size); <- submit them to perf counter
|
||||
* } while (0);
|
||||
* <tstruct> <- do some jobs with dynamic arrays
|
||||
*
|
||||
* <assign> <- affect our values
|
||||
*
|
||||
* perf_tp_event(event_call->id, __addr, __count, entry,
|
||||
* __entry_size); <- submit them to perf counter
|
||||
*
|
||||
* }
|
||||
*/
|
||||
@@ -712,15 +710,17 @@ static void ftrace_profile_##call(proto) \
|
||||
{ \
|
||||
struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\
|
||||
struct ftrace_event_call *event_call = &event_##call; \
|
||||
extern void perf_tpcounter_event(int, u64, u64, void *, int); \
|
||||
extern void perf_tp_event(int, u64, u64, void *, int); \
|
||||
struct ftrace_raw_##call *entry; \
|
||||
u64 __addr = 0, __count = 1; \
|
||||
unsigned long irq_flags; \
|
||||
struct trace_entry *ent; \
|
||||
int __entry_size; \
|
||||
int __data_size; \
|
||||
char *raw_data; \
|
||||
int __cpu; \
|
||||
int pc; \
|
||||
\
|
||||
local_save_flags(irq_flags); \
|
||||
pc = preempt_count(); \
|
||||
\
|
||||
__data_size = ftrace_get_offsets_##call(&__data_offsets, args); \
|
||||
@@ -728,23 +728,38 @@ static void ftrace_profile_##call(proto) \
|
||||
sizeof(u64)); \
|
||||
__entry_size -= sizeof(u32); \
|
||||
\
|
||||
do { \
|
||||
char raw_data[__entry_size]; \
|
||||
struct trace_entry *ent; \
|
||||
if (WARN_ONCE(__entry_size > FTRACE_MAX_PROFILE_SIZE, \
|
||||
"profile buffer not large enough")) \
|
||||
return; \
|
||||
\
|
||||
*(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL; \
|
||||
entry = (struct ftrace_raw_##call *)raw_data; \
|
||||
ent = &entry->ent; \
|
||||
tracing_generic_entry_update(ent, irq_flags, pc); \
|
||||
ent->type = event_call->id; \
|
||||
local_irq_save(irq_flags); \
|
||||
__cpu = smp_processor_id(); \
|
||||
\
|
||||
tstruct \
|
||||
if (in_nmi()) \
|
||||
raw_data = rcu_dereference(trace_profile_buf_nmi); \
|
||||
else \
|
||||
raw_data = rcu_dereference(trace_profile_buf); \
|
||||
\
|
||||
{ assign; } \
|
||||
if (!raw_data) \
|
||||
goto end; \
|
||||
\
|
||||
perf_tpcounter_event(event_call->id, __addr, __count, entry,\
|
||||
raw_data = per_cpu_ptr(raw_data, __cpu); \
|
||||
\
|
||||
*(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL; \
|
||||
entry = (struct ftrace_raw_##call *)raw_data; \
|
||||
ent = &entry->ent; \
|
||||
tracing_generic_entry_update(ent, irq_flags, pc); \
|
||||
ent->type = event_call->id; \
|
||||
\
|
||||
tstruct \
|
||||
\
|
||||
{ assign; } \
|
||||
\
|
||||
perf_tp_event(event_call->id, __addr, __count, entry, \
|
||||
__entry_size); \
|
||||
} while (0); \
|
||||
\
|
||||
end: \
|
||||
local_irq_restore(irq_flags); \
|
||||
\
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user