Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Aug 2020 16:34:27 +0000 (UTC)
From:      Conrad Meyer <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r363770 - head/sys/kern
Message-ID:  <202008021634.072GYR5B002922@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Sun Aug  2 16:34:27 2020
New Revision: 363770
URL: https://svnweb.freebsd.org/changeset/base/363770

Log:
  Unlocked getblk: Fix new false-positive assertion
  
  A free buf's lock may be held (temporarily) due to unlocked lookup, so
  buf_alloc() must acquire it without LK_NOWAIT.  The unlocked getblk path
  should unlock it promptly once it realizes the identity does not match
  the buffer it was searching for.
  
  Reported by:	gallatin
  Reviewed by:	kib
  Tested by:	pho
  X-MFC-With:	r363482
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D25914

Modified:
  head/sys/kern/vfs_bio.c

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c	Sun Aug  2 04:25:36 2020	(r363769)
+++ head/sys/kern/vfs_bio.c	Sun Aug  2 16:34:27 2020	(r363770)
@@ -1637,7 +1637,7 @@ static struct buf *
 buf_alloc(struct bufdomain *bd)
 {
 	struct buf *bp;
-	int freebufs;
+	int freebufs, error;
 
 	/*
 	 * We can only run out of bufs in the buf zone if the average buf
@@ -1660,8 +1660,10 @@ buf_alloc(struct bufdomain *bd)
 	if (freebufs == bd->bd_lofreebuffers)
 		bufspace_daemon_wakeup(bd);
 
-	if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL) != 0)
-		panic("getnewbuf_empty: Locked buf %p on free queue.", bp);
+	error = BUF_LOCK(bp, LK_EXCLUSIVE, NULL);
+	KASSERT(error == 0, ("%s: BUF_LOCK on free buf %p: %d.", __func__, bp,
+	    error));
+	(void)error;
 
 	KASSERT(bp->b_vp == NULL,
 	    ("bp: %p still has vnode %p.", bp, bp->b_vp));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202008021634.072GYR5B002922>