Module Name: src
Committed By: pgoyette
Date: Mon Dec 26 23:12:34 UTC 2016
Modified Files:
src/share/man/man4: ddb.4 options.4
src/sys/conf: files
src/sys/kern: init_main.c kern_history.c vfs_bio.c
src/sys/sys: buf.h kernhist.h
Added Files:
src/sys/sys: biohist.h
Log Message:
Add a BIOHIST option. As mentioned on tech-kern.
To generate a diff of this commit:
cvs rdiff -u -r1.161 -r1.162 src/share/man/man4/ddb.4
cvs rdiff -u -r1.457 -r1.458 src/share/man/man4/options.4
cvs rdiff -u -r1.1167 -r1.1168 src/sys/conf/files
cvs rdiff -u -r1.487 -r1.488 src/sys/kern/init_main.c
cvs rdiff -u -r1.6 -r1.7 src/sys/kern/kern_history.c
cvs rdiff -u -r1.263 -r1.264 src/sys/kern/vfs_bio.c
cvs rdiff -u -r0 -r1.1 src/sys/sys/biohist.h
cvs rdiff -u -r1.125 -r1.126 src/sys/sys/buf.h
cvs rdiff -u -r1.12 -r1.13 src/sys/sys/kernhist.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man4/ddb.4
diff -u src/share/man/man4/ddb.4:1.161 src/share/man/man4/ddb.4:1.162
--- src/share/man/man4/ddb.4:1.161 Wed Apr 13 00:47:01 2016
+++ src/share/man/man4/ddb.4 Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-.\" $NetBSD: ddb.4,v 1.161 2016/04/13 00:47:01 ozaki-r Exp $
+.\" $NetBSD: ddb.4,v 1.162 2016/12/26 23:12:33 pgoyette Exp $
.\"
.\" Copyright (c) 1997 - 2009 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -749,6 +749,8 @@ This command is available only if a kern
or
.Cd options USB_DEBUG
(or related options) or
+.Cd options BIOHIST
+or
.Cd options UVMHIST .
.It Ic show vnode Ns Oo Cm /f Oc Ar address
Print the vnode at
Index: src/share/man/man4/options.4
diff -u src/share/man/man4/options.4:1.457 src/share/man/man4/options.4:1.458
--- src/share/man/man4/options.4:1.457 Tue Dec 13 11:00:20 2016
+++ src/share/man/man4/options.4 Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-.\" $NetBSD: options.4,v 1.457 2016/12/13 11:00:20 wiz Exp $
+.\" $NetBSD: options.4,v 1.458 2016/12/26 23:12:33 pgoyette Exp $
.\"
.\" Copyright (c) 1996
.\" Perry E. Metzger. All rights reserved.
@@ -711,6 +711,32 @@ The default is 100.
This option depends upon the
.Em UVMHIST
option.
+.It Cd options BIOHIST
+Like
+.Em KERNHIST ,
+it enables the BIO history logs.
+These logs can be displayed by using
+.Cm show kernhist
+from DDB.
+See the kernel source file
+.Pa sys/kern/vfs_vio.c
+for details.
+.It Cd options BIOHIST_PRINT
+Like
+.Em BIOHIST ,
+it prints the BIO history logs on the system console as entries are added.
+Note that the output is
+.Em extremely
+voluminous, so this option is really only useful for debugging
+the very earliest parts of kernel initialization.
+.It Cd options BIOHIST_SIZE
+Set the size of the
+.Dq biohist
+kernel history.
+The default is 500.
+This option depends upon the
+.Em BIOHIST
+option.
.El
.Ss File Systems
.Bl -ohang
Index: src/sys/conf/files
diff -u src/sys/conf/files:1.1167 src/sys/conf/files:1.1168
--- src/sys/conf/files:1.1167 Tue Dec 13 20:20:34 2016
+++ src/sys/conf/files Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-# $NetBSD: files,v 1.1167 2016/12/13 20:20:34 christos Exp $
+# $NetBSD: files,v 1.1168 2016/12/26 23:12:33 pgoyette Exp $
# @(#)files.newconf 7.5 (Berkeley) 5/10/93
version 20150846
@@ -39,6 +39,7 @@ defflag opt_pipe.h PIPE_SOCKETPAIR PIPE
defflag AIO
defflag MQUEUE
+defflag SEMAPHORE
defflag BUFQ_DISKSORT
defflag BUFQ_FCFS
@@ -201,6 +202,13 @@ defflag opt_usb.h USB_DEBUG: KERNHIST
defparam opt_usb.h USBHIST_SIZE
#
+# Options for BIOHIST
+#
+defflag opt_biohist.h BIOHIST: KERNHIST
+defflag opt_biohist.h BIOHIST_PRINT: KERNHIST_PRINT
+defparam opt_biohist.h BIOHIST_SIZE
+
+#
# System monitoring framework
#
include "dev/sysmon/files.sysmon"
@@ -1507,6 +1515,7 @@ include "miscfs/procfs/files.procfs"
include "miscfs/umapfs/files.umapfs"
include "nfs/files.nfs"
include "ufs/files.ufs"
+include "fs/nfs/files.newnfs"
#
# UVM (virtual memory)
Index: src/sys/kern/init_main.c
diff -u src/sys/kern/init_main.c:1.487 src/sys/kern/init_main.c:1.488
--- src/sys/kern/init_main.c:1.487 Wed Nov 16 12:31:33 2016
+++ src/sys/kern/init_main.c Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: init_main.c,v 1.487 2016/11/16 12:31:33 pgoyette Exp $ */
+/* $NetBSD: init_main.c,v 1.488 2016/12/26 23:12:33 pgoyette Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.487 2016/11/16 12:31:33 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.488 2016/12/26 23:12:33 pgoyette Exp $");
#include "opt_ddb.h"
#include "opt_inet.h"
@@ -349,6 +349,7 @@ main(void)
/* Initialize the buffer cache */
bufinit();
+ biohist_init();
#if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_IMAGE)
Index: src/sys/kern/kern_history.c
diff -u src/sys/kern/kern_history.c:1.6 src/sys/kern/kern_history.c:1.7
--- src/sys/kern/kern_history.c:1.6 Thu Jun 23 07:32:12 2016
+++ src/sys/kern/kern_history.c Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_history.c,v 1.6 2016/06/23 07:32:12 skrll Exp $ */
+/* $NetBSD: kern_history.c,v 1.7 2016/12/26 23:12:33 pgoyette Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -33,13 +33,14 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_history.c,v 1.6 2016/06/23 07:32:12 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_history.c,v 1.7 2016/12/26 23:12:33 pgoyette Exp $");
#include "opt_ddb.h"
#include "opt_kernhist.h"
#include "opt_syscall_debug.h"
#include "opt_usb.h"
#include "opt_uvmhist.h"
+#include "opt_biohist.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -54,6 +55,10 @@ __KERNEL_RCSID(0, "$NetBSD: kern_history
#include <dev/usb/usbhist.h>
#endif
+#ifdef BIOHIST
+#include <kern/biohist.h>
+#endif
+
#ifdef SYSCALL_DEBUG
KERNHIST_DECL(scdebughist);
#endif
@@ -200,6 +205,11 @@ kernhist_dumpmask(u_int32_t bitmask) /*
hists[i++] = &scdebughist;
#endif
+#ifdef BIOHIST
+ if ((bitmask & KERNHIST_BIOHIST) || bitmask == 0)
+ hists[i++] = &biohist;
+#endif
+
hists[i] = NULL;
kernhist_dump_histories(hists, printf);
@@ -234,6 +244,9 @@ kernhist_print(void *addr, void (*pr)(co
#ifdef SYSCALL_DEBUG
hists[i++] = &scdebughist;
#endif
+#ifdef BIOHIST
+ hists[i++] = &biohist;
+#endif
hists[i] = NULL;
kernhist_dump_histories(hists, pr);
Index: src/sys/kern/vfs_bio.c
diff -u src/sys/kern/vfs_bio.c:1.263 src/sys/kern/vfs_bio.c:1.264
--- src/sys/kern/vfs_bio.c:1.263 Sun Dec 18 05:43:20 2016
+++ src/sys/kern/vfs_bio.c Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_bio.c,v 1.263 2016/12/18 05:43:20 dholland Exp $ */
+/* $NetBSD: vfs_bio.c,v 1.264 2016/12/26 23:12:33 pgoyette Exp $ */
/*-
* Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -123,11 +123,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.263 2016/12/18 05:43:20 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.264 2016/12/26 23:12:33 pgoyette Exp $");
#ifdef _KERNEL_OPT
#include "opt_bufcache.h"
#include "opt_dtrace.h"
+#include "opt_biohist.h"
#endif
#include <sys/param.h>
@@ -196,6 +197,21 @@ static void brele(buf_t *);
static void sysctl_kern_buf_setup(void);
static void sysctl_vm_buf_setup(void);
+/* Initialization for biohist */
+
+#ifdef BIOHIST
+#include <sys/biohist.h>
+#endif /* BIOHIST */
+
+KERNHIST_DEFINE(biohist);
+
+void
+biohist_init(void)
+{
+
+ KERNHIST_INIT(biohist, BIOHIST_SIZE);
+}
+
/*
* Definitions for the buffer hash lists.
*/
@@ -726,6 +742,8 @@ bread(struct vnode *vp, daddr_t blkno, i
buf_t *bp;
int error;
+ KERNHIST_FUNC(__func__); KERNHIST_CALLED(biohist);
+
/* Get buffer for block. */
bp = *bpp = bio_doread(vp, blkno, size, 0);
if (bp == NULL)
@@ -754,6 +772,8 @@ breadn(struct vnode *vp, daddr_t blkno,
buf_t *bp;
int error, i;
+ KERNHIST_FUNC(__func__); KERNHIST_CALLED(biohist);
+
bp = *bpp = bio_doread(vp, blkno, size, 0);
if (bp == NULL)
return ENOMEM;
@@ -796,6 +816,9 @@ bwrite(buf_t *bp)
struct vnode *vp;
struct mount *mp;
+ KERNHIST_FUNC(__func__); KERNHIST_CALLARGS(biohist, "bp=%p",
+ bp, 0, 0, 0);
+
KASSERT(ISSET(bp->b_cflags, BC_BUSY));
KASSERT(!cv_has_waiters(&bp->b_done));
@@ -918,6 +941,9 @@ void
bdwrite(buf_t *bp)
{
+ KERNHIST_FUNC(__func__); KERNHIST_CALLARGS(biohist, "bp=%p",
+ bp, 0, 0, 0);
+
KASSERT(bp->b_vp == NULL || bp->b_vp->v_tag != VT_UFS ||
bp->b_vp->v_type == VBLK || ISSET(bp->b_flags, B_COWDONE));
KASSERT(ISSET(bp->b_cflags, BC_BUSY));
@@ -1497,18 +1523,28 @@ int
biowait(buf_t *bp)
{
+ KERNHIST_FUNC(__func__);
+
KASSERT(ISSET(bp->b_cflags, BC_BUSY));
KASSERT(bp->b_refcnt > 0);
SDT_PROBE1(io, kernel, , wait__start, bp);
mutex_enter(bp->b_objlock);
- while (!ISSET(bp->b_oflags, BO_DONE | BO_DELWRI))
+
+ KERNHIST_CALLARGS(biohist, "bp=%p, oflags=0x%x",
+ bp, bp->b_oflags, 0, 0);
+
+ while (!ISSET(bp->b_oflags, BO_DONE | BO_DELWRI)) {
+ KERNHIST_LOG(biohist, "waiting bp=%p", bp, 0, 0, 0);
cv_wait(&bp->b_done, bp->b_objlock);
+ }
mutex_exit(bp->b_objlock);
SDT_PROBE1(io, kernel, , wait__done, bp);
+ KERNHIST_LOG(biohist, " return %d", bp->b_error, 0, 0, 0);
+
return bp->b_error;
}
@@ -1533,12 +1569,17 @@ biodone(buf_t *bp)
{
int s;
+ KERNHIST_FUNC(__func__);
+
KASSERT(!ISSET(bp->b_oflags, BO_DONE));
if (cpu_intr_p()) {
/* From interrupt mode: defer to a soft interrupt. */
s = splvm();
TAILQ_INSERT_TAIL(&curcpu()->ci_data.cpu_biodone, bp, b_actq);
+
+ KERNHIST_CALLARGS(biohist, "bp=%p, softint scheduled",
+ bp, 0, 0, 0);
softint_schedule(biodone_sih);
splx(s);
} else {
@@ -1556,6 +1597,9 @@ biodone2(buf_t *bp)
SDT_PROBE1(io, kernel, ,done, bp);
+ KERNHIST_FUNC(__func__);
+ KERNHIST_CALLARGS(biohist, "bp=%p", bp, 0, 0, 0);
+
mutex_enter(bp->b_objlock);
/* Note that the transfer is done. */
if (ISSET(bp->b_oflags, BO_DONE))
@@ -1569,6 +1613,8 @@ biodone2(buf_t *bp)
vwakeup(bp);
if ((callout = bp->b_iodone) != NULL) {
+ KERNHIST_LOG(biohist, "callout %p", callout, 0, 0, 0);
+
/* Note callout done, then call out. */
KASSERT(!cv_has_waiters(&bp->b_done));
KERNEL_LOCK(1, NULL); /* XXXSMP */
@@ -1578,11 +1624,13 @@ biodone2(buf_t *bp)
KERNEL_UNLOCK_ONE(NULL); /* XXXSMP */
} else if (ISSET(bp->b_flags, B_ASYNC)) {
/* If async, release. */
+ KERNHIST_LOG(biohist, "async", 0, 0, 0, 0);
KASSERT(!cv_has_waiters(&bp->b_done));
mutex_exit(bp->b_objlock);
brelse(bp, 0);
} else {
/* Otherwise just wake up waiters in biowait(). */
+ KERNHIST_LOG(biohist, "wake-up", 0, 0, 0, 0);
cv_broadcast(&bp->b_done);
mutex_exit(bp->b_objlock);
}
@@ -1595,6 +1643,8 @@ biointr(void *cookie)
buf_t *bp;
int s;
+ KERNHIST_FUNC(__func__); KERNHIST_CALLED(biohist);
+
ci = curcpu();
while (!TAILQ_EMPTY(&ci->ci_data.cpu_biodone)) {
@@ -1605,6 +1655,7 @@ biointr(void *cookie)
TAILQ_REMOVE(&ci->ci_data.cpu_biodone, bp, b_actq);
splx(s);
+ KERNHIST_LOG(biohist, "bp=%p", bp, 0, 0, 0);
biodone2(bp);
}
}
@@ -1619,6 +1670,8 @@ buf_syncwait(void)
buf_t *bp;
int iter, nbusy, nbusy_prev = 0, ihash;
+ KERNHIST_FUNC(__func__); KERNHIST_CALLED(biohist);
+
for (iter = 0; iter < 20;) {
mutex_enter(&bufcache_lock);
nbusy = 0;
Index: src/sys/sys/buf.h
diff -u src/sys/sys/buf.h:1.125 src/sys/sys/buf.h:1.126
--- src/sys/sys/buf.h:1.125 Mon Jan 11 08:40:52 2016
+++ src/sys/sys/buf.h Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: buf.h,v 1.125 2016/01/11 08:40:52 martin Exp $ */
+/* $NetBSD: buf.h,v 1.126 2016/12/26 23:12:33 pgoyette Exp $ */
/*-
* Copyright (c) 1999, 2000, 2007, 2008 The NetBSD Foundation, Inc.
@@ -326,6 +326,7 @@ void buf_init(buf_t *);
void buf_destroy(buf_t *);
int bbusy(buf_t *, bool, int, kmutex_t *);
+void biohist_init(void);
__END_DECLS
#endif /* _KERNEL */
Index: src/sys/sys/kernhist.h
diff -u src/sys/sys/kernhist.h:1.12 src/sys/sys/kernhist.h:1.13
--- src/sys/sys/kernhist.h:1.12 Sat Apr 9 17:04:53 2016
+++ src/sys/sys/kernhist.h Mon Dec 26 23:12:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: kernhist.h,v 1.12 2016/04/09 17:04:53 riastradh Exp $ */
+/* $NetBSD: kernhist.h,v 1.13 2016/12/26 23:12:33 pgoyette Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -87,6 +87,7 @@ LIST_HEAD(kern_history_head, kern_histor
#define KERNHIST_UVMLOANHIST 0x00000008 /* loanhist */
#define KERNHIST_USBHIST 0x00000010 /* usbhist */
#define KERNHIST_SCDEBUGHIST 0x00000020 /* scdebughist */
+#define KERNHIST_BIOHIST 0x00000040 /* biohist */
#ifdef _KERNEL
Added files:
Index: src/sys/sys/biohist.h
diff -u /dev/null src/sys/sys/biohist.h:1.1
--- /dev/null Mon Dec 26 23:12:34 2016
+++ src/sys/sys/biohist.h Mon Dec 26 23:12:33 2016
@@ -0,0 +1,58 @@
+/* $NetBSD: biohist.h,v 1.1 2016/12/26 23:12:33 pgoyette Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Paul Goyette
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _KERN_BIOHIST_H_
+#define _KERN_BIOHIST_H_
+
+#ifdef _KERNEL_OPT
+#include "opt_biohist.h"
+#endif
+
+/*
+ * Make BIOHIST_PRINT force on KERNHIST_PRINT for at least BIOHIST_* usage.
+ */
+#if defined(BIOHIST_PRINT) && !defined(KERNHIST_PRINT)
+#define KERNHIST_PRINT 1
+#endif
+
+#include <sys/kernhist.h>
+
+#ifdef BIOHIST
+
+#ifndef BIOHIST_SIZE
+#define BIOHIST_SIZE 500
+#endif /* BIOHIST_SIZE */
+
+KERNHIST_DECL(biohist);
+
+#endif /* BIOHIST */
+
+#endif /* _KERN_BIOHIST_H_ */