Sprinkle some dtrace probes into scsi(4).

This commit is contained in:
riastradh 2020-02-19 16:05:41 +00:00
parent 16dde5e683
commit 13eca39faf
2 changed files with 93 additions and 8 deletions

36
sys/dev/scsipi/scsi_sdt.h Normal file
View File

@ -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_ */

View File

@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: scsipi_base.c,v 1.184 2019/11/10 21:16:37 chs Exp $"
#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 @@ __KERNEL_RCSID(0, "$NetBSD: scsipi_base.c,v 1.184 2019/11/10 21:16:37 chs Exp $"
#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 @@ scsipi_get_tag(struct scsipi_xfer *xs)
}
xs->xs_tag_id = tag;
SDT_PROBE3(scsi, base, tag, get,
xs, xs->xs_tag_id, xs->xs_tag_type);
}
/*
@ -395,6 +430,9 @@ scsipi_put_tag(struct scsipi_xfer *xs)
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 @@ scsipi_put_xs(struct scsipi_xfer *xs)
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 @@ scsipi_done(struct scsipi_xfer *xs)
#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 @@ scsipi_done(struct scsipi_xfer *xs)
* 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 @@ scsipi_complete(struct scsipi_xfer *xs)
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 @@ scsipi_complete(struct scsipi_xfer *xs)
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 @@ scsipi_enqueue(struct scsipi_xfer *xs)
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 @@ scsipi_run_queue(struct scsipi_channel *chan)
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 @@ scsipi_run_queue(struct scsipi_channel *chan)
*/
if (chan->chan_qfreeze != 0) {
mutex_exit(chan_mtx(chan));
return;
break;
}
/*
@ -2081,7 +2128,7 @@ scsipi_run_queue(struct scsipi_channel *chan)
* Can't find any work to do right now.
*/
mutex_exit(chan_mtx(chan));
return;
break;
got_one:
/*
@ -2111,7 +2158,7 @@ scsipi_run_queue(struct scsipi_channel *chan)
* 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 @@ scsipi_run_queue(struct scsipi_channel *chan)
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 @@ scsipi_execute_xs(struct scsipi_xfer *xs)
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 @@ scsipi_adapter_request(struct scsipi_channel *chan,
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);
}