summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_physio.c9
-rw-r--r--sys/kern/vfs_bio.c38
-rw-r--r--sys/kern/vfs_subr.c6
-rw-r--r--sys/kern/vfs_wapbl.c6
4 files changed, 59 insertions, 0 deletions
diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c
index 9547e5ddea1..690e80d9fad 100644
--- a/sys/kern/kern_physio.c
+++ b/sys/kern/kern_physio.c
@@ -284,6 +284,9 @@ physio(void (*strategy)(struct buf *), struct buf *obp, dev_t dev, int flags,
} else {
bp = getiobuf(NULL, true);
bp->b_cflags |= BC_BUSY;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
}
bp->b_dev = dev;
bp->b_proc = p;
@@ -297,6 +300,9 @@ physio(void (*strategy)(struct buf *), struct buf *obp, dev_t dev, int flags,
*/
bp->b_oflags = 0;
bp->b_cflags |= BC_BUSY;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
bp->b_flags = flags | B_PHYS | B_RAW;
bp->b_iodone = physio_biodone;
@@ -430,6 +436,9 @@ done_locked:
*/
mutex_enter(&bufcache_lock);
obp->b_cflags &= ~(BC_BUSY | BC_WANTED);
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(V_WRITE, &(obp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
obp->b_flags &= ~(B_PHYS | B_RAW);
obp->b_iodone = NULL;
cv_broadcast(&obp->b_busy);
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 21e36bafcdc..eaa6592de1c 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -154,6 +154,10 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.303 2022/03/30 14:54:29 riastradh Exp
#include <miscfs/specfs/specdev.h>
+#ifdef LOCKDOC_VFS
+#include <sys/lockdoc.h>
+#endif
+
SDT_PROVIDER_DEFINE(io);
SDT_PROBE_DEFINE4(io, kernel, , bbusy__start,
@@ -468,6 +472,12 @@ bufinit(void)
mutex_init(&bufcache_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&buffer_lock, MUTEX_DEFAULT, IPL_NONE);
+
+#ifdef LOCKDOC_VFS
+ lockdoc_log_memory(1, "kmutex_t", &bufcache_lock, sizeof(kmutex_t));
+ lockdoc_log_memory(1, "kmutex_t", &buffer_lock, sizeof(kmutex_t));
+#endif
+
cv_init(&needbuffer_cv, "needbuf");
if (bufmem_valimit != 0) {
@@ -1136,6 +1146,9 @@ brelsel(buf_t *bp, int set)
already_queued:
/* Unlock the buffer. */
CLR(bp->b_cflags, BC_AGE|BC_BUSY|BC_NOCACHE);
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
CLR(bp->b_flags, B_ASYNC);
/*
@@ -1399,6 +1412,9 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq)
memset((char *)bp, 0, sizeof(*bp));
buf_init(bp);
SET(bp->b_cflags, BC_BUSY); /* mark buffer busy */
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
mutex_enter(&bufcache_lock);
#if defined(DIAGNOSTIC)
bp->b_freelistindex = -1;
@@ -1430,6 +1446,9 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq)
/* Buffer is no longer on free lists. */
SET(bp->b_cflags, BC_BUSY);
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
/* Wake anyone trying to lock the old identity. */
cv_broadcast(&bp->b_busy);
@@ -1494,6 +1513,9 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq)
/* clear out various other fields */
bp->b_cflags = BC_BUSY;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
bp->b_oflags = 0;
bp->b_flags = 0;
bp->b_dev = NODEV;
@@ -2106,6 +2128,9 @@ nestiobuf_setup(buf_t *mbp, buf_t *bp, int offset, size_t size)
bp->b_dev = mbp->b_dev;
bp->b_objlock = mbp->b_objlock;
bp->b_cflags = BC_BUSY;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
bp->b_flags = B_ASYNC | b_pass;
bp->b_iodone = nestiobuf_iodone;
bp->b_data = (char *)mbp->b_data + offset;
@@ -2164,6 +2189,10 @@ buf_init(buf_t *bp)
bp->b_dev = NODEV;
bp->b_vnbufs.le_next = NOLIST;
BIO_SETPRIO(bp, BPRIO_DEFAULT);
+
+#ifdef LOCKDOC_VFS
+ lockdoc_log_memory(1, "buf", bp, sizeof(buf_t));
+#endif
}
void
@@ -2172,6 +2201,12 @@ buf_destroy(buf_t *bp)
cv_destroy(&bp->b_done);
cv_destroy(&bp->b_busy);
+
+#ifdef LOCKDOC_VFS
+ if ((bp->b_cflags & BC_BUSY) != 0)
+ lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+ lockdoc_log_memory(0, "buf", bp, sizeof(buf_t));
+#endif
}
int
@@ -2208,6 +2243,9 @@ bbusy(buf_t *bp, bool intr, int timo, kmutex_t *interlock)
error = EPASSTHROUGH;
} else {
bp->b_cflags |= BC_BUSY;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
error = 0;
}
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 69d65335979..936a5c9670e 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -253,6 +253,9 @@ restart:
printf("buffer still DELWRI\n");
#endif
bp->b_cflags |= BC_BUSY | BC_VFLUSH;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
mutex_exit(&bufcache_lock);
VOP_BWRITE(bp->b_vp, bp);
mutex_enter(&bufcache_lock);
@@ -355,6 +358,9 @@ loop:
if ((bp->b_oflags & BO_DELWRI) == 0)
panic("vflushbuf: not dirty, bp %p", bp);
bp->b_cflags |= BC_BUSY | BC_VFLUSH;
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
mutex_exit(&bufcache_lock);
/*
* Wait for I/O associated with indirect blocks to complete,
diff --git a/sys/kern/vfs_wapbl.c b/sys/kern/vfs_wapbl.c
index 80e80b365eb..87fd9bec89f 100644
--- a/sys/kern/vfs_wapbl.c
+++ b/sys/kern/vfs_wapbl.c
@@ -919,6 +919,9 @@ wapbl_doio(void *data, size_t len, struct vnode *devvp, daddr_t pbn, int flags)
bp = getiobuf(devvp, true);
bp->b_flags = flags;
bp->b_cflags |= BC_BUSY; /* mandatory, asserted by biowait() */
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
bp->b_dev = devvp->v_rdev;
bp->b_data = data;
bp->b_bufsize = bp->b_resid = bp->b_bcount = len;
@@ -994,6 +997,9 @@ wapbl_buffered_write_async(struct wapbl *wl, struct buf *bp)
bp->b_flags |= B_WRITE;
bp->b_cflags |= BC_BUSY; /* mandatory, asserted by biowait() */
+#ifdef LOCKDOC_VFS
+ lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0);
+#endif
bp->b_oflags = 0;
bp->b_bcount = bp->b_resid;
BIO_SETPRIO(bp, BPRIO_TIMECRITICAL);