Index: external/cddl/osnet/dev/sdt/sdt.c =================================================================== RCS file: /cvsroot/src/external/cddl/osnet/dev/sdt/sdt.c,v retrieving revision 1.11 diff -p -u -r1.11 sdt.c --- external/cddl/osnet/dev/sdt/sdt.c 26 Feb 2015 10:31:52 -0000 1.11 +++ external/cddl/osnet/dev/sdt/sdt.c 9 Mar 2015 04:36:01 -0000 @@ -89,6 +89,34 @@ static struct cdev *sdt_cdev; */ /* + * io provider + */ + +SDT_PROBE_DECLARE(io,,,done); +SDT_PROBE_DECLARE(io,,,start); +SDT_PROBE_DECLARE(io,,,wait_done); +SDT_PROBE_DECLARE(io,,,wait_start); + +static sdt_provider_t io_provider = { + .name = "io", + .id = 0, /* set by dtrace_register */ + .attr = { + { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, + { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, + { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, + { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, + { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, + }, + .probes = { + &SDT_NAME(io,,,done), + &SDT_NAME(io,,,start), + &SDT_NAME(io,,,wait_done), + &SDT_NAME(io,,,wait_start), + NULL + } +}; + +/* * proc provider */ @@ -136,6 +164,7 @@ static sdt_provider_t proc_provider = { /* list of local providers to register with DTrace */ static sdt_provider_t *sdt_providers[] = { + &io_provider, &proc_provider, NULL /* NULL terminated list */ }; Index: sys/kern/subr_devsw.c =================================================================== RCS file: /cvsroot/src/sys/kern/subr_devsw.c,v retrieving revision 1.33 diff -p -u -r1.33 subr_devsw.c --- sys/kern/subr_devsw.c 5 Sep 2014 05:57:21 -0000 1.33 +++ sys/kern/subr_devsw.c 9 Mar 2015 04:36:03 -0000 @@ -80,6 +80,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_devsw.c #include #include #include +#include #ifdef DEVSW_DEBUG #define DPRINTF(x) printf x @@ -730,12 +731,21 @@ bdev_close(dev_t dev, int flag, int devt return rv; } +SDT_PROBE_DEFINE(io,,,start,start, + "struct buf *", NULL, /* arg0: bp */ + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL); + void bdev_strategy(struct buf *bp) { const struct bdevsw *d; int mpflag; + SDT_PROBE(io,,,start, bp, NULL, NULL, NULL, NULL); + if ((d = bdevsw_lookup(bp->b_dev)) == NULL) { bp->b_error = ENXIO; bp->b_resid = bp->b_bcount; Index: sys/kern/vfs_bio.c =================================================================== RCS file: /cvsroot/src/sys/kern/vfs_bio.c,v retrieving revision 1.252 diff -p -u -r1.252 vfs_bio.c --- sys/kern/vfs_bio.c 8 Sep 2014 22:01:24 -0000 1.252 +++ sys/kern/vfs_bio.c 9 Mar 2015 04:36:03 -0000 @@ -144,6 +144,7 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v #include #include #include +#include #include /* extern struct uvm uvm */ @@ -1475,6 +1476,19 @@ buf_drain(int n) return size; } +SDT_PROBE_DEFINE(io,,,wait_start,wait-start, + "struct buf *", NULL, /* arg0: bp */ + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL); +SDT_PROBE_DEFINE(io,,,wait_done,wait-done, + "struct buf *", NULL, /* arg0: bp */ + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL); + /* * Wait for operations on the buffer to complete. * When they do, extract and return the I/O's error value. @@ -1486,11 +1500,15 @@ biowait(buf_t *bp) KASSERT(ISSET(bp->b_cflags, BC_BUSY)); KASSERT(bp->b_refcnt > 0); + SDT_PROBE(io,,,wait_start, bp, NULL, NULL, NULL, NULL); + mutex_enter(bp->b_objlock); while (!ISSET(bp->b_oflags, BO_DONE | BO_DELWRI)) cv_wait(&bp->b_done, bp->b_objlock); mutex_exit(bp->b_objlock); + SDT_PROBE(io,,,wait_done, bp, NULL, NULL, NULL, NULL); + return bp->b_error; } @@ -1529,11 +1547,20 @@ biodone(buf_t *bp) } } +SDT_PROBE_DEFINE(io,,,done,done, + "struct buf *", NULL, /* arg0: bp */ + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL); + static void biodone2(buf_t *bp) { void (*callout)(buf_t *); + SDT_PROBE(io,,,done, bp, NULL, NULL, NULL, NULL); + mutex_enter(bp->b_objlock); /* Note that the transfer is done. */ if (ISSET(bp->b_oflags, BO_DONE))