Optimize the use of splay in gbincore(). During a "make buildworld" the
desired buffer is found at one of the roots more than 60% of the time. Thus, checking both roots before performing either splay eliminates unnecessary splays on the first tree splayed. Approved by: re (jhb)
This commit is contained in:
parent
4a49423d71
commit
099e981aa1
@ -1565,6 +1565,11 @@ buf_vlist_add(struct buf *bp, struct vnode *vp, b_xflags_t xflags)
|
|||||||
*
|
*
|
||||||
* This code isn't quite efficient as it could be because we are maintaining
|
* This code isn't quite efficient as it could be because we are maintaining
|
||||||
* two sorted lists and do not know which list the block resides in.
|
* two sorted lists and do not know which list the block resides in.
|
||||||
|
*
|
||||||
|
* During a "make buildworld" the desired buffer is found at one of
|
||||||
|
* the roots more than 60% of the time. Thus, checking both roots
|
||||||
|
* before performing either splay eliminates unnecessary splays on the
|
||||||
|
* first tree splayed.
|
||||||
*/
|
*/
|
||||||
struct buf *
|
struct buf *
|
||||||
gbincore(struct vnode *vp, daddr_t lblkno)
|
gbincore(struct vnode *vp, daddr_t lblkno)
|
||||||
@ -1574,13 +1579,23 @@ gbincore(struct vnode *vp, daddr_t lblkno)
|
|||||||
GIANT_REQUIRED;
|
GIANT_REQUIRED;
|
||||||
|
|
||||||
ASSERT_VI_LOCKED(vp, "gbincore");
|
ASSERT_VI_LOCKED(vp, "gbincore");
|
||||||
bp = vp->v_cleanblkroot = buf_splay(lblkno, 0, vp->v_cleanblkroot);
|
if ((bp = vp->v_cleanblkroot) != NULL &&
|
||||||
if (bp && bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
|
bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
|
||||||
return(bp);
|
return (bp);
|
||||||
bp = vp->v_dirtyblkroot = buf_splay(lblkno, 0, vp->v_dirtyblkroot);
|
if ((bp = vp->v_dirtyblkroot) != NULL &&
|
||||||
if (bp && bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
|
bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
|
||||||
return(bp);
|
return (bp);
|
||||||
return(NULL);
|
if ((bp = vp->v_cleanblkroot) != NULL) {
|
||||||
|
vp->v_cleanblkroot = bp = buf_splay(lblkno, 0, bp);
|
||||||
|
if (bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
if ((bp = vp->v_dirtyblkroot) != NULL) {
|
||||||
|
vp->v_dirtyblkroot = bp = buf_splay(lblkno, 0, bp);
|
||||||
|
if (bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user