@@ -578,6 +578,7 @@ enum ra_stat {
RA_STAT_ASYNC,
RA_STAT_FAILED_FAST_READ,
RA_STAT_MMAP_RANGE_READ,
+ RA_STAT_READAHEAD_PAGES,
_NR_RA_STAT,
};
@@ -1858,6 +1858,7 @@ void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, long count)
[RA_STAT_ASYNC] = "async readahead",
[RA_STAT_FAILED_FAST_READ] = "failed to fast read",
[RA_STAT_MMAP_RANGE_READ] = "mmap range read",
+ [RA_STAT_READAHEAD_PAGES] = "readahead_pages",
};
int ll_debugfs_register_super(struct super_block *sb, const char *name)
@@ -1911,9 +1912,17 @@ int ll_debugfs_register_super(struct super_block *sb, const char *name)
goto out_stats;
}
- for (id = 0; id < ARRAY_SIZE(ra_stat_string); id++)
- lprocfs_counter_init(sbi->ll_ra_stats, id, LPROCFS_TYPE_PAGES,
- ra_stat_string[id]);
+ for (id = 0; id < ARRAY_SIZE(ra_stat_string); id++) {
+ if (id == RA_STAT_READAHEAD_PAGES)
+ lprocfs_counter_init(sbi->ll_ra_stats, id,
+ LPROCFS_TYPE_PAGES |
+ LPROCFS_CNTR_AVGMINMAX,
+ ra_stat_string[id]);
+ else
+ lprocfs_counter_init(sbi->ll_ra_stats, id,
+ LPROCFS_TYPE_PAGES,
+ ra_stat_string[id]);
+ }
debugfs_create_file("read_ahead_stats", 0644, sbi->ll_debugfs_entry,
sbi->ll_ra_stats, &lprocfs_stats_seq_fops);
@@ -150,6 +150,14 @@ void ll_ra_stats_inc(struct inode *inode, enum ra_stat which)
ll_ra_stats_inc_sbi(sbi, which);
}
+void ll_ra_stats_add(struct inode *inode, enum ra_stat which, long count)
+{
+ struct ll_sb_info *sbi = ll_i2sbi(inode);
+
+ LASSERTF(which < _NR_RA_STAT, "which: %u\n", which);
+ lprocfs_counter_add(sbi->ll_ra_stats, which, count);
+}
+
#define RAS_CDEBUG(ras) \
CDEBUG(D_READA, \
"lre %llu cr %lu cb %llu wsi %lu wp %lu nra %lu rpc %lu r %lu csr %lu so %llu sb %llu sl %llu lr %lu\n", \
@@ -528,6 +536,10 @@ static bool ras_inside_ra_window(pgoff_t idx, struct ra_io_arg *ria)
}
cl_read_ahead_release(env, &ra);
+ if (count)
+ ll_ra_stats_add(vvp_object_inode(io->ci_obj),
+ RA_STAT_READAHEAD_PAGES, count);
+
return count;
}