Commit f09b00d3 authored by Jens Axboe's avatar Jens Axboe

writeback: add some debug inode list counters to bdi stats

Add some debug entries to be able to inspect the internal state of
the writeback details.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent d0bceac7
...@@ -52,9 +52,29 @@ static void bdi_debug_init(void) ...@@ -52,9 +52,29 @@ static void bdi_debug_init(void)
static int bdi_debug_stats_show(struct seq_file *m, void *v) static int bdi_debug_stats_show(struct seq_file *m, void *v)
{ {
struct backing_dev_info *bdi = m->private; struct backing_dev_info *bdi = m->private;
struct bdi_writeback *wb;
unsigned long background_thresh; unsigned long background_thresh;
unsigned long dirty_thresh; unsigned long dirty_thresh;
unsigned long bdi_thresh; unsigned long bdi_thresh;
unsigned long nr_dirty, nr_io, nr_more_io, nr_wb;
struct inode *inode;
/*
* inode lock is enough here, the bdi->wb_list is protected by
* RCU on the reader side
*/
nr_wb = nr_dirty = nr_io = nr_more_io = 0;
spin_lock(&inode_lock);
list_for_each_entry(wb, &bdi->wb_list, list) {
nr_wb++;
list_for_each_entry(inode, &wb->b_dirty, i_list)
nr_dirty++;
list_for_each_entry(inode, &wb->b_io, i_list)
nr_io++;
list_for_each_entry(inode, &wb->b_more_io, i_list)
nr_more_io++;
}
spin_unlock(&inode_lock);
get_dirty_limits(&background_thresh, &dirty_thresh, &bdi_thresh, bdi); get_dirty_limits(&background_thresh, &dirty_thresh, &bdi_thresh, bdi);
...@@ -64,12 +84,22 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) ...@@ -64,12 +84,22 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v)
"BdiReclaimable: %8lu kB\n" "BdiReclaimable: %8lu kB\n"
"BdiDirtyThresh: %8lu kB\n" "BdiDirtyThresh: %8lu kB\n"
"DirtyThresh: %8lu kB\n" "DirtyThresh: %8lu kB\n"
"BackgroundThresh: %8lu kB\n", "BackgroundThresh: %8lu kB\n"
"WriteBack threads:%8lu\n"
"b_dirty: %8lu\n"
"b_io: %8lu\n"
"b_more_io: %8lu\n"
"bdi_list: %8u\n"
"state: %8lx\n"
"wb_mask: %8lx\n"
"wb_list: %8u\n"
"wb_cnt: %8u\n",
(unsigned long) K(bdi_stat(bdi, BDI_WRITEBACK)), (unsigned long) K(bdi_stat(bdi, BDI_WRITEBACK)),
(unsigned long) K(bdi_stat(bdi, BDI_RECLAIMABLE)), (unsigned long) K(bdi_stat(bdi, BDI_RECLAIMABLE)),
K(bdi_thresh), K(bdi_thresh), K(dirty_thresh),
K(dirty_thresh), K(background_thresh), nr_wb, nr_dirty, nr_io, nr_more_io,
K(background_thresh)); !list_empty(&bdi->bdi_list), bdi->state, bdi->wb_mask,
!list_empty(&bdi->wb_list), bdi->wb_cnt);
#undef K #undef K
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment