buf: Fix the dirtybufthresh check
dirtybufthresh is a watermark, slightly below the high watermark for
dirty buffers. When a delayed write is issued, the dirtying thread will
start flushing buffers if the dirtybufthresh watermark is reached. This
helps ensure that the high watermark is not reached, otherwise
performance will degrade as clustering and other optimizations are
disabled (see buf_dirty_count_severe()).
When the buffer cache was partitioned into "domains", the dirtybufthresh
threshold checks were not updated. Fix this.
Reported by: Shrikanth R Kamath <kshrikanth@juniper.net>
Reviewed by: rlibby, mckusick, kib, bdrewery
Sponsored by: Juniper Networks, Inc., Klara, Inc.
Fixes: 3cec5c77d6
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D28901
This commit is contained in:
parent
faa998f6ff
commit
369706a6f8
@ -2325,11 +2325,13 @@ void
|
|||||||
bufbdflush(struct bufobj *bo, struct buf *bp)
|
bufbdflush(struct bufobj *bo, struct buf *bp)
|
||||||
{
|
{
|
||||||
struct buf *nbp;
|
struct buf *nbp;
|
||||||
|
struct bufdomain *bd;
|
||||||
|
|
||||||
if (bo->bo_dirty.bv_cnt > dirtybufthresh + 10) {
|
bd = &bdomain[bo->bo_domain];
|
||||||
|
if (bo->bo_dirty.bv_cnt > bd->bd_dirtybufthresh + 10) {
|
||||||
(void) VOP_FSYNC(bp->b_vp, MNT_NOWAIT, curthread);
|
(void) VOP_FSYNC(bp->b_vp, MNT_NOWAIT, curthread);
|
||||||
altbufferflushes++;
|
altbufferflushes++;
|
||||||
} else if (bo->bo_dirty.bv_cnt > dirtybufthresh) {
|
} else if (bo->bo_dirty.bv_cnt > bd->bd_dirtybufthresh) {
|
||||||
BO_LOCK(bo);
|
BO_LOCK(bo);
|
||||||
/*
|
/*
|
||||||
* Try to find a buffer to flush.
|
* Try to find a buffer to flush.
|
||||||
|
Loading…
Reference in New Issue
Block a user