Date: Wed, 15 Sep 2010 15:33:51 +0000 (UTC) From: Matthew D Fleming <mdf@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r212664 - in stable/7/sys: kern sys Message-ID: <201009151533.o8FFXpQS040837@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mdf Date: Wed Sep 15 15:33:51 2010 New Revision: 212664 URL: http://svn.freebsd.org/changeset/base/212664 Log: Revert r212563, which was a MFC of r209053, as it introduced an unlocked read/modify/write of b_vflags. The unlocked access is fixed in CURRENT and stable/8 by r211213 and its MFC, r212583. Rather than MFC to stable/7, reverting the injecting code seems preferable. Modified: stable/7/sys/kern/vfs_bio.c stable/7/sys/sys/buf.h Directory Properties: stable/7/sys/ (props changed) stable/7/sys/cddl/contrib/opensolaris/ (props changed) stable/7/sys/contrib/dev/acpica/ (props changed) stable/7/sys/contrib/pf/ (props changed) Modified: stable/7/sys/kern/vfs_bio.c ============================================================================== --- stable/7/sys/kern/vfs_bio.c Wed Sep 15 15:18:41 2010 (r212663) +++ stable/7/sys/kern/vfs_bio.c Wed Sep 15 15:33:51 2010 (r212664) @@ -381,16 +381,10 @@ runningbufwakeup(struct buf *bp) */ static __inline void -bufcountwakeup(struct buf *bp) +bufcountwakeup(void) { - int old; - KASSERT((bp->b_vflags & BV_INFREECNT) == 0, - ("buf %p already counted as free", bp)); - bp->b_vflags |= BV_INFREECNT; - old = atomic_fetchadd_int(&numfreebuffers, 1); - KASSERT(old >= 0 && old < nbuf, - ("numfreebuffers climbed to %d", old + 1)); + atomic_add_int(&numfreebuffers, 1); mtx_lock(&nblock); if (needsbuffer) { needsbuffer &= ~VFS_BIO_NEED_ANY; @@ -593,7 +587,7 @@ bufinit(void) bp->b_rcred = NOCRED; bp->b_wcred = NOCRED; bp->b_qindex = QUEUE_EMPTY; - bp->b_vflags = BV_INFREECNT; /* buf is counted as free */ + bp->b_vflags = 0; bp->b_xflags = 0; LIST_INIT(&bp->b_dep); BUF_LOCKINIT(bp); @@ -694,7 +688,6 @@ bfreekva(struct buf *bp) void bremfree(struct buf *bp) { - int old; CTR3(KTR_BUF, "bremfree(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); KASSERT(BUF_REFCNT(bp), ("bremfree: buf must be locked.")); @@ -705,13 +698,8 @@ bremfree(struct buf *bp) bp->b_flags |= B_REMFREE; /* Fixup numfreebuffers count. */ - if ((bp->b_flags & B_INVAL) || (bp->b_flags & B_DELWRI) == 0) { - KASSERT((bp->b_vflags & BV_INFREECNT) != 0, - ("buf %p not counted in numfreebuffers", bp)); - bp->b_vflags &= ~BV_INFREECNT; - old = atomic_fetchadd_int(&numfreebuffers, -1); - KASSERT(old > 0, ("numfreebuffers dropped to %d", old - 1)); - } + if ((bp->b_flags & B_INVAL) || (bp->b_flags & B_DELWRI) == 0) + atomic_subtract_int(&numfreebuffers, 1); } /* @@ -737,8 +725,6 @@ bremfreef(struct buf *bp) static void bremfreel(struct buf *bp) { - int old; - CTR3(KTR_BUF, "bremfreel(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); KASSERT(BUF_REFCNT(bp), ("bremfreel: buffer %p not locked.", bp)); @@ -761,13 +747,8 @@ bremfreel(struct buf *bp) * delayed-write, the buffer was free and we must decrement * numfreebuffers. */ - if ((bp->b_flags & B_INVAL) || (bp->b_flags & B_DELWRI) == 0) { - KASSERT((bp->b_vflags & BV_INFREECNT) != 0, - ("buf %p not counted in numfreebuffers", bp)); - bp->b_vflags &= ~BV_INFREECNT; - old = atomic_fetchadd_int(&numfreebuffers, -1); - KASSERT(old > 0, ("numfreebuffers dropped to %d", old - 1)); - } + if ((bp->b_flags & B_INVAL) || (bp->b_flags & B_DELWRI) == 0) + atomic_subtract_int(&numfreebuffers, 1); } @@ -1471,7 +1452,7 @@ brelse(struct buf *bp) */ if (!(bp->b_flags & B_DELWRI)) - bufcountwakeup(bp); + bufcountwakeup(); /* * Something we can maybe free or reuse @@ -1561,7 +1542,7 @@ bqrelse(struct buf *bp) mtx_unlock(&bqlock); if ((bp->b_flags & B_INVAL) || !(bp->b_flags & B_DELWRI)) - bufcountwakeup(bp); + bufcountwakeup(); /* * Something we can maybe free or reuse. @@ -1941,8 +1922,6 @@ restart: bp->b_flags = 0; bp->b_ioflags = 0; bp->b_xflags = 0; - KASSERT((bp->b_vflags & BV_INFREECNT) == 0, - ("buf %p still counted as free?", bp)); bp->b_vflags = 0; bp->b_vp = NULL; bp->b_blkno = bp->b_lblkno = 0; @@ -4104,27 +4083,4 @@ DB_SHOW_COMMAND(vnodebufs, db_show_vnode db_printf("\n"); } } - -DB_COMMAND(countfreebufs, db_coundfreebufs) -{ - struct buf *bp; - int i, used = 0, nfree = 0; - - if (have_addr) { - db_printf("usage: countfreebufs\n"); - return; - } - - for (i = 0; i < nbuf; i++) { - bp = &buf[i]; - if ((bp->b_vflags & BV_INFREECNT) != 0) - nfree++; - else - used++; - } - - db_printf("Counted %d free, %d used (%d tot)\n", nfree, used, - nfree + used); - db_printf("numfreebuffers is %d\n", numfreebuffers); -} #endif /* DDB */ Modified: stable/7/sys/sys/buf.h ============================================================================== --- stable/7/sys/sys/buf.h Wed Sep 15 15:18:41 2010 (r212663) +++ stable/7/sys/sys/buf.h Wed Sep 15 15:33:51 2010 (r212664) @@ -247,7 +247,6 @@ struct buf { #define BV_SCANNED 0x00000001 /* VOP_FSYNC funcs mark written bufs */ #define BV_BKGRDINPROG 0x00000002 /* Background write in progress */ #define BV_BKGRDWAIT 0x00000004 /* Background write waiting */ -#define BV_INFREECNT 0x80000000 /* buf is counted in numfreebufs */ #ifdef _KERNEL /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009151533.o8FFXpQS040837>