void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf) { struct brw_stats *s = &osd->od_brw_stats; unsigned long *last_block = NULL; struct page **pages = iobuf->dr_pages; struct page *last_page = NULL; unsigned long discont_pages = 0; unsigned long discont_blocks = 0; unsigned long *blocks = iobuf->dr_blocks; int i, nr_pages = iobuf->dr_npages; int blocks_per_page; int rw = iobuf->dr_rw; if (unlikely(nr_pages == 0)) return; blocks_per_page = PAGE_CACHE_SIZE >> osd_sb(osd)->s_blocksize_bits; lprocfs_oh_tally_log2(&s->hist[BRW_R_PAGES+rw], nr_pages); while (nr_pages-- > 0) { if (last_page && (*pages)->index != (last_page->index + 1)) discont_pages++; last_page = *pages; pages++; for (i = 0; i < blocks_per_page; i++) { if (last_block && *blocks != (*last_block + 1)) discont_blocks++; last_block = blocks++; } } lprocfs_oh_tally(&s->hist[BRW_R_DISCONT_PAGES+rw], discont_pages); lprocfs_oh_tally(&s->hist[BRW_R_DISCONT_BLOCKS+rw], discont_blocks); }
static void record_start_io(struct osd_device *osd, int rw, int discont_pages) { struct obd_histogram *h = osd->od_brw_stats.hist; if (rw == READ) { atomic_inc(&osd->od_r_in_flight); lprocfs_oh_tally(&h[BRW_R_RPC_HIST], atomic_read(&osd->od_r_in_flight)); lprocfs_oh_tally(&h[BRW_R_DISCONT_PAGES], discont_pages); } else { atomic_inc(&osd->od_w_in_flight); lprocfs_oh_tally(&h[BRW_W_RPC_HIST], atomic_read(&osd->od_w_in_flight)); lprocfs_oh_tally(&h[BRW_W_DISCONT_PAGES], discont_pages); } }