buf_alloc(): Stop using LK_NOWAIT, use LK_NOWITNESS

Despite the buffer taken from cache or free list, it still can be
locked, due to 'lockless lookup' in getblkx() potentially operating on
the freed buffers.  The lock is transient, but prevents the use of
LK_NOWAIT there for the goal of neutralizing WITNESS.

Just use LK_NOWITNESS.

Reported and tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	3 days
This commit is contained in:
Konstantin Belousov 2022-02-16 17:30:17 +02:00 committed by Mark Johnston
parent 822d379b1f
commit 1fb00c8f10

View file

@ -1722,7 +1722,7 @@ buf_alloc(struct bufdomain *bd)
if (freebufs == bd->bd_lofreebuffers)
bufspace_daemon_wakeup(bd);
error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL);
error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWITNESS, NULL);
KASSERT(error == 0, ("%s: BUF_LOCK on free buf %p: %d.", __func__, bp,
error));
(void)error;