diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 10ee88328875..d6392c025a94 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -206,7 +206,7 @@ static int sysctl_bufspace(SYSCTL_HANDLER_ARGS); int vmiodirenable = TRUE; SYSCTL_INT(_vfs, OID_AUTO, vmiodirenable, CTLFLAG_RW, &vmiodirenable, 0, "Use the VM system for directory writes"); -long runningbufspace; +static long runningbufspace; SYSCTL_LONG(_vfs, OID_AUTO, runningbufspace, CTLFLAG_RD, &runningbufspace, 0, "Amount of presently outstanding async buffer io"); SYSCTL_PROC(_vfs, OID_AUTO, bufspace, CTLTYPE_LONG|CTLFLAG_MPSAFE|CTLFLAG_RD, @@ -941,6 +941,16 @@ runningbufwakeup(struct buf *bp) runningwakeup(); } +long +runningbufclaim(struct buf *bp, int space) +{ + long old; + + old = atomic_fetchadd_long(&runningbufspace, space); + bp->b_runningbufspace = space; + return (old); +} + /* * waitrunningbufspace() * @@ -2352,8 +2362,7 @@ bufwrite(struct buf *bp) /* * Normal bwrites pipeline writes */ - bp->b_runningbufspace = bp->b_bufsize; - space = atomic_fetchadd_long(&runningbufspace, bp->b_runningbufspace); + space = runningbufclaim(bp, bp->b_bufsize); #ifdef RACCT if (racct_enable) { diff --git a/sys/sys/buf.h b/sys/sys/buf.h index 832cfaa617a5..9d916faef4b1 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -519,7 +519,6 @@ extern int nbuf; /* The number of buffer headers */ extern u_long maxswzone; /* Max KVA for swap structures */ extern u_long maxbcache; /* Max KVA for buffer cache */ extern int maxbcachebuf; /* Max buffer cache block size */ -extern long runningbufspace; extern long hibufspace; extern int dirtybufthresh; extern int bdwriteskip; @@ -536,6 +535,7 @@ buf_mapped(struct buf *bp) return (bp->b_data != unmapped_buf); } +long runningbufclaim(struct buf *, int); void runningbufwakeup(struct buf *); void waitrunningbufspace(void); caddr_t kern_vfs_bio_buffer_alloc(caddr_t v, long physmem_est); diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index b0adb6c033c7..f4eed782f7bc 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -2343,9 +2343,8 @@ ffs_copyonwrite(struct vnode *devvp, struct buf *bp) TAILQ_EMPTY(&sn->sn_head)) { VI_UNLOCK(devvp); if (saved_runningbufspace != 0) { - bp->b_runningbufspace = saved_runningbufspace; - atomic_add_long(&runningbufspace, - bp->b_runningbufspace); + (void)runningbufclaim(bp, + saved_runningbufspace); } return (0); /* Snapshot gone */ } @@ -2479,10 +2478,8 @@ ffs_copyonwrite(struct vnode *devvp, struct buf *bp) /* * I/O on bp will now be started, so count it in runningbufspace. */ - if (saved_runningbufspace != 0) { - bp->b_runningbufspace = saved_runningbufspace; - atomic_add_long(&runningbufspace, bp->b_runningbufspace); - } + if (saved_runningbufspace != 0) + (void)runningbufclaim(bp, saved_runningbufspace); return (error); } diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index bcf7f0f05a7b..2bfee6a6145d 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -2517,9 +2517,7 @@ ffs_geom_strategy(struct bufobj *bo, struct buf *bp) return; } } - bp->b_runningbufspace = bp->b_bufsize; - atomic_add_long(&runningbufspace, - bp->b_runningbufspace); + (void)runningbufclaim(bp, bp->b_bufsize); } else { error = ffs_copyonwrite(vp, bp); if (error != 0 && error != EOPNOTSUPP) { diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 98b905f27c4a..842d4ab89b90 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -717,8 +717,7 @@ vnode_pager_input_smlfs(vm_object_t object, vm_page_t m) bp->b_vp = vp; bp->b_bcount = bsize; bp->b_bufsize = bsize; - bp->b_runningbufspace = bp->b_bufsize; - atomic_add_long(&runningbufspace, bp->b_runningbufspace); + (void)runningbufclaim(bp, bp->b_bufsize); /* do the input */ bp->b_iooffset = dbtob(bp->b_blkno); @@ -1160,7 +1159,7 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int count, bp->b_wcred = crhold(curthread->td_ucred); pbgetbo(bo, bp); bp->b_vp = vp; - bp->b_bcount = bp->b_bufsize = bp->b_runningbufspace = bytecount; + bp->b_bcount = bp->b_bufsize = bytecount; bp->b_iooffset = dbtob(bp->b_blkno); KASSERT(IDX_TO_OFF(m[0]->pindex - bp->b_pages[0]->pindex) == (blkno0 - bp->b_blkno) * DEV_BSIZE + @@ -1170,7 +1169,8 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int count, (uintmax_t)m[0]->pindex, (uintmax_t)bp->b_pages[0]->pindex, (uintmax_t)blkno0, (uintmax_t)bp->b_blkno)); - atomic_add_long(&runningbufspace, bp->b_runningbufspace); + (void)runningbufclaim(bp, bp->b_bufsize); + VM_CNT_INC(v_vnodein); VM_CNT_ADD(v_vnodepgsin, bp->b_npages);