don't use ext4_allocation_contexts for tracing
Subsystems (2)
PATCH 1/1 don't use ext4_allocation_contexts for tracing
Many tracepoints were populating an ext4_allocation_context to pass in, but this requires a slab allocation even when tracepoints are off. In fact, 4 of 5 of these allocations were only for tracing. In addition, we were only using a small fraction of the 144 bytes of this structure for this purpose.
We can do away with all these alloc/frees of the ac and simply pass in the bits we care about, instead.
I tested this by turning on tracing and running through xfstests on x86_64. I did not actually do anything with the trace output, however.
---
Note: This will apply after my other patch, "[PATCH] fix oops in ext4_mb_release_group_pa tracing"
I could roll them together if desired.
fs/ext4/mballoc.c | 81 ++++++-------------------------------------- include/trace/events/ext4.h | 49 ++++++++++++++++---------- 2 files changed, 43 insertions(+), 87 deletions(-)
fs/ext4/mballoc.c +12 -69
@@ -3535,8 +3535,7 @@ static int ext4_mb_new_preallocation(struct ext4_allocation_context *ac)*/ static noinline_for_stack intext4_mb_release_inode_pa (struct ext4_buddy *e4b,struct buffer_head *bitmap_bh, -struct ext4_prealloc_space *pa, -struct ext4_allocation_context *ac) +struct ext4_prealloc_space *pa) {struct super_block *sb = e4b->bd_sb;struct ext4_sb_info *sbi =EXT4_SB (sb);
@@ -3554,11 +3553,6 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh,BUG_ON (group != e4b->bd_group && pa->pa_len !=0 ); end = bit + pa->pa_len; -if (ac) { - ac->ac_sb = sb; - ac->ac_inode = pa->pa_inode; - } -while (bit < end) { bit =mb_find_next_zero_bit (bitmap_bh->b_data, end, bit);if (bit >= end)
@@ -3569,16 +3563,9 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh, (unsigned) next - bit, (unsigned) group); free += next - bit; -if (ac) { - ac->ac_b_ex.fe_group = group; - ac->ac_b_ex.fe_start = bit; - ac->ac_b_ex.fe_len = next - bit; - ac->ac_b_ex.fe_logical =0 ; -trace_ext4_mballoc_discard (ac); - } - -trace_ext4_mb_release_inode_pa (sb, ac, pa, grp_blk_start + bit, - next - bit); +trace_ext4_mballoc_discard (sb,NULL , group, bit, next - bit,0 ); +trace_ext4_mb_release_inode_pa (sb, pa->pa_inode, pa, + grp_blk_start + bit, next - bit);mb_free_blocks (pa->pa_inode, e4b, bit, next - bit); bit = next +1 ; }
@@ -3601,29 +3588,19 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh, static noinline_for_stack intext4_mb_release_group_pa (struct ext4_buddy *e4b, -struct ext4_prealloc_space *pa, -struct ext4_allocation_context *ac) +struct ext4_prealloc_space *pa) {struct super_block *sb = e4b->bd_sb;ext4_group_t group;ext4_grpblk_t bit; -trace_ext4_mb_release_group_pa (sb, ac, pa); +trace_ext4_mb_release_group_pa (sb, pa);BUG_ON (pa->pa_deleted ==0 );ext4_get_group_no_and_offset (sb, pa->pa_pstart, &group, &bit);BUG_ON (group != e4b->bd_group && pa->pa_len !=0 );mb_free_blocks (pa->pa_inode, e4b, bit, pa->pa_len);atomic_add (pa->pa_len, &EXT4_SB (sb)->s_mb_discarded); - -if (ac) { - ac->ac_sb = sb; - ac->ac_inode =NULL ; - ac->ac_b_ex.fe_group = group; - ac->ac_b_ex.fe_start = bit; - ac->ac_b_ex.fe_len = pa->pa_len; - ac->ac_b_ex.fe_logical =0 ; -trace_ext4_mballoc_discard (ac); - } +trace_ext4_mballoc_discard (sb,NULL , group, bit, pa->pa_len,0 );return 0 ; }
@@ -3644,7 +3621,6 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,struct ext4_group_info *grp =ext4_get_group_info (sb, group);struct buffer_head *bitmap_bh =NULL ;struct ext4_prealloc_space *pa, *tmp; -struct ext4_allocation_context *ac;struct list_head list;struct ext4_buddy e4b;int err;
@@ -3673,9 +3649,6 @@ ext4_mb_discard_group_preallocations(struct super_block *sb, needed =EXT4_BLOCKS_PER_GROUP (sb) +1 ;INIT_LIST_HEAD (&list); - ac =kmem_cache_alloc (ext4_ac_cachep,GFP_NOFS ); -if (ac) - ac->ac_sb = sb; repeat:ext4_lock_group (sb, group); list_for_each_entry_safe(pa, tmp,
@@ -3730,9 +3703,9 @@ repeat:spin_unlock (pa->pa_obj_lock);if (pa->pa_type ==MB_GROUP_PA ) -ext4_mb_release_group_pa (&e4b, pa, ac); +ext4_mb_release_group_pa (&e4b, pa);else -ext4_mb_release_inode_pa (&e4b, bitmap_bh, pa, ac); +ext4_mb_release_inode_pa (&e4b, bitmap_bh, pa);list_del (&pa->u.pa_tmp_list);call_rcu (&(pa)->u.pa_rcu, ext4_mb_pa_callback);
@@ -3740,8 +3713,6 @@ repeat: out:ext4_unlock_group (sb, group); -if (ac) -kmem_cache_free (ext4_ac_cachep, ac);ext4_mb_unload_buddy (&e4b);put_bh (bitmap_bh);return free;
@@ -3762,7 +3733,6 @@ void ext4_discard_preallocations(struct inode *inode)struct super_block *sb = inode->i_sb;struct buffer_head *bitmap_bh =NULL ;struct ext4_prealloc_space *pa, *tmp; -struct ext4_allocation_context *ac;ext4_group_t group =0 ;struct list_head list;struct ext4_buddy e4b;
@@ -3778,11 +3748,6 @@ void ext4_discard_preallocations(struct inode *inode)INIT_LIST_HEAD (&list); - ac =kmem_cache_alloc (ext4_ac_cachep,GFP_NOFS ); -if (ac) { - ac->ac_sb = sb; - ac->ac_inode = inode; - } repeat:/* first, collect all pa's in the inode */ spin_lock (&ei->i_prealloc_lock);
@@ -3852,7 +3817,7 @@ repeat:ext4_lock_group (sb, group);list_del (&pa->pa_group_list); -ext4_mb_release_inode_pa (&e4b, bitmap_bh, pa, ac); +ext4_mb_release_inode_pa (&e4b, bitmap_bh, pa);ext4_unlock_group (sb, group);ext4_mb_unload_buddy (&e4b);
@@ -3861,8 +3826,6 @@ repeat:list_del (&pa->u.pa_tmp_list);call_rcu (&(pa)->u.pa_rcu, ext4_mb_pa_callback); } -if (ac) -kmem_cache_free (ext4_ac_cachep, ac); }/*
@@ -4060,14 +4023,10 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,struct ext4_buddy e4b;struct list_head discard_list;struct ext4_prealloc_space *pa, *tmp; -struct ext4_allocation_context *ac;mb_debug (1 ,"discard locality group preallocation\n" );INIT_LIST_HEAD (&discard_list); - ac =kmem_cache_alloc (ext4_ac_cachep,GFP_NOFS ); -if (ac) - ac->ac_sb = sb;spin_lock (&lg->lg_prealloc_lock); list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order],
@@ -4119,15 +4078,13 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb, }ext4_lock_group (sb, group);list_del (&pa->pa_group_list); -ext4_mb_release_group_pa (&e4b, pa, ac); +ext4_mb_release_group_pa (&e4b, pa);ext4_unlock_group (sb, group);ext4_mb_unload_buddy (&e4b);list_del (&pa->u.pa_tmp_list);call_rcu (&(pa)->u.pa_rcu, ext4_mb_pa_callback); } -if (ac) -kmem_cache_free (ext4_ac_cachep, ac); }/*
@@ -4491,7 +4448,6 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, {struct buffer_head *bitmap_bh =NULL ;struct super_block *sb = inode->i_sb; -struct ext4_allocation_context *ac =NULL ;struct ext4_group_desc *gdp;unsigned long freed =0 ;unsigned int overflow;
@@ -4546,12 +4502,6 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,if (!ext4_should_writeback_data (inode)) flags |=EXT4_FREE_BLOCKS_METADATA ; - ac =kmem_cache_alloc (ext4_ac_cachep,GFP_NOFS ); -if (ac) { - ac->ac_inode = inode; - ac->ac_sb = sb; - } - do_more: overflow =0 ;ext4_get_group_no_and_offset (sb, block, &block_group, &bit);
@@ -4609,12 +4559,7 @@ do_more: BUG_ON(!mb_test_bit(bit + i, bitmap_bh->b_data)); }#endif -if (ac) { - ac->ac_b_ex.fe_group = block_group; - ac->ac_b_ex.fe_start = bit; - ac->ac_b_ex.fe_len = count; -trace_ext4_mballoc_free (ac); - } +trace_ext4_mballoc_free (sb, inode, block_group, bit, count,0 ); err =ext4_mb_load_buddy (sb, block_group, &e4b);if (err)
@@ -4685,7 +4630,5 @@ error_return:dquot_free_block (inode, freed);brelse (bitmap_bh);ext4_std_error (sb, err); -if (ac) -kmem_cache_free (ext4_ac_cachep, ac);return ; }
include/trace/events/ext4.h +31 -18
97 lines not on this page · raw message
Ted Ts'o
maintainerQuoted 7 lines · Eric Sandeen
Many tracepoints were populating an
ext4_allocation_contextto pass in, but this requires a slab allocation even when tracepoints are off. In fact, 4 of 5 of these allocations were only for tracing. In addition, we were only using a small fraction of the 144 bytes of this structure for this purpose.
Quoted 8 lines
We can do away with all these alloc/frees of the ac and simply pass in the bits we care about, instead.
I tested this by turning on tracing and running through xfstests on
x86_64. I did not actually do anything with the trace output, however.Signed-off-by Eric Sandeen <[email protected]>
Added to the patch tree, thanks!
I made a slight change to drop passing in the logical parameter to trace_ext4_mballoc_discard() and trace_ext4_mballoc_free(), since passing in 0 all the time doesn't really buy us much. :-)
- Ted