Module Name: src Committed By: riastradh Date: Sat Apr 29 10:07:30 UTC 2023
Modified Files: src/sys/kern: vfs_subr.c Log Message: vfs: Sprinkle dtrace probes into syncer. To generate a diff of this commit: cvs rdiff -u -r1.497 -r1.498 src/sys/kern/vfs_subr.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_subr.c diff -u src/sys/kern/vfs_subr.c:1.497 src/sys/kern/vfs_subr.c:1.498 --- src/sys/kern/vfs_subr.c:1.497 Sat Apr 29 10:06:33 2023 +++ src/sys/kern/vfs_subr.c Sat Apr 29 10:07:30 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_subr.c,v 1.497 2023/04/29 10:06:33 riastradh Exp $ */ +/* $NetBSD: vfs_subr.c,v 1.498 2023/04/29 10:07:30 riastradh Exp $ */ /*- * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008, 2019, 2020 @@ -69,7 +69,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.497 2023/04/29 10:06:33 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.498 2023/04/29 10:07:30 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_43.h" @@ -104,6 +104,54 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v #include <uvm/uvm_ddb.h> +SDT_PROBE_DEFINE3(vfs, syncer, worklist, vnode__add, + "struct vnode *"/*vp*/, + "int"/*delayx*/, + "int"/*slot*/); +SDT_PROBE_DEFINE4(vfs, syncer, worklist, vnode__update, + "struct vnode *"/*vp*/, + "int"/*delayx*/, + "int"/*oslot*/, + "int"/*nslot*/); +SDT_PROBE_DEFINE1(vfs, syncer, worklist, vnode__remove, + "struct vnode *"/*vp*/); + +SDT_PROBE_DEFINE3(vfs, syncer, worklist, mount__add, + "struct mount *"/*mp*/, + "int"/*vdelay*/, + "int"/*slot*/); +SDT_PROBE_DEFINE4(vfs, syncer, worklist, mount__update, + "struct mount *"/*vp*/, + "int"/*vdelay*/, + "int"/*oslot*/, + "int"/*nslot*/); +SDT_PROBE_DEFINE1(vfs, syncer, worklist, mount__remove, + "struct mount *"/*mp*/); + +SDT_PROBE_DEFINE1(vfs, syncer, sync, start, + "int"/*starttime*/); +SDT_PROBE_DEFINE1(vfs, syncer, sync, mount__start, + "struct mount *"/*mp*/); +SDT_PROBE_DEFINE2(vfs, syncer, sync, mount__done, + "struct mount *"/*mp*/, + "int"/*error*/); +SDT_PROBE_DEFINE1(vfs, syncer, sync, mount__skip, + "struct mount *"/*mp*/); +SDT_PROBE_DEFINE1(vfs, syncer, sync, vnode__start, + "struct vnode *"/*vp*/); +SDT_PROBE_DEFINE2(vfs, syncer, sync, vnode__done, + "struct vnode *"/*vp*/, + "int"/*error*/); +SDT_PROBE_DEFINE2(vfs, syncer, sync, vnode__fail__lock, + "struct vnode *"/*vp*/, + "int"/*error*/); +SDT_PROBE_DEFINE2(vfs, syncer, sync, vnode__fail__vget, + "struct vnode *"/*vp*/, + "int"/*error*/); +SDT_PROBE_DEFINE2(vfs, syncer, sync, done, + "int"/*starttime*/, + "int"/*endtime*/); + const enum vtype iftovt_tab[16] = { VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON, VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VBAD, @@ -666,11 +714,14 @@ vn_syncer_add1(struct vnode *vp, int del void vn_syncer_add_to_worklist(struct vnode *vp, int delayx) { + vnode_impl_t *vip = VNODE_TO_VIMPL(vp); KASSERT(mutex_owned(vp->v_interlock)); mutex_enter(&syncer_data_lock); vn_syncer_add1(vp, delayx); + SDT_PROBE3(vfs, syncer, worklist, vnode__add, + vp, delayx, vip->vi_synclist_slot); mutex_exit(&syncer_data_lock); } @@ -687,6 +738,7 @@ vn_syncer_remove_from_worklist(struct vn if (vp->v_iflag & VI_ONWORKLST) { mutex_enter(&syncer_data_lock); + SDT_PROBE1(vfs, syncer, worklist, vnode__remove, vp); vp->v_iflag &= ~VI_ONWORKLST; slp = &syncer_workitem_pending[vip->vi_synclist_slot]; TAILQ_REMOVE(slp, vip, vi_synclist); @@ -725,6 +777,8 @@ vfs_syncer_add_to_worklist(struct mount mp->mnt_iflag |= IMNT_ONWORKLIST; vdelay = sync_delay(mp); mp->mnt_synclist_slot = vdelay > 0 ? next % vdelay : 0; + SDT_PROBE3(vfs, syncer, worklist, mount__add, + mp, vdelay, mp->mnt_synclist_slot); } /* @@ -737,6 +791,7 @@ vfs_syncer_remove_from_worklist(struct m KASSERT(mutex_owned(mp->mnt_updating)); KASSERT((mp->mnt_iflag & IMNT_ONWORKLIST) != 0); + SDT_PROBE1(vfs, syncer, worklist, mount__remove, mp); mp->mnt_iflag &= ~IMNT_ONWORKLIST; } @@ -747,20 +802,28 @@ static bool lazy_sync_vnode(struct vnode *vp) { bool synced; + int error; KASSERT(mutex_owned(&syncer_data_lock)); synced = false; - if (vcache_tryvget(vp) == 0) { + if ((error = vcache_tryvget(vp)) == 0) { mutex_exit(&syncer_data_lock); - if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT) == 0) { + if ((error = vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT)) == 0) { synced = true; - (void) VOP_FSYNC(vp, curlwp->l_cred, + SDT_PROBE1(vfs, syncer, sync, vnode__start, vp); + error = VOP_FSYNC(vp, curlwp->l_cred, FSYNC_LAZY, 0, 0); + SDT_PROBE2(vfs, syncer, sync, vnode__done, vp, error); vput(vp); - } else + } else { + SDT_PROBE2(vfs, syncer, sync, vnode__fail__lock, + vp, error); vrele(vp); + } mutex_enter(&syncer_data_lock); + } else { + SDT_PROBE2(vfs, syncer, sync, vnode__fail__vget, vp, error); } return synced; } @@ -776,11 +839,14 @@ sched_sync(void *arg) struct vnode_impl *vi; struct vnode *vp; struct mount *mp; - time_t starttime; + time_t starttime, endtime; + int vdelay, oslot, nslot, delayx; bool synced; + int error; for (;;) { starttime = time_second; + SDT_PROBE1(vfs, syncer, sync, start, starttime); /* * Sync mounts whose dirty time has expired. @@ -789,10 +855,22 @@ sched_sync(void *arg) while ((mp = mountlist_iterator_trynext(iter)) != NULL) { if ((mp->mnt_iflag & IMNT_ONWORKLIST) == 0 || mp->mnt_synclist_slot != syncer_delayno) { + SDT_PROBE1(vfs, syncer, sync, mount__skip, + mp); continue; } - mp->mnt_synclist_slot = sync_delay_slot(sync_delay(mp)); - VFS_SYNC(mp, MNT_LAZY, curlwp->l_cred); + + vdelay = sync_delay(mp); + oslot = mp->mnt_synclist_slot; + nslot = sync_delay_slot(vdelay); + mp->mnt_synclist_slot = nslot; + SDT_PROBE4(vfs, syncer, worklist, mount__update, + mp, vdelay, oslot, nslot); + + SDT_PROBE1(vfs, syncer, sync, mount__start, mp); + error = VFS_SYNC(mp, MNT_LAZY, curlwp->l_cred); + SDT_PROBE2(vfs, syncer, sync, mount__done, + mp, error); } mountlist_iterator_destroy(iter); @@ -839,11 +917,20 @@ sched_sync(void *arg) * occur no later than syncdelay seconds * into the future. */ - vn_syncer_add1(vp, - synced ? syncdelay : lockdelay); + delayx = synced ? syncdelay : lockdelay; + oslot = vi->vi_synclist_slot; + vn_syncer_add1(vp, delayx); + nslot = vi->vi_synclist_slot; + SDT_PROBE4(vfs, syncer, worklist, + vnode__update, + vp, delayx, oslot, nslot); } } + endtime = time_second; + + SDT_PROBE2(vfs, syncer, sync, done, starttime, endtime); + /* * If it has taken us less than a second to process the * current work, then wait. Otherwise start right over @@ -852,7 +939,7 @@ sched_sync(void *arg) * matter as we are just trying to generally pace the * filesystem activity. */ - if (time_second == starttime) { + if (endtime == starttime) { kpause("syncer", false, hz, &syncer_data_lock); } mutex_exit(&syncer_data_lock);