Module Name: src Committed By: riastradh Date: Thu Feb 20 15:48:38 UTC 2020
Modified Files: src/sys/kern: vfs_bio.c Log Message: Buffer cache SDT probes. To generate a diff of this commit: cvs rdiff -u -r1.287 -r1.288 src/sys/kern/vfs_bio.c 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_bio.c diff -u src/sys/kern/vfs_bio.c:1.287 src/sys/kern/vfs_bio.c:1.288 --- src/sys/kern/vfs_bio.c:1.287 Fri Jan 17 19:33:14 2020 +++ src/sys/kern/vfs_bio.c Thu Feb 20 15:48:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_bio.c,v 1.287 2020/01/17 19:33:14 ad Exp $ */ +/* $NetBSD: vfs_bio.c,v 1.288 2020/02/20 15:48:38 riastradh Exp $ */ /*- * Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc. @@ -123,7 +123,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.287 2020/01/17 19:33:14 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.288 2020/02/20 15:48:38 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_bufcache.h" @@ -154,6 +154,28 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v #include <miscfs/specfs/specdev.h> +SDT_PROVIDER_DEFINE(io); + +SDT_PROBE_DEFINE4(io, kernel, , bbusy__start, + "struct buf *"/*bp*/, + "bool"/*intr*/, "int"/*timo*/, "kmutex_t *"/*interlock*/); +SDT_PROBE_DEFINE5(io, kernel, , bbusy__done, + "struct buf *"/*bp*/, + "bool"/*intr*/, + "int"/*timo*/, + "kmutex_t *"/*interlock*/, + "int"/*error*/); +SDT_PROBE_DEFINE0(io, kernel, , getnewbuf__start); +SDT_PROBE_DEFINE1(io, kernel, , getnewbuf__done, "struct buf *"/*bp*/); +SDT_PROBE_DEFINE3(io, kernel, , getblk__start, + "struct vnode *"/*vp*/, "daddr_t"/*blkno*/, "int"/*size*/); +SDT_PROBE_DEFINE4(io, kernel, , getblk__done, + "struct vnode *"/*vp*/, "daddr_t"/*blkno*/, "int"/*size*/, + "struct buf *"/*bp*/); +SDT_PROBE_DEFINE2(io, kernel, , brelse, "struct buf *"/*bp*/, "int"/*set*/); +SDT_PROBE_DEFINE1(io, kernel, , wait__start, "struct buf *"/*bp*/); +SDT_PROBE_DEFINE1(io, kernel, , wait__done, "struct buf *"/*bp*/); + #ifndef BUFPAGES # define BUFPAGES 0 #endif @@ -1027,6 +1049,8 @@ brelsel(buf_t *bp, int set) struct bqueue *bufq; struct vnode *vp; + SDT_PROBE2(io, kernel, , brelse, bp, set); + KASSERT(bp != NULL); KASSERT(mutex_owned(&bufcache_lock)); KASSERT(!cv_has_waiters(&bp->b_done)); @@ -1211,6 +1235,7 @@ getblk(struct vnode *vp, daddr_t blkno, buf_t *bp; mutex_enter(&bufcache_lock); + SDT_PROBE3(io, kernel, , getblk__start, vp, blkno, size); loop: bp = incore(vp, blkno); if (bp != NULL) { @@ -1219,6 +1244,8 @@ getblk(struct vnode *vp, daddr_t blkno, if (err == EPASSTHROUGH) goto loop; mutex_exit(&bufcache_lock); + SDT_PROBE4(io, kernel, , getblk__done, + vp, blkno, size, NULL); return (NULL); } KASSERT(!cv_has_waiters(&bp->b_done)); @@ -1260,10 +1287,13 @@ getblk(struct vnode *vp, daddr_t blkno, LIST_REMOVE(bp, b_hash); brelsel(bp, BC_INVAL); mutex_exit(&bufcache_lock); + SDT_PROBE4(io, kernel, , getblk__done, + vp, blkno, size, NULL); return NULL; } } BIO_SETPRIO(bp, BPRIO_DEFAULT); + SDT_PROBE4(io, kernel, , getblk__done, vp, blkno, size, bp); return (bp); } @@ -1382,6 +1412,8 @@ getnewbuf(int slpflag, int slptimeo, int struct vnode *vp; struct mount *transmp = NULL; + SDT_PROBE0(io, kernel, , getnewbuf__start); + start: KASSERT(mutex_owned(&bufcache_lock)); @@ -1399,6 +1431,7 @@ getnewbuf(int slpflag, int slptimeo, int #if defined(DIAGNOSTIC) bp->b_freelistindex = -1; #endif /* defined(DIAGNOSTIC) */ + SDT_PROBE1(io, kernel, , getnewbuf__done, bp); return (bp); } mutex_enter(&bufcache_lock); @@ -1441,6 +1474,7 @@ getnewbuf(int slpflag, int slptimeo, int (void)cv_timedwait(&needbuffer_cv, &bufcache_lock, slptimeo); } + SDT_PROBE1(io, kernel, , getnewbuf__done, NULL); return (NULL); } @@ -1479,6 +1513,7 @@ getnewbuf(int slpflag, int slptimeo, int KASSERT(transmp != NULL); fstrans_done(transmp); mutex_enter(&bufcache_lock); + SDT_PROBE1(io, kernel, , getnewbuf__done, NULL); return (NULL); } @@ -1508,6 +1543,7 @@ getnewbuf(int slpflag, int slptimeo, int mutex_exit(vp->v_interlock); } + SDT_PROBE1(io, kernel, , getnewbuf__done, bp); return (bp); } @@ -1557,11 +1593,6 @@ buf_drain(int n) return size; } -SDT_PROVIDER_DEFINE(io); - -SDT_PROBE_DEFINE1(io, kernel, , wait__start, "struct buf *"/*bp*/); -SDT_PROBE_DEFINE1(io, kernel, , wait__done, "struct buf *"/*bp*/); - /* * Wait for operations on the buffer to complete. * When they do, extract and return the I/O's error value. @@ -2163,9 +2194,13 @@ bbusy(buf_t *bp, bool intr, int timo, km KASSERT(mutex_owned(&bufcache_lock)); + SDT_PROBE4(io, kernel, , bbusy__start, bp, intr, timo, interlock); + if ((bp->b_cflags & BC_BUSY) != 0) { - if (curlwp == uvm.pagedaemon_lwp) - return EDEADLK; + if (curlwp == uvm.pagedaemon_lwp) { + error = EDEADLK; + goto out; + } bp->b_cflags |= BC_WANTED; bref(bp); if (interlock != NULL) @@ -2181,11 +2216,15 @@ bbusy(buf_t *bp, bool intr, int timo, km if (interlock != NULL) mutex_enter(interlock); if (error != 0) - return error; - return EPASSTHROUGH; + goto out; + error = EPASSTHROUGH; + goto out; } bp->b_cflags |= BC_BUSY; + error = 0; +out: SDT_PROBE5(io, kernel, , bbusy__done, + bp, intr, timo, interlock, error); return 0; }