Module Name: src Committed By: jdolecek Date: Mon Apr 10 19:52:38 UTC 2017
Modified Files: src/sys/kern: vfs_wapbl.c src/sys/sys: buf.h param.h Log Message: change b_wapbllist to TAILQ, to preserve the LRU order To generate a diff of this commit: cvs rdiff -u -r1.93 -r1.94 src/sys/kern/vfs_wapbl.c cvs rdiff -u -r1.127 -r1.128 src/sys/sys/buf.h cvs rdiff -u -r1.534 -r1.535 src/sys/sys/param.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/vfs_wapbl.c diff -u src/sys/kern/vfs_wapbl.c:1.93 src/sys/kern/vfs_wapbl.c:1.94 --- src/sys/kern/vfs_wapbl.c:1.93 Wed Apr 5 20:38:53 2017 +++ src/sys/kern/vfs_wapbl.c Mon Apr 10 19:52:38 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_wapbl.c,v 1.93 2017/04/05 20:38:53 jdolecek Exp $ */ +/* $NetBSD: vfs_wapbl.c,v 1.94 2017/04/10 19:52:38 jdolecek Exp $ */ /*- * Copyright (c) 2003, 2008, 2009 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #define WAPBL_INTERNAL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.93 2017/04/05 20:38:53 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.94 2017/04/10 19:52:38 jdolecek Exp $"); #include <sys/param.h> #include <sys/bitops.h> @@ -199,7 +199,7 @@ struct wapbl { size_t wl_bufcount; /* m: Count of buffers in wl_bufs */ size_t wl_bcount; /* m: Total bcount of wl_bufs */ - LIST_HEAD(, buf) wl_bufs; /* m: Buffers in current transaction */ + TAILQ_HEAD(, buf) wl_bufs; /* m: Buffers in current transaction */ kcondvar_t wl_reclaimable_cv; /* m (obviously) */ size_t wl_reclaimable_bytes; /* m: Amount of space available for @@ -542,7 +542,7 @@ wapbl_start(struct wapbl ** wlp, struct rw_init(&wl->wl_rwlock); mutex_init(&wl->wl_mtx, MUTEX_DEFAULT, IPL_NONE); cv_init(&wl->wl_reclaimable_cv, "wapblrec"); - LIST_INIT(&wl->wl_bufs); + TAILQ_INIT(&wl->wl_bufs); SIMPLEQ_INIT(&wl->wl_entries); wl->wl_logvp = vp; @@ -750,7 +750,7 @@ wapbl_discard(struct wapbl *wl) */ mutex_enter(&bufcache_lock); mutex_enter(&wl->wl_mtx); - while ((bp = LIST_FIRST(&wl->wl_bufs)) != NULL) { + while ((bp = TAILQ_FIRST(&wl->wl_bufs)) != NULL) { if (bbusy(bp, 0, 0, &wl->wl_mtx) == 0) { /* * The buffer will be unlocked and @@ -791,7 +791,7 @@ wapbl_discard(struct wapbl *wl) KASSERT(wl->wl_bufbytes == 0); KASSERT(wl->wl_bcount == 0); KASSERT(wl->wl_bufcount == 0); - KASSERT(LIST_EMPTY(&wl->wl_bufs)); + KASSERT(TAILQ_EMPTY(&wl->wl_bufs)); KASSERT(SIMPLEQ_EMPTY(&wl->wl_entries)); KASSERT(wl->wl_inohashcnt == 0); KASSERT(TAILQ_EMPTY(&wl->wl_dealloclist)); @@ -826,7 +826,7 @@ wapbl_stop(struct wapbl *wl, int force) KASSERT(wl->wl_bufbytes == 0); KASSERT(wl->wl_bcount == 0); KASSERT(wl->wl_bufcount == 0); - KASSERT(LIST_EMPTY(&wl->wl_bufs)); + KASSERT(TAILQ_EMPTY(&wl->wl_bufs)); KASSERT(wl->wl_dealloccnt == 0); KASSERT(SIMPLEQ_EMPTY(&wl->wl_entries)); KASSERT(wl->wl_inohashcnt == 0); @@ -1180,7 +1180,7 @@ wapbl_add_buf(struct wapbl *wl, struct b mutex_enter(&wl->wl_mtx); if (bp->b_flags & B_LOCKED) { - LIST_REMOVE(bp, b_wapbllist); + TAILQ_REMOVE(&wl->wl_bufs, bp, b_wapbllist); WAPBL_PRINTF(WAPBL_PRINT_BUFFER2, ("wapbl_add_buf thread %d.%d re-adding buf %p " "with %d bytes %d bcount\n", @@ -1198,7 +1198,7 @@ wapbl_add_buf(struct wapbl *wl, struct b curproc->p_pid, curlwp->l_lid, bp, bp->b_bufsize, bp->b_bcount)); } - LIST_INSERT_HEAD(&wl->wl_bufs, bp, b_wapbllist); + TAILQ_INSERT_TAIL(&wl->wl_bufs, bp, b_wapbllist); mutex_exit(&wl->wl_mtx); bp->b_flags |= B_LOCKED; @@ -1236,7 +1236,7 @@ wapbl_remove_buf_locked(struct wapbl * w wl->wl_bufcount--; KASSERT((wl->wl_bufcount == 0) == (wl->wl_bufbytes == 0)); KASSERT((wl->wl_bufcount == 0) == (wl->wl_bcount == 0)); - LIST_REMOVE(bp, b_wapbllist); + TAILQ_REMOVE(&wl->wl_bufs, bp, b_wapbllist); bp->b_flags &= ~B_LOCKED; } @@ -1799,12 +1799,10 @@ wapbl_flush(struct wapbl *wl, int waitfo SIMPLEQ_INSERT_TAIL(&wl->wl_entries, we, we_entries); /* - * this flushes bufs in reverse order than they were queued - * it shouldn't matter, but if we care we could use TAILQ instead. - * XXX Note they will get put on the lru queue when they flush - * so we might actually want to change this to preserve order. + * This flushes bufs in order than they were queued, so the LRU + * order is preserved. */ - while ((bp = LIST_FIRST(&wl->wl_bufs)) != NULL) { + while ((bp = TAILQ_FIRST(&wl->wl_bufs)) != NULL) { if (bbusy(bp, 0, 0, &wl->wl_mtx)) { continue; } @@ -1969,8 +1967,8 @@ wapbl_print(struct wapbl *wl, if (full) { int cnt = 0; (*pr)("bufs ="); - LIST_FOREACH(bp, &wl->wl_bufs, b_wapbllist) { - if (!LIST_NEXT(bp, b_wapbllist)) { + TAILQ_FOREACH(bp, &wl->wl_bufs, b_wapbllist) { + if (!TAILQ_NEXT(bp, b_wapbllist)) { (*pr)(" %p", bp); } else if ((++cnt % 6) == 0) { (*pr)(" %p,\n\t", bp); @@ -2406,7 +2404,7 @@ wapbl_write_blocks(struct wapbl *wl, off KASSERT(rw_write_held(&wl->wl_rwlock)); - bp = LIST_FIRST(&wl->wl_bufs); + bp = TAILQ_FIRST(&wl->wl_bufs); while (bp) { int cnt; @@ -2438,7 +2436,7 @@ wapbl_write_blocks(struct wapbl *wl, off wc->wc_blocks[wc->wc_blkcount].wc_dlen = bp->b_bcount; wc->wc_len += bp->b_bcount; wc->wc_blkcount++; - bp = LIST_NEXT(bp, b_wapbllist); + bp = TAILQ_NEXT(bp, b_wapbllist); } if (wc->wc_len % blocklen != 0) { padding = blocklen - wc->wc_len % blocklen; @@ -2461,7 +2459,7 @@ wapbl_write_blocks(struct wapbl *wl, off bp->b_bcount, &off); if (error) return error; - bp = LIST_NEXT(bp, b_wapbllist); + bp = TAILQ_NEXT(bp, b_wapbllist); } if (padding) { void *zero; Index: src/sys/sys/buf.h diff -u src/sys/sys/buf.h:1.127 src/sys/sys/buf.h:1.128 --- src/sys/sys/buf.h:1.127 Wed Apr 5 20:15:49 2017 +++ src/sys/sys/buf.h Mon Apr 10 19:52:38 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: buf.h,v 1.127 2017/04/05 20:15:49 jdolecek Exp $ */ +/* $NetBSD: buf.h,v 1.128 2017/04/10 19:52:38 jdolecek Exp $ */ /*- * Copyright (c) 1999, 2000, 2007, 2008 The NetBSD Foundation, Inc. @@ -153,7 +153,7 @@ struct buf { LIST_ENTRY(buf) b_hash; /* c: hash chain */ LIST_ENTRY(buf) b_vnbufs; /* c: associated vnode */ TAILQ_ENTRY(buf) b_freelist; /* c: position if not active */ - LIST_ENTRY(buf) b_wapbllist; /* c: transaction buffer list */ + TAILQ_ENTRY(buf) b_wapbllist; /* c: transaction buffer list */ daddr_t b_lblkno; /* c: logical block number */ int b_freelistindex;/* c: free list index (BQ_) */ u_int b_cflags; /* c: BC_* flags */ Index: src/sys/sys/param.h diff -u src/sys/sys/param.h:1.534 src/sys/sys/param.h:1.535 --- src/sys/sys/param.h:1.534 Thu Mar 30 09:16:53 2017 +++ src/sys/sys/param.h Mon Apr 10 19:52:38 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.534 2017/03/30 09:16:53 hannken Exp $ */ +/* $NetBSD: param.h,v 1.535 2017/04/10 19:52:38 jdolecek Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -67,7 +67,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 799006700 /* NetBSD 7.99.67 */ +#define __NetBSD_Version__ 799006800 /* NetBSD 7.99.68 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)