From owner-p4-projects@FreeBSD.ORG Sat Jun 16 16:14:17 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A44761065675; Sat, 16 Jun 2012 16:14:16 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 55069106566C for ; Sat, 16 Jun 2012 16:14:16 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 3652C8FC1C for ; Sat, 16 Jun 2012 16:14:16 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id q5GGEGcf061144 for ; Sat, 16 Jun 2012 16:14:16 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q5GGEFcv061141 for perforce@freebsd.org; Sat, 16 Jun 2012 16:14:15 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Jun 2012 16:14:15 GMT Message-Id: <201206161614.q5GGEFcv061141@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 212957 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Jun 2012 16:14:17 -0000 http://p4web.freebsd.org/@@212957?ac=10 Change 212957 by jhb@jhb_jhbbsd on 2012/06/16 16:13:23 WILLNEED experimenting: - Add a variant of breada() that uses GB_LOCK_NOWAIT. NOREUSE changes: - Add counters to instrument what happens during DONTNEED requests. Affected files ... .. //depot/projects/fadvise/sys/kern/vfs_bio.c#7 edit .. //depot/projects/fadvise/sys/sys/buf.h#4 edit .. //depot/projects/fadvise/sys/ufs/ffs/ffs_vnops.c#10 edit Differences ... ==== //depot/projects/fadvise/sys/kern/vfs_bio.c#7 (text+ko) ==== @@ -94,6 +94,8 @@ static struct proc *bufdaemonproc; +static void breada_flags(struct vnode * vp, daddr_t * rablkno, int * rabsize, + int cnt, struct ucred * cred, int gbflags); static int inmem(struct vnode *vp, daddr_t blkno); static void vm_hold_free_pages(struct buf *bp, int newbsize); static void vm_hold_load_pages(struct buf *bp, vm_offset_t from, @@ -788,8 +790,8 @@ * the buffer is valid and we do not have to do anything. */ void -breada(struct vnode * vp, daddr_t * rablkno, int * rabsize, - int cnt, struct ucred * cred) +breada_flags(struct vnode * vp, daddr_t * rablkno, int * rabsize, + int cnt, struct ucred * cred, int gbflags) { struct buf *rabp; int i; @@ -797,7 +799,7 @@ for (i = 0; i < cnt; i++, rablkno++, rabsize++) { if (inmem(vp, *rablkno)) continue; - rabp = getblk(vp, *rablkno, *rabsize, 0, 0, 0); + rabp = getblk(vp, *rablkno, *rabsize, 0, 0, gbflags); if ((rabp->b_flags & B_CACHE) == 0) { if (!TD_IS_IDLETHREAD(curthread)) @@ -818,6 +820,22 @@ } } +void +breada(struct vnode * vp, daddr_t * rablkno, int * rabsize, + int cnt, struct ucred * cred) +{ + + breada_flags(vp, rablkno, rabsize, cnt, cred, 0); +} + +void +breada_nowait(struct vnode * vp, daddr_t * rablkno, int * rabsize, + int cnt, struct ucred * cred) +{ + + breada_flags(vp, rablkno, rabsize, cnt, cred, GB_LOCK_NOWAIT); +} + /* * Entry point for bread() and breadn() via #defines in sys/buf.h. * @@ -1212,6 +1230,36 @@ return vm_page_count_severe(); } +static SYSCTL_NODE(_vfs, OID_AUTO, brelse, CTLFLAG_RD, NULL, "brelse stats"); + +static int brelse_discard1; +SYSCTL_INT(_vfs_brelse, OID_AUTO, discard1, CTLFLAG_RD, &brelse_discard1, 0, + ""); +static int brelse_rundown1; +SYSCTL_INT(_vfs_brelse, OID_AUTO, rundown1, CTLFLAG_RD, &brelse_rundown1, 0, + ""); +static int brelse_rundown2; +SYSCTL_INT(_vfs_brelse, OID_AUTO, rundown2, CTLFLAG_RD, &brelse_rundown2, 0, + ""); +static int brelse_rundown3; +SYSCTL_INT(_vfs_brelse, OID_AUTO, rundown3, CTLFLAG_RD, &brelse_rundown3, 0, + ""); +static int brelse_inval; +SYSCTL_INT(_vfs_brelse, OID_AUTO, inval, CTLFLAG_RD, &brelse_inval, 0, + ""); +static int brelse_discard_nocache; +SYSCTL_INT(_vfs_brelse, OID_AUTO, discard_nocache, CTLFLAG_RD, + &brelse_discard_nocache, 0, ""); +static int brelse_discard_inval; +SYSCTL_INT(_vfs_brelse, OID_AUTO, discard_inval, CTLFLAG_RD, + &brelse_discard_inval, 0, ""); +static int brelse_discard_error; +SYSCTL_INT(_vfs_brelse, OID_AUTO, discard_error, CTLFLAG_RD, + &brelse_discard_error, 0, ""); +static int brelse_discard_badsize; +SYSCTL_INT(_vfs_brelse, OID_AUTO, discard_badsize, CTLFLAG_RD, + &brelse_discard_badsize, 0, ""); + /* * brelse: * @@ -1248,6 +1296,15 @@ * Either a failed I/O or we were asked to free or not * cache the buffer. */ + brelse_discard1++; + if (bp->b_flags & B_NOCACHE) + brelse_discard_nocache++; + if (bp->b_flags & B_INVAL) + brelse_discard_inval++; + if (bp->b_ioflags & BIO_ERROR) + brelse_discard_error++; + if (bp->b_bufsize <= 0) + brelse_discard_badsize++; bp->b_flags |= B_INVAL; if (!LIST_EMPTY(&bp->b_dep)) buf_deallocate(bp); @@ -1387,16 +1444,18 @@ foff = (foff + PAGE_SIZE) & ~(off_t)PAGE_MASK; } VM_OBJECT_UNLOCK(obj); + brelse_rundown1++; if (bp->b_flags & (B_INVAL | B_RELBUF)) vfs_vmio_release(bp); } else if (bp->b_flags & B_VMIO) { - + brelse_rundown2++; if (bp->b_flags & (B_INVAL | B_RELBUF)) { vfs_vmio_release(bp); } } else if ((bp->b_flags & (B_INVAL | B_RELBUF)) != 0) { + brelse_rundown3++; if (bp->b_bufsize != 0) allocbuf(bp, 0); if (bp->b_vp != NULL) @@ -1434,6 +1493,8 @@ (bp->b_flags & (B_INVAL | B_NOCACHE | B_RELBUF)) != 0) bp->b_flags |= B_INVAL; if (bp->b_flags & B_INVAL) { + if (bp->b_bufsize != 0) + brelse_inval++; if (bp->b_flags & B_DELWRI) bundirty(bp); if (bp->b_vp) ==== //depot/projects/fadvise/sys/sys/buf.h#4 (text+ko) ==== @@ -490,6 +490,7 @@ int breadn_flags(struct vnode *, daddr_t, int, daddr_t *, int *, int, struct ucred *, int, struct buf **); void breada(struct vnode *, daddr_t *, int *, int, struct ucred *); +void breada_nowait(struct vnode *, daddr_t *, int *, int, struct ucred *); void bdwrite(struct buf *); void bawrite(struct buf *); void bdirty(struct buf *); ==== //depot/projects/fadvise/sys/ufs/ffs/ffs_vnops.c#10 (text+ko) ==== @@ -530,7 +530,7 @@ xfersize = fs->fs_bsize - blkoffset; if (resid < xfersize) xfersize = resid; - breada(vp, &lbn, &xfersize, 1, NOCRED); + breada_nowait(vp, &lbn, &xfersize, 1, NOCRED); } resid -= xfersize; start += xfersize;