From patchwork Mon Nov 8 09:44:03 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 70405 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id CD11FB70F6 for ; Mon, 8 Nov 2010 20:45:06 +1100 (EST) Received: from localhost ([127.0.0.1]:60394 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PFOHe-0004jm-S4 for incoming@patchwork.ozlabs.org; Mon, 08 Nov 2010 04:45:02 -0500 Received: from [140.186.70.92] (port=57780 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PFOH7-0004hf-6Q for qemu-devel@nongnu.org; Mon, 08 Nov 2010 04:44:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PFOH5-0002Nc-TE for qemu-devel@nongnu.org; Mon, 08 Nov 2010 04:44:29 -0500 Received: from mtagate5.uk.ibm.com ([194.196.100.165]:36118) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PFOH5-0002NA-Lz for qemu-devel@nongnu.org; Mon, 08 Nov 2010 04:44:27 -0500 Received: from d06nrmr1307.portsmouth.uk.ibm.com (d06nrmr1307.portsmouth.uk.ibm.com [9.149.38.129]) by mtagate5.uk.ibm.com (8.13.1/8.13.1) with ESMTP id oA89iMbC022448 for ; Mon, 8 Nov 2010 09:44:22 GMT Received: from d06av03.portsmouth.uk.ibm.com (d06av03.portsmouth.uk.ibm.com [9.149.37.213]) by d06nrmr1307.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oA89iLOI3612706 for ; Mon, 8 Nov 2010 09:44:21 GMT Received: from d06av03.portsmouth.uk.ibm.com (localhost.localdomain [127.0.0.1]) by d06av03.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oA89iGtf030876 for ; Mon, 8 Nov 2010 02:44:16 -0700 Received: from stefan-thinkpad.manchester-maybrook.uk.ibm.com (dyn-9-174-219-93.manchester-maybrook.uk.ibm.com [9.174.219.93]) by d06av03.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oA89iGEZ030859; Mon, 8 Nov 2010 02:44:16 -0700 From: Stefan Hajnoczi To: Date: Mon, 8 Nov 2010 09:44:03 +0000 Message-Id: <1289209443-2528-1-git-send-email-stefanha@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.2.3 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Cc: Stefan Hajnoczi Subject: [Qemu-devel] [PATCH] trace: Trace SCSI request lifecycle X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This patch adds trace events for SCSI request allocation, freeing, CDB parsing, read, and write. These trace events can be used to instrument the SCSI request lifecycle. Signed-off-by: Stefan Hajnoczi --- hw/scsi-bus.c | 5 +++++ hw/scsi-disk.c | 9 +++++++++ trace-events | 11 +++++++++++ 3 files changed, 25 insertions(+), 0 deletions(-) diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 5a3fd4b..0228d4f 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -4,6 +4,7 @@ #include "scsi-defs.h" #include "qdev.h" #include "blockdev.h" +#include "trace.h" static struct BusInfo scsi_bus_info = { .name = "SCSI", @@ -145,6 +146,8 @@ SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag, uint32_t l req->status = -1; req->enqueued = true; QTAILQ_INSERT_TAIL(&d->requests, req, next); + + trace_scsi_req_alloc(d, tag, lun, req); return req; } @@ -172,6 +175,7 @@ void scsi_req_free(SCSIRequest *req) { scsi_req_dequeue(req); qemu_free(req); + trace_scsi_req_free(req); } static int scsi_req_length(SCSIRequest *req, uint8_t *cmd) @@ -395,6 +399,7 @@ int scsi_req_parse(SCSIRequest *req, uint8_t *buf) memcpy(req->cmd.buf, buf, req->cmd.len); scsi_req_xfer_mode(req); req->cmd.lba = scsi_req_lba(req); + trace_scsi_req_parse(req, req->cmd.len, req->cmd.lba, req->cmd.buf[0]); return 0; } diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index dc71957..c7a3f2a 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -37,6 +37,7 @@ do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0) #include "scsi-defs.h" #include "sysemu.h" #include "blockdev.h" +#include "trace.h" #define SCSI_DMA_BUF_SIZE 131072 #define SCSI_MAX_INQUIRY_LEN 256 @@ -136,6 +137,8 @@ static void scsi_read_complete(void * opaque, int ret) SCSIDiskReq *r = (SCSIDiskReq *)opaque; int n; + trace_scsi_read_complete(r, ret); + r->req.aiocb = NULL; if (ret) { @@ -158,6 +161,8 @@ static void scsi_read_request(SCSIDiskReq *r) SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); uint32_t n; + trace_scsi_read_request(r, r->sector, r->sector_count); + if (r->sector_count == (uint32_t)-1) { DPRINTF("Read buf_len=%zd\n", r->iov.iov_len); r->sector_count = 0; @@ -240,6 +245,8 @@ static void scsi_write_complete(void * opaque, int ret) uint32_t len; uint32_t n; + trace_scsi_write_complete(r, ret); + r->req.aiocb = NULL; if (ret) { @@ -269,6 +276,8 @@ static void scsi_write_request(SCSIDiskReq *r) SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); uint32_t n; + trace_scsi_write_request(r, r->sector, r->iov.iov_len); + n = r->iov.iov_len / 512; if (n) { qemu_iovec_init_external(&r->qiov, &r->iov, 1); diff --git a/trace-events b/trace-events index 947f8b0..7069628 100644 --- a/trace-events +++ b/trace-events @@ -189,3 +189,14 @@ disable sun4m_iommu_mem_writel_pgflush(uint32_t val) "page flush %x" disable sun4m_iommu_page_get_flags(uint64_t pa, uint64_t iopte, uint32_t ret) "get flags addr %"PRIx64" => pte %"PRIx64", *pte = %x" disable sun4m_iommu_translate_pa(uint64_t addr, uint64_t pa, uint32_t iopte) "xlate dva %"PRIx64" => pa %"PRIx64" iopte = %x" disable sun4m_iommu_bad_addr(uint64_t addr) "bad addr %"PRIx64"" + +# hw/scsi-bus.c +disable scsi_req_alloc(void *dev, uint32_t tag, uint32_t lun, void *req) "dev %p tag %#x lun %#x req %p" +disable scsi_req_free(void *req) "req %p" +disable scsi_req_parse(void *req, int len, uint64_t lba, uint8_t cmd) "req %p len %d lba %"PRIu64" cmd %#x" + +# hw/scsi-disk.c +disable scsi_read_request(void *req, uint64_t sector, uint32_t sector_count) "req %p sector %"PRIu64" sector_count %u" +disable scsi_read_complete(void *req, int ret) "req %p ret %d" +disable scsi_write_request(void *req, uint64_t sector, size_t len) "req %p sector %"PRIu64" len %zu" +disable scsi_write_complete(void *req, int ret) "req %p ret %d"