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