aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_bio.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2016-11-22 10:06:39 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2016-11-22 10:06:39 +0000
commiteb962424ba95f78b084f204b86d2dce3a523529d (patch)
tree82994c6b1919c0e311f3a3973b064ca2f7a2b244 /sys/kern/vfs_bio.c
parentf1568d1e0356e12941c997ef9e7b804971fdab94 (diff)
downloadsrc-eb962424ba95f78b084f204b86d2dce3a523529d.tar.gz
src-eb962424ba95f78b084f204b86d2dce3a523529d.zip
Restore vnode pager statistic for buffer pagers.
Reviewed by: alc, markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D8585
Notes
Notes: svn path=/head/; revision=308969
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r--sys/kern/vfs_bio.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 8d3d839d99e6..bdd088adcf5a 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -4707,7 +4707,7 @@ vfs_bio_getpages(struct vnode *vp, vm_page_t *ma, int count,
daddr_t lbn, lbnp;
vm_ooffset_t la, lb, poff, poffe;
long bsize;
- int bo_bs, br_flags, error, i;
+ int bo_bs, br_flags, error, i, pgsin, pgsin_a, pgsin_b;
bool redo, lpart;
object = vp->v_object;
@@ -4717,17 +4717,26 @@ vfs_bio_getpages(struct vnode *vp, vm_page_t *ma, int count,
return (VM_PAGER_BAD);
lpart = la + PAGE_SIZE > object->un_pager.vnp.vnp_size;
bo_bs = get_blksize(vp, get_lblkno(vp, IDX_TO_OFF(ma[0]->pindex)));
- if (rbehind != NULL) {
- lb = IDX_TO_OFF(ma[0]->pindex);
- *rbehind = OFF_TO_IDX(lb - rounddown2(lb, bo_bs));
- }
- if (rahead != NULL) {
- *rahead = OFF_TO_IDX(roundup2(la, bo_bs) - la);
- if (la + IDX_TO_OFF(*rahead) >= object->un_pager.vnp.vnp_size) {
- *rahead = OFF_TO_IDX(roundup2(object->un_pager.
- vnp.vnp_size, PAGE_SIZE) - la);
- }
- }
+
+ /*
+ * Calculate read-ahead, behind and total pages.
+ */
+ pgsin = count;
+ lb = IDX_TO_OFF(ma[0]->pindex);
+ pgsin_b = OFF_TO_IDX(lb - rounddown2(lb, bo_bs));
+ pgsin += pgsin_b;
+ if (rbehind != NULL)
+ *rbehind = pgsin_b;
+ pgsin_a = OFF_TO_IDX(roundup2(la, bo_bs) - la);
+ if (la + IDX_TO_OFF(pgsin_a) >= object->un_pager.vnp.vnp_size)
+ pgsin_a = OFF_TO_IDX(roundup2(object->un_pager.vnp.vnp_size,
+ PAGE_SIZE) - la);
+ pgsin += pgsin_a;
+ if (rahead != NULL)
+ *rahead = pgsin_a;
+ PCPU_INC(cnt.v_vnodein);
+ PCPU_ADD(cnt.v_vnodepgsin, pgsin);
+
br_flags = (mp != NULL && (mp->mnt_kern_flag & MNTK_UNMAPPED_BUFS)
!= 0) ? GB_UNMAPPED : 0;
VM_OBJECT_WLOCK(object);