Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/scsipi Sprinkle some dtrace probes into scsi(4).
details: https://anonhg.NetBSD.org/src/rev/6a5a02f9a11f
branches: trunk
changeset: 744961:6a5a02f9a11f
user: riastradh <riastradh%NetBSD.org@localhost>
date: Wed Feb 19 16:05:41 2020 +0000
description:
Sprinkle some dtrace probes into scsi(4).
diffstat:
sys/dev/scsipi/scsi_sdt.h | 36 ++++++++++++++++++++++++
sys/dev/scsipi/scsipi_base.c | 65 ++++++++++++++++++++++++++++++++++++++-----
2 files changed, 93 insertions(+), 8 deletions(-)
diffs (241 lines):
diff -r bc2d53905599 -r 6a5a02f9a11f sys/dev/scsipi/scsi_sdt.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/scsipi/scsi_sdt.h Wed Feb 19 16:05:41 2020 +0000
@@ -0,0 +1,36 @@
+/* $NetBSD: scsi_sdt.h,v 1.1 2020/02/19 16:05:41 riastradh Exp $ */
+
+/*-
+ * Copyright (c) 2020 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * 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 _DEV_SCSIPI_SCSI_SDT_H_
+#define _DEV_SCSIPI_SCSI_SDT_H_
+
+#include <sys/sdt.h>
+
+SDT_PROVIDER_DECLARE(scsi);
+
+#endif /* _DEV_SCSIPI_SCSI_SDT_H_ */
diff -r bc2d53905599 -r 6a5a02f9a11f sys/dev/scsipi/scsipi_base.c
--- a/sys/dev/scsipi/scsipi_base.c Wed Feb 19 16:04:39 2020 +0000
+++ b/sys/dev/scsipi/scsipi_base.c Wed Feb 19 16:05:41 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: scsipi_base.c,v 1.184 2019/11/10 21:16:37 chs Exp $ */
+/* $NetBSD: scsipi_base.c,v 1.185 2020/02/19 16:05:41 riastradh Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: scsipi_base.c,v 1.184 2019/11/10 21:16:37 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scsipi_base.c,v 1.185 2020/02/19 16:05:41 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_scsi.h"
@@ -51,6 +51,7 @@
#include <sys/hash.h>
#include <sys/atomic.h>
+#include <dev/scsipi/scsi_sdt.h>
#include <dev/scsipi/scsi_spc.h>
#include <dev/scsipi/scsipi_all.h>
#include <dev/scsipi/scsipi_disk.h>
@@ -62,6 +63,38 @@
#include <machine/param.h>
+SDT_PROVIDER_DEFINE(scsi);
+
+SDT_PROBE_DEFINE3(scsi, base, tag, get,
+ "struct scsipi_xfer *"/*xs*/, "uint8_t"/*tag*/, "uint8_t"/*type*/);
+SDT_PROBE_DEFINE3(scsi, base, tag, put,
+ "struct scsipi_xfer *"/*xs*/, "uint8_t"/*tag*/, "uint8_t"/*type*/);
+
+SDT_PROBE_DEFINE3(scsi, base, adapter, request__start,
+ "struct scsipi_channel *"/*chan*/,
+ "scsipi_adapter_req_t"/*req*/,
+ "void *"/*arg*/);
+SDT_PROBE_DEFINE3(scsi, base, adapter, request__done,
+ "struct scsipi_channel *"/*chan*/,
+ "scsipi_adapter_req_t"/*req*/,
+ "void *"/*arg*/);
+
+SDT_PROBE_DEFINE1(scsi, base, queue, batch__start,
+ "struct scsipi_channel *"/*chan*/);
+SDT_PROBE_DEFINE2(scsi, base, queue, run,
+ "struct scsipi_channel *"/*chan*/,
+ "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, queue, batch__done,
+ "struct scsipi_channel *"/*chan*/);
+
+SDT_PROBE_DEFINE1(scsi, base, xfer, execute, "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, xfer, enqueue, "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, xfer, done, "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, xfer, redone, "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, xfer, complete, "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, xfer, restart, "struct scsipi_xfer *"/*xs*/);
+SDT_PROBE_DEFINE1(scsi, base, xfer, free, "struct scsipi_xfer *"/*xs*/);
+
static int scsipi_complete(struct scsipi_xfer *);
static void scsipi_request_sense(struct scsipi_xfer *);
static int scsipi_enqueue(struct scsipi_xfer *);
@@ -378,6 +411,8 @@
}
xs->xs_tag_id = tag;
+ SDT_PROBE3(scsi, base, tag, get,
+ xs, xs->xs_tag_id, xs->xs_tag_type);
}
/*
@@ -395,6 +430,9 @@
KASSERT(mutex_owned(chan_mtx(periph->periph_channel)));
+ SDT_PROBE3(scsi, base, tag, put,
+ xs, xs->xs_tag_id, xs->xs_tag_type);
+
word = xs->xs_tag_id >> 5;
bit = xs->xs_tag_id & 0x1f;
@@ -541,6 +579,7 @@
struct scsipi_periph *periph = xs->xs_periph;
int flags = xs->xs_control;
+ SDT_PROBE1(scsi, base, xfer, free, xs);
SC_DEBUG(periph, SCSIPI_DB3, ("scsipi_free_xs\n"));
KASSERT(mutex_owned(chan_mtx(periph->periph_channel)));
@@ -1559,6 +1598,7 @@
#endif
mutex_enter(chan_mtx(chan));
+ SDT_PROBE1(scsi, base, xfer, done, xs);
/*
* The resource this command was using is now free.
*/
@@ -1573,6 +1613,7 @@
* that this won't ever happen (and can be turned into
* a KASSERT().
*/
+ SDT_PROBE1(scsi, base, xfer, redone, xs);
mutex_exit(chan_mtx(chan));
goto out;
}
@@ -1704,6 +1745,8 @@
struct scsipi_channel *chan = periph->periph_channel;
int error;
+ SDT_PROBE1(scsi, base, xfer, complete, xs);
+
#ifdef DIAGNOSTIC
if ((xs->xs_control & XS_CTL_ASYNC) != 0 && xs->bp == NULL)
panic("scsipi_complete: XS_CTL_ASYNC but no buf");
@@ -1872,6 +1915,7 @@
mutex_enter(chan_mtx(chan));
if (error == ERESTART) {
+ SDT_PROBE1(scsi, base, xfer, restart, xs);
/*
* If we get here, the periph has been thawed and frozen
* again if we had to issue recovery commands. Alternatively,
@@ -1981,6 +2025,8 @@
struct scsipi_channel *chan = xs->xs_periph->periph_channel;
struct scsipi_xfer *qxs;
+ SDT_PROBE1(scsi, base, xfer, enqueue, xs);
+
/*
* If the xfer is to be polled, and there are already jobs on
* the queue, we can't proceed.
@@ -2042,6 +2088,7 @@
struct scsipi_xfer *xs;
struct scsipi_periph *periph;
+ SDT_PROBE1(scsi, base, queue, batch__start, chan);
for (;;) {
mutex_enter(chan_mtx(chan));
@@ -2051,7 +2098,7 @@
*/
if (chan->chan_qfreeze != 0) {
mutex_exit(chan_mtx(chan));
- return;
+ break;
}
/*
@@ -2081,7 +2128,7 @@
* Can't find any work to do right now.
*/
mutex_exit(chan_mtx(chan));
- return;
+ break;
got_one:
/*
@@ -2111,7 +2158,7 @@
* XXX: We should be able to note that
* XXX: that resources are needed here!
*/
- return;
+ break;
}
/*
* scsipi_grow_resources() allocated the resource
@@ -2135,11 +2182,10 @@
periph->periph_sent++;
mutex_exit(chan_mtx(chan));
+ SDT_PROBE2(scsi, base, queue, run, chan, xs);
scsipi_adapter_request(chan, ADAPTER_REQ_RUN_XFER, xs);
}
-#ifdef DIAGNOSTIC
- panic("scsipi_run_queue: impossible");
-#endif
+ SDT_PROBE1(scsi, base, queue, batch__done, chan);
}
/*
@@ -2164,6 +2210,7 @@
xs->error = XS_NOERROR;
xs->resid = xs->datalen;
xs->status = SCSI_OK;
+ SDT_PROBE1(scsi, base, xfer, execute, xs);
#ifdef SCSIPI_DEBUG
if (xs->xs_periph->periph_dbflags & SCSIPI_DB3) {
@@ -2783,7 +2830,9 @@
struct scsipi_adapter *adapt = chan->chan_adapter;
scsipi_adapter_lock(adapt);
+ SDT_PROBE3(scsi, base, adapter, request__start, chan, req, arg);
(adapt->adapt_request)(chan, req, arg);
+ SDT_PROBE3(scsi, base, adapter, request__done, chan, req, arg);
scsipi_adapter_unlock(adapt);
}
Home |
Main Index |
Thread Index |
Old Index