@@ -2963,6 +2963,92 @@ int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset)
2963
2963
return 0 ;
2964
2964
}
2965
2965
2966
+ static void * ext4_mb_seq_structs_summary_start (struct seq_file * seq , loff_t * pos )
2967
+ {
2968
+ struct super_block * sb = PDE_DATA (file_inode (seq -> file ));
2969
+ unsigned long position ;
2970
+
2971
+ read_lock (& EXT4_SB (sb )-> s_mb_rb_lock );
2972
+
2973
+ if (* pos < 0 || * pos >= MB_NUM_ORDERS (sb ) + 1 )
2974
+ return NULL ;
2975
+ position = * pos + 1 ;
2976
+ return (void * ) ((unsigned long ) position );
2977
+ }
2978
+
2979
+ static void * ext4_mb_seq_structs_summary_next (struct seq_file * seq , void * v , loff_t * pos )
2980
+ {
2981
+ struct super_block * sb = PDE_DATA (file_inode (seq -> file ));
2982
+ unsigned long position ;
2983
+
2984
+ ++ * pos ;
2985
+ if (* pos < 0 || * pos >= MB_NUM_ORDERS (sb ) + 1 )
2986
+ return NULL ;
2987
+ position = * pos + 1 ;
2988
+ return (void * ) ((unsigned long ) position );
2989
+ }
2990
+
2991
+ static int ext4_mb_seq_structs_summary_show (struct seq_file * seq , void * v )
2992
+ {
2993
+ struct super_block * sb = PDE_DATA (file_inode (seq -> file ));
2994
+ struct ext4_sb_info * sbi = EXT4_SB (sb );
2995
+ unsigned long position = ((unsigned long ) v );
2996
+ struct ext4_group_info * grp ;
2997
+ struct rb_node * n ;
2998
+ unsigned int count , min , max ;
2999
+
3000
+ position -- ;
3001
+ if (position >= MB_NUM_ORDERS (sb )) {
3002
+ seq_puts (seq , "fragment_size_tree:\n" );
3003
+ n = rb_first (& sbi -> s_mb_avg_fragment_size_root );
3004
+ if (!n ) {
3005
+ seq_puts (seq , "\ttree_min: 0\n\ttree_max: 0\n\ttree_nodes: 0\n" );
3006
+ return 0 ;
3007
+ }
3008
+ grp = rb_entry (n , struct ext4_group_info , bb_avg_fragment_size_rb );
3009
+ min = grp -> bb_fragments ? grp -> bb_free / grp -> bb_fragments : 0 ;
3010
+ count = 1 ;
3011
+ while (rb_next (n )) {
3012
+ count ++ ;
3013
+ n = rb_next (n );
3014
+ }
3015
+ grp = rb_entry (n , struct ext4_group_info , bb_avg_fragment_size_rb );
3016
+ max = grp -> bb_fragments ? grp -> bb_free / grp -> bb_fragments : 0 ;
3017
+
3018
+ seq_printf (seq , "\ttree_min: %u\n\ttree_max: %u\n\ttree_nodes: %u\n" ,
3019
+ min , max , count );
3020
+ return 0 ;
3021
+ }
3022
+
3023
+ if (position == 0 ) {
3024
+ seq_printf (seq , "optimize_scan: %d\n" ,
3025
+ test_opt2 (sb , MB_OPTIMIZE_SCAN ) ? 1 : 0 );
3026
+ seq_puts (seq , "max_free_order_lists:\n" );
3027
+ }
3028
+ count = 0 ;
3029
+ list_for_each_entry (grp , & sbi -> s_mb_largest_free_orders [position ],
3030
+ bb_largest_free_order_node )
3031
+ count ++ ;
3032
+ seq_printf (seq , "\tlist_order_%u_groups: %u\n" ,
3033
+ (unsigned int )position , count );
3034
+
3035
+ return 0 ;
3036
+ }
3037
+
3038
+ static void ext4_mb_seq_structs_summary_stop (struct seq_file * seq , void * v )
3039
+ {
3040
+ struct super_block * sb = PDE_DATA (file_inode (seq -> file ));
3041
+
3042
+ read_unlock (& EXT4_SB (sb )-> s_mb_rb_lock );
3043
+ }
3044
+
3045
+ const struct seq_operations ext4_mb_seq_structs_summary_ops = {
3046
+ .start = ext4_mb_seq_structs_summary_start ,
3047
+ .next = ext4_mb_seq_structs_summary_next ,
3048
+ .stop = ext4_mb_seq_structs_summary_stop ,
3049
+ .show = ext4_mb_seq_structs_summary_show ,
3050
+ };
3051
+
2966
3052
static struct kmem_cache * get_groupinfo_cache (int blocksize_bits )
2967
3053
{
2968
3054
int cache_index = blocksize_bits - EXT4_MIN_BLOCK_LOG_SIZE ;
0 commit comments