@@ -2152,14 +2152,21 @@ dump_brt(spa_t *spa)
2152
2152
if (dump_opt ['T' ] < 3 )
2153
2153
return ;
2154
2154
2155
+ /* -TTT shows a per-vdev histograms; -TTTT shows all entries */
2156
+ boolean_t do_histo = dump_opt ['T' ] == 3 ;
2157
+
2155
2158
char dva [64 ];
2156
- printf ("\n%-16s %-10s\n" , "DVA" , "REFCNT" );
2159
+
2160
+ if (!do_histo )
2161
+ printf ("\n%-16s %-10s\n" , "DVA" , "REFCNT" );
2157
2162
2158
2163
for (uint64_t vdevid = 0 ; vdevid < brt -> brt_nvdevs ; vdevid ++ ) {
2159
2164
brt_vdev_t * brtvd = & brt -> brt_vdevs [vdevid ];
2160
2165
if (brtvd == NULL || !brtvd -> bv_initiated )
2161
2166
continue ;
2162
2167
2168
+ uint64_t counts [64 ] = {};
2169
+
2163
2170
zap_cursor_t zc ;
2164
2171
zap_attribute_t * za = zap_attribute_alloc ();
2165
2172
for (zap_cursor_init (& zc , brt -> brt_mos , brtvd -> bv_mos_entries );
@@ -2172,14 +2179,26 @@ dump_brt(spa_t *spa)
2172
2179
za -> za_integer_length , za -> za_num_integers ,
2173
2180
& refcnt ));
2174
2181
2175
- uint64_t offset = * (const uint64_t * )za -> za_name ;
2182
+ if (do_histo )
2183
+ counts [highbit64 (refcnt )]++ ;
2184
+ else {
2185
+ uint64_t offset =
2186
+ * (const uint64_t * )za -> za_name ;
2176
2187
2177
- snprintf (dva , sizeof (dva ), "%" PRIu64 ":%llx" , vdevid ,
2178
- (u_longlong_t )offset );
2179
- printf ("%-16s %-10llu\n" , dva , (u_longlong_t )refcnt );
2188
+ snprintf (dva , sizeof (dva ), "%" PRIu64 ":%llx" ,
2189
+ vdevid , (u_longlong_t )offset );
2190
+ printf ("%-16s %-10llu\n" , dva ,
2191
+ (u_longlong_t )refcnt );
2192
+ }
2180
2193
}
2181
2194
zap_cursor_fini (& zc );
2182
2195
zap_attribute_free (za );
2196
+
2197
+ if (do_histo ) {
2198
+ printf ("\nBRT: vdev %" PRIu64
2199
+ ": DVAs with 2^n refcnts:\n" , vdevid );
2200
+ dump_histogram (counts , 64 , 0 );
2201
+ }
2183
2202
}
2184
2203
}
2185
2204
0 commit comments