struct osd_iobuf {
wait_queue_head_t dr_wait;
- atomic_t dr_numreqs; /* number of reqs being processed */
+ atomic_t dr_numreqs; /* number of reqs being processed */
int dr_max_pages;
int dr_npages;
+ unsigned int dr_pextents; /* number block extents */
+ unsigned int dr_lextents; /* number a logical extents */
int dr_error;
int dr_frags;
unsigned int dr_init_at:16, /* the line iobuf was initialized */
init_waitqueue_head(&iobuf->dr_wait);
atomic_set(&iobuf->dr_numreqs, 0);
iobuf->dr_npages = 0;
+ iobuf->dr_lextents = 0;
+ iobuf->dr_pextents = 0;
+
iobuf->dr_error = 0;
iobuf->dr_dev = d;
iobuf->dr_frags = 0;
ENTRY;
LASSERT(iobuf->dr_npages == npages);
- osd_brw_stats_update(osd, iobuf);
iobuf->dr_start_time = ktime_get();
integrity_enabled = bdev_integrity_enabled(bdev, iobuf->dr_rw);
static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt,
struct niobuf_local *lnb, int npages)
{
+ struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
struct osd_thread_info *oti = osd_oti_get(env);
+ struct osd_iobuf *iobuf = &oti->oti_iobuf;
struct pagevec pvec;
int i;
+ osd_brw_stats_update(osd, iobuf);
ll_pagevec_init(&pvec, 0);
for (i = 0; i < npages; i++) {
if (fp == NULL) { /* start new extent */
fp = *page++;
clen = 1;
+ iobuf->dr_lextents++;
if (++i != pages)
continue;
} else if (fp->index + clen == (*page)->index) {
struct brw_stats *h = &osd->od_brw_stats;
int idx, c = 0;
+ iobuf->dr_pextents++;
+
idx = map.m_flags & LDISKFS_MAP_NEW ?
BRW_ALLOC_TIME : BRW_MAP_TIME;
lprocfs_oh_tally_log2_pcpu(&h->bs_hist[idx],
void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf)
{
struct brw_stats *bs = &osd->od_brw_stats;
- sector_t *last_block = NULL;
- struct page **pages = iobuf->dr_pages;
- struct page *last_page = NULL;
- unsigned long discont_pages = 0;
- unsigned long discont_blocks = 0;
- sector_t *blocks = iobuf->dr_blocks;
- int i, nr_pages = iobuf->dr_npages;
- int blocks_per_page;
- int rw = iobuf->dr_rw;
+ int nr_pages = iobuf->dr_npages;
+ int rw = iobuf->dr_rw;
if (unlikely(nr_pages == 0))
return;
- blocks_per_page = PAGE_SIZE >> osd_sb(osd)->s_blocksize_bits;
-
lprocfs_oh_tally_log2_pcpu(&bs->bs_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_pcpu(&bs->bs_hist[BRW_R_DISCONT_PAGES+rw],
- discont_pages);
+ iobuf->dr_lextents);
lprocfs_oh_tally_pcpu(&bs->bs_hist[BRW_R_DISCONT_BLOCKS+rw],
- discont_blocks);
+ iobuf->dr_pextents);
}
static int osd_stats_init(struct osd_device *osd)