ext4: add more tracepoints and use dev_t in the trace buffer
- Add more ext4 tracepoints. - Change ext4 tracepoints to use dev_t field with MAJOR/MINOR macros so that we can save 4 bytes in the ring buffer on some platforms. - Add sync_mode to ext4_da_writepages, ext4_da_write_pages, and ext4_da_writepages_result tracepoints. Also remove for_reclaim field from ext4_da_writepages since it is usually not very useful. Signed-off-by: Jiaying Zhang <jiayingz@google.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
Родитель
4596fe0767
Коммит
0562e0bad4
|
@ -21,6 +21,8 @@
|
|||
#include "ext4_jbd2.h"
|
||||
#include "mballoc.h"
|
||||
|
||||
#include <trace/events/ext4.h>
|
||||
|
||||
/*
|
||||
* balloc.c contains the blocks allocation and deallocation routines
|
||||
*/
|
||||
|
@ -342,6 +344,7 @@ ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
|
|||
* We do it here so the bitmap uptodate bit
|
||||
* get set with buffer lock held.
|
||||
*/
|
||||
trace_ext4_read_block_bitmap_load(sb, block_group);
|
||||
set_bitmap_uptodate(bh);
|
||||
if (bh_submit_read(bh) < 0) {
|
||||
put_bh(bh);
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
#include "ext4_jbd2.h"
|
||||
#include "ext4_extents.h"
|
||||
|
||||
#include <trace/events/ext4.h>
|
||||
|
||||
static int ext4_ext_truncate_extend_restart(handle_t *handle,
|
||||
struct inode *inode,
|
||||
int needed)
|
||||
|
@ -664,6 +666,8 @@ ext4_ext_find_extent(struct inode *inode, ext4_lblk_t block,
|
|||
if (unlikely(!bh))
|
||||
goto err;
|
||||
if (!bh_uptodate_or_lock(bh)) {
|
||||
trace_ext4_ext_load_extent(inode, block,
|
||||
path[ppos].p_block);
|
||||
if (bh_submit_read(bh) < 0) {
|
||||
put_bh(bh);
|
||||
goto err;
|
||||
|
@ -3297,7 +3301,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
|
|||
struct ext4_ext_path *path = NULL;
|
||||
struct ext4_extent_header *eh;
|
||||
struct ext4_extent newex, *ex;
|
||||
ext4_fsblk_t newblock;
|
||||
ext4_fsblk_t newblock = 0;
|
||||
int err = 0, depth, ret;
|
||||
unsigned int allocated = 0;
|
||||
struct ext4_allocation_request ar;
|
||||
|
@ -3305,6 +3309,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
|
|||
|
||||
ext_debug("blocks %u/%u requested for inode %lu\n",
|
||||
map->m_lblk, map->m_len, inode->i_ino);
|
||||
trace_ext4_ext_map_blocks_enter(inode, map->m_lblk, map->m_len, flags);
|
||||
|
||||
/* check in cache */
|
||||
if (ext4_ext_in_cache(inode, map->m_lblk, &newex)) {
|
||||
|
@ -3525,6 +3530,8 @@ out2:
|
|||
ext4_ext_drop_refs(path);
|
||||
kfree(path);
|
||||
}
|
||||
trace_ext4_ext_map_blocks_exit(inode, map->m_lblk,
|
||||
newblock, map->m_len, err ? err : allocated);
|
||||
return err ? err : allocated;
|
||||
}
|
||||
|
||||
|
@ -3658,6 +3665,7 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
|
|||
if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
trace_ext4_fallocate_enter(inode, offset, len, mode);
|
||||
map.m_lblk = offset >> blkbits;
|
||||
/*
|
||||
* We can't just convert len to max_blocks because
|
||||
|
@ -3673,6 +3681,7 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
|
|||
ret = inode_newsize_ok(inode, (len + offset));
|
||||
if (ret) {
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
trace_ext4_fallocate_exit(inode, offset, max_blocks, ret);
|
||||
return ret;
|
||||
}
|
||||
retry:
|
||||
|
@ -3717,6 +3726,8 @@ retry:
|
|||
goto retry;
|
||||
}
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
trace_ext4_fallocate_exit(inode, offset, max_blocks,
|
||||
ret > 0 ? ret2 : ret);
|
||||
return ret > 0 ? ret2 : ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -164,20 +164,20 @@ int ext4_sync_file(struct file *file, int datasync)
|
|||
|
||||
J_ASSERT(ext4_journal_current_handle() == NULL);
|
||||
|
||||
trace_ext4_sync_file(file, datasync);
|
||||
trace_ext4_sync_file_enter(file, datasync);
|
||||
|
||||
if (inode->i_sb->s_flags & MS_RDONLY)
|
||||
return 0;
|
||||
|
||||
ret = ext4_flush_completed_IO(inode);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
if (!journal) {
|
||||
ret = generic_file_fsync(file, datasync);
|
||||
if (!ret && !list_empty(&inode->i_dentry))
|
||||
ext4_sync_parent(inode);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -194,8 +194,10 @@ int ext4_sync_file(struct file *file, int datasync)
|
|||
* (they were dirtied by commit). But that's OK - the blocks are
|
||||
* safe in-journal, which is all fsync() needs to ensure.
|
||||
*/
|
||||
if (ext4_should_journal_data(inode))
|
||||
return ext4_force_commit(inode->i_sb);
|
||||
if (ext4_should_journal_data(inode)) {
|
||||
ret = ext4_force_commit(inode->i_sb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
commit_tid = datasync ? ei->i_datasync_tid : ei->i_sync_tid;
|
||||
if (jbd2_log_start_commit(journal, commit_tid)) {
|
||||
|
@ -215,5 +217,7 @@ int ext4_sync_file(struct file *file, int datasync)
|
|||
ret = jbd2_log_wait_commit(journal, commit_tid);
|
||||
} else if (journal->j_flags & JBD2_BARRIER)
|
||||
blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
|
||||
out:
|
||||
trace_ext4_sync_file_exit(inode, ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -152,6 +152,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
|
|||
* We do it here so the bitmap uptodate bit
|
||||
* get set with buffer lock held.
|
||||
*/
|
||||
trace_ext4_load_inode_bitmap(sb, block_group);
|
||||
set_bitmap_uptodate(bh);
|
||||
if (bh_submit_read(bh) < 0) {
|
||||
put_bh(bh);
|
||||
|
|
|
@ -973,6 +973,7 @@ static int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
|
|||
int count = 0;
|
||||
ext4_fsblk_t first_block = 0;
|
||||
|
||||
trace_ext4_ind_map_blocks_enter(inode, map->m_lblk, map->m_len, flags);
|
||||
J_ASSERT(!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)));
|
||||
J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0);
|
||||
depth = ext4_block_to_path(inode, map->m_lblk, offsets,
|
||||
|
@ -1058,6 +1059,8 @@ cleanup:
|
|||
partial--;
|
||||
}
|
||||
out:
|
||||
trace_ext4_ind_map_blocks_exit(inode, map->m_lblk,
|
||||
map->m_pblk, map->m_len, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -3379,6 +3382,7 @@ static sector_t ext4_bmap(struct address_space *mapping, sector_t block)
|
|||
|
||||
static int ext4_readpage(struct file *file, struct page *page)
|
||||
{
|
||||
trace_ext4_readpage(page);
|
||||
return mpage_readpage(page, ext4_get_block);
|
||||
}
|
||||
|
||||
|
@ -3413,6 +3417,8 @@ static void ext4_invalidatepage(struct page *page, unsigned long offset)
|
|||
{
|
||||
journal_t *journal = EXT4_JOURNAL(page->mapping->host);
|
||||
|
||||
trace_ext4_invalidatepage(page, offset);
|
||||
|
||||
/*
|
||||
* free any io_end structure allocated for buffers to be discarded
|
||||
*/
|
||||
|
@ -3434,6 +3440,8 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
|
|||
{
|
||||
journal_t *journal = EXT4_JOURNAL(page->mapping->host);
|
||||
|
||||
trace_ext4_releasepage(page);
|
||||
|
||||
WARN_ON(PageChecked(page));
|
||||
if (!page_has_buffers(page))
|
||||
return 0;
|
||||
|
@ -3792,11 +3800,16 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
|
|||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
ssize_t ret;
|
||||
|
||||
trace_ext4_direct_IO_enter(inode, offset, iov_length(iov, nr_segs), rw);
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
|
||||
return ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs);
|
||||
|
||||
return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs);
|
||||
ret = ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs);
|
||||
else
|
||||
ret = ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs);
|
||||
trace_ext4_direct_IO_exit(inode, offset,
|
||||
iov_length(iov, nr_segs), rw, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -4425,6 +4438,8 @@ void ext4_truncate(struct inode *inode)
|
|||
ext4_lblk_t last_block;
|
||||
unsigned blocksize = inode->i_sb->s_blocksize;
|
||||
|
||||
trace_ext4_truncate_enter(inode);
|
||||
|
||||
if (!ext4_can_truncate(inode))
|
||||
return;
|
||||
|
||||
|
@ -4435,6 +4450,7 @@ void ext4_truncate(struct inode *inode)
|
|||
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) {
|
||||
ext4_ext_truncate(inode);
|
||||
trace_ext4_truncate_exit(inode);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4564,6 +4580,7 @@ out_stop:
|
|||
ext4_orphan_del(handle, inode);
|
||||
|
||||
ext4_journal_stop(handle);
|
||||
trace_ext4_truncate_exit(inode);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -4695,6 +4712,7 @@ make_io:
|
|||
* has in-inode xattrs, or we don't have this inode in memory.
|
||||
* Read the block from disk.
|
||||
*/
|
||||
trace_ext4_load_inode(inode);
|
||||
get_bh(bh);
|
||||
bh->b_end_io = end_buffer_read_sync;
|
||||
submit_bh(READ_META, bh);
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "xattr.h"
|
||||
#include "acl.h"
|
||||
|
||||
#include <trace/events/ext4.h>
|
||||
/*
|
||||
* define how far ahead to read directories while searching them.
|
||||
*/
|
||||
|
@ -2183,6 +2184,7 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
|
|||
struct ext4_dir_entry_2 *de;
|
||||
handle_t *handle;
|
||||
|
||||
trace_ext4_unlink_enter(dir, dentry);
|
||||
/* Initialize quotas before so that eventual writes go
|
||||
* in separate transaction */
|
||||
dquot_initialize(dir);
|
||||
|
@ -2228,6 +2230,7 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
|
|||
end_unlink:
|
||||
ext4_journal_stop(handle);
|
||||
brelse(bh);
|
||||
trace_ext4_unlink_exit(dentry, retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -17,19 +17,17 @@ TRACE_EVENT(jbd2_checkpoint,
|
|||
TP_ARGS(journal, result),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( int, result )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev = journal->j_fs_dev->bd_dev;
|
||||
__entry->result = result;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d result %d",
|
||||
__entry->dev_major, __entry->dev_minor, __entry->result)
|
||||
TP_printk("dev %s result %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->result)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(jbd2_commit,
|
||||
|
@ -39,22 +37,20 @@ DECLARE_EVENT_CLASS(jbd2_commit,
|
|||
TP_ARGS(journal, commit_transaction),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( char, sync_commit )
|
||||
__field( int, transaction )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev = journal->j_fs_dev->bd_dev;
|
||||
__entry->sync_commit = commit_transaction->t_synchronous_commit;
|
||||
__entry->transaction = commit_transaction->t_tid;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d transaction %d sync %d",
|
||||
__entry->dev_major, __entry->dev_minor,
|
||||
__entry->transaction, __entry->sync_commit)
|
||||
TP_printk("dev %s transaction %d sync %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->transaction,
|
||||
__entry->sync_commit)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(jbd2_commit, jbd2_start_commit,
|
||||
|
@ -91,24 +87,22 @@ TRACE_EVENT(jbd2_end_commit,
|
|||
TP_ARGS(journal, commit_transaction),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( char, sync_commit )
|
||||
__field( int, transaction )
|
||||
__field( int, head )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev = journal->j_fs_dev->bd_dev;
|
||||
__entry->sync_commit = commit_transaction->t_synchronous_commit;
|
||||
__entry->transaction = commit_transaction->t_tid;
|
||||
__entry->head = journal->j_tail_sequence;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d transaction %d sync %d head %d",
|
||||
__entry->dev_major, __entry->dev_minor,
|
||||
__entry->transaction, __entry->sync_commit, __entry->head)
|
||||
TP_printk("dev %s transaction %d sync %d head %d",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->transaction,
|
||||
__entry->sync_commit, __entry->head)
|
||||
);
|
||||
|
||||
TRACE_EVENT(jbd2_submit_inode_data,
|
||||
|
@ -117,20 +111,17 @@ TRACE_EVENT(jbd2_submit_inode_data,
|
|||
TP_ARGS(inode),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( ino_t, ino )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(inode->i_sb->s_dev);
|
||||
__entry->dev_minor = MINOR(inode->i_sb->s_dev);
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->ino = inode->i_ino;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d ino %lu",
|
||||
__entry->dev_major, __entry->dev_minor,
|
||||
(unsigned long) __entry->ino)
|
||||
TP_printk("dev %s ino %lu",
|
||||
jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino)
|
||||
);
|
||||
|
||||
TRACE_EVENT(jbd2_run_stats,
|
||||
|
@ -140,8 +131,7 @@ TRACE_EVENT(jbd2_run_stats,
|
|||
TP_ARGS(dev, tid, stats),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( unsigned long, tid )
|
||||
__field( unsigned long, wait )
|
||||
__field( unsigned long, running )
|
||||
|
@ -154,8 +144,7 @@ TRACE_EVENT(jbd2_run_stats,
|
|||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(dev);
|
||||
__entry->dev_minor = MINOR(dev);
|
||||
__entry->dev = dev;
|
||||
__entry->tid = tid;
|
||||
__entry->wait = stats->rs_wait;
|
||||
__entry->running = stats->rs_running;
|
||||
|
@ -167,9 +156,9 @@ TRACE_EVENT(jbd2_run_stats,
|
|||
__entry->blocks_logged = stats->rs_blocks_logged;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d tid %lu wait %u running %u locked %u flushing %u "
|
||||
TP_printk("dev %s tid %lu wait %u running %u locked %u flushing %u "
|
||||
"logging %u handle_count %u blocks %u blocks_logged %u",
|
||||
__entry->dev_major, __entry->dev_minor, __entry->tid,
|
||||
jbd2_dev_to_name(__entry->dev), __entry->tid,
|
||||
jiffies_to_msecs(__entry->wait),
|
||||
jiffies_to_msecs(__entry->running),
|
||||
jiffies_to_msecs(__entry->locked),
|
||||
|
@ -186,8 +175,7 @@ TRACE_EVENT(jbd2_checkpoint_stats,
|
|||
TP_ARGS(dev, tid, stats),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( unsigned long, tid )
|
||||
__field( unsigned long, chp_time )
|
||||
__field( __u32, forced_to_close )
|
||||
|
@ -196,8 +184,7 @@ TRACE_EVENT(jbd2_checkpoint_stats,
|
|||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(dev);
|
||||
__entry->dev_minor = MINOR(dev);
|
||||
__entry->dev = dev;
|
||||
__entry->tid = tid;
|
||||
__entry->chp_time = stats->cs_chp_time;
|
||||
__entry->forced_to_close= stats->cs_forced_to_close;
|
||||
|
@ -205,9 +192,9 @@ TRACE_EVENT(jbd2_checkpoint_stats,
|
|||
__entry->dropped = stats->cs_dropped;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d tid %lu chp_time %u forced_to_close %u "
|
||||
TP_printk("dev %s tid %lu chp_time %u forced_to_close %u "
|
||||
"written %u dropped %u",
|
||||
__entry->dev_major, __entry->dev_minor, __entry->tid,
|
||||
jbd2_dev_to_name(__entry->dev), __entry->tid,
|
||||
jiffies_to_msecs(__entry->chp_time),
|
||||
__entry->forced_to_close, __entry->written, __entry->dropped)
|
||||
);
|
||||
|
@ -220,8 +207,7 @@ TRACE_EVENT(jbd2_cleanup_journal_tail,
|
|||
TP_ARGS(journal, first_tid, block_nr, freed),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( int, dev_major )
|
||||
__field( int, dev_minor )
|
||||
__field( dev_t, dev )
|
||||
__field( tid_t, tail_sequence )
|
||||
__field( tid_t, first_tid )
|
||||
__field(unsigned long, block_nr )
|
||||
|
@ -229,18 +215,16 @@ TRACE_EVENT(jbd2_cleanup_journal_tail,
|
|||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev);
|
||||
__entry->dev = journal->j_fs_dev->bd_dev;
|
||||
__entry->tail_sequence = journal->j_tail_sequence;
|
||||
__entry->first_tid = first_tid;
|
||||
__entry->block_nr = block_nr;
|
||||
__entry->freed = freed;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d from %u to %u offset %lu freed %lu",
|
||||
__entry->dev_major, __entry->dev_minor,
|
||||
__entry->tail_sequence, __entry->first_tid,
|
||||
__entry->block_nr, __entry->freed)
|
||||
TP_printk("dev %s from %u to %u offset %lu freed %lu",
|
||||
jbd2_dev_to_name(__entry->dev), __entry->tail_sequence,
|
||||
__entry->first_tid, __entry->block_nr, __entry->freed)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_JBD2_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче