linux-btrace.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Patch 2/3] driver data: pass zfcp data through blktrace
@ 2008-07-16 11:25 Martin Peschke
  2008-10-05 13:07 ` Martin Peschke
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Martin Peschke @ 2008-07-16 11:25 UTC (permalink / raw)
  To: linux-s390, linux-btrace

From: Stefan Raspl <raspl@linux.vnet.ibm.com>

This patch writes the channel and fabric latencies in nanoseconds per
request via blktrace for later analysis. The utilization of the inbound
and outbound adapter queue is also reported.

Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
---
 drivers/s390/scsi/zfcp_def.h  |    2 ++
 drivers/s390/scsi/zfcp_fsf.c  |   32 ++++++++++++++++++++++++++++++++
 drivers/s390/scsi/zfcp_fsf.h  |   12 ++++++++++++
 drivers/s390/scsi/zfcp_qdio.c |    1 +
 4 files changed, 47 insertions(+)

--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -6,6 +6,7 @@
  * Copyright IBM Corporation 2002, 2008
  */
 
+#include <linux/blktrace_api.h>
 #include "zfcp_ext.h"
 
 static void zfcp_fsf_request_timeout_handler(unsigned long data)
@@ -844,6 +845,7 @@ static int zfcp_fsf_req_send(struct zfcp
 	list_add_tail(&req->list, &adapter->req_list[idx]);
 	spin_unlock(&adapter->req_list_lock);
 
+	req->qdio_outb_usage = atomic_read(&req_q->count);
 	req->issued = get_clock();
 	if (zfcp_qdio_send(req)) {
 		/* Queues are down..... */
@@ -2046,6 +2048,34 @@ static void zfcp_fsf_req_latency(struct 
 	spin_unlock_irqrestore(&unit->latencies.lock, flags);
 }
 
+#ifdef CONFIG_BLK_DEV_IO_TRACE
+static void zfcp_fsf_trace_latency(struct zfcp_fsf_req *fsf_req)
+{
+	struct fsf_qual_latency_info *lat_inf;
+	struct scsi_cmnd *scsi_cmnd = (struct scsi_cmnd *)fsf_req->data;
+	struct request *req = scsi_cmnd->request;
+	struct zfcp_blk_drv_data trace;
+	int ticks = fsf_req->adapter->timer_ticks;
+
+	trace.flags = 0;
+	trace.magic = cpu_to_be32(ZFCP_BLK_DRV_DATA_MAGIC);
+	if (fsf_req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) {
+		trace.flags |= ZFCP_BLK_LAT_VALID;
+		lat_inf = &fsf_req->qtcb->prefix.prot_status_qual.latency_info;
+		trace.channel_lat = cpu_to_be64(lat_inf->channel_lat * ticks);
+		trace.fabric_lat = cpu_to_be64(lat_inf->fabric_lat * ticks);
+	}
+	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
+		trace.flags |= ZFCP_BLK_REQ_ERROR;
+	trace.inb_usage = cpu_to_be16(fsf_req->qdio_inb_usage);
+	trace.outb_usage = cpu_to_be16(fsf_req->qdio_outb_usage);
+
+	blk_add_driver_data(req->q, req, &trace, sizeof(trace));
+}
+#else
+#define zfcp_fsf_trace_latency(fsf_req)	do { } while (0)
+#endif
+
 static void zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *req)
 {
 	struct scsi_cmnd *scpnt = req->data;
@@ -2078,6 +2108,8 @@ static void zfcp_fsf_send_fcp_command_ta
 	if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)
 		zfcp_fsf_req_latency(req);
 
+	zfcp_fsf_trace_latency(req);
+
 	if (unlikely(fcp_rsp_iu->validity.bits.fcp_rsp_len_valid)) {
 		if (fcp_rsp_info[3] = RSP_CODE_GOOD)
 			set_host_byte(scpnt, DID_OK);
--- a/drivers/s390/scsi/zfcp_def.h
+++ b/drivers/s390/scsi/zfcp_def.h
@@ -639,6 +639,8 @@ struct zfcp_fsf_req {
 	unsigned long long     issued;         /* request sent time (STCK) */
 	struct zfcp_unit       *unit;
 	void			(*handler)(struct zfcp_fsf_req *);
+	u16			qdio_outb_usage;/* usage of outbound queue */
+	u16			qdio_inb_usage;	/* usage of inbound queue */
 };
 
 /* driver data */
--- a/drivers/s390/scsi/zfcp_qdio.c
+++ b/drivers/s390/scsi/zfcp_qdio.c
@@ -117,6 +117,7 @@ static void zfcp_qdio_reqid_check(struct
 	spin_unlock_irqrestore(&adapter->req_list_lock, flags);
 
 	fsf_req->sbal_response = sbal_idx;
+	fsf_req->qdio_inb_usage = atomic_read(&adapter->resp_q.count);
 	zfcp_fsf_req_complete(fsf_req);
 }
 
--- a/drivers/s390/scsi/zfcp_fsf.h
+++ b/drivers/s390/scsi/zfcp_fsf.h
@@ -514,4 +514,16 @@ struct fsf_qtcb {
 	u8 log[FSF_QTCB_LOG_SIZE];
 } __attribute__ ((packed));
 
+struct zfcp_blk_drv_data {
+#define ZFCP_BLK_DRV_DATA_MAGIC			0x1
+	u32 magic;
+#define ZFCP_BLK_LAT_VALID			0x1
+#define ZFCP_BLK_REQ_ERROR			0x2
+	u16 flags;
+	u8 inb_usage;
+	u8 outb_usage;
+	u64 channel_lat;
+	u64 fabric_lat;
+} __attribute__ ((packed));
+
 #endif				/* FSF_H */



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Patch 2/3] driver data: pass zfcp data through blktrace
  2008-07-16 11:25 [Patch 2/3] driver data: pass zfcp data through blktrace Martin Peschke
@ 2008-10-05 13:07 ` Martin Peschke
  2008-10-06 10:59 ` Heiko Carstens
  2008-10-06 16:45 ` Martin Peschke
  2 siblings, 0 replies; 5+ messages in thread
From: Martin Peschke @ 2008-10-05 13:07 UTC (permalink / raw)
  To: linux-btrace

From: Stefan Raspl <raspl@linux.vnet.ibm.com>

This patch writes the channel and fabric latencies in nanoseconds per
request via blktrace for later analysis. The utilization of the inbound
and outbound adapter queue is also reported.

Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
---
 drivers/s390/scsi/zfcp_def.h  |    2 ++
 drivers/s390/scsi/zfcp_fsf.c  |   32 ++++++++++++++++++++++++++++++++
 drivers/s390/scsi/zfcp_fsf.h  |   12 ++++++++++++
 drivers/s390/scsi/zfcp_qdio.c |    1 +
 4 files changed, 47 insertions(+)

--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -6,6 +6,7 @@
  * Copyright IBM Corporation 2002, 2008
  */
 
+#include <linux/blktrace_api.h>
 #include "zfcp_ext.h"
 
 static void zfcp_fsf_request_timeout_handler(unsigned long data)
@@ -777,6 +778,7 @@ static int zfcp_fsf_req_send(struct zfcp
 	list_add_tail(&req->list, &adapter->req_list[idx]);
 	spin_unlock(&adapter->req_list_lock);
 
+	req->qdio_outb_usage = atomic_read(&req_q->count);
 	req->issued = get_clock();
 	if (zfcp_qdio_send(req)) {
 		/* Queues are down..... */
@@ -2082,6 +2084,34 @@ static void zfcp_fsf_req_latency(struct 
 	spin_unlock_irqrestore(&unit->latencies.lock, flags);
 }
 
+#ifdef CONFIG_BLK_DEV_IO_TRACE
+static void zfcp_fsf_trace_latency(struct zfcp_fsf_req *fsf_req)
+{
+	struct fsf_qual_latency_info *lat_inf;
+	struct scsi_cmnd *scsi_cmnd = (struct scsi_cmnd *)fsf_req->data;
+	struct request *req = scsi_cmnd->request;
+	struct zfcp_blk_drv_data trace;
+	int ticks = fsf_req->adapter->timer_ticks;
+
+	trace.flags = 0;
+	trace.magic = cpu_to_be32(ZFCP_BLK_DRV_DATA_MAGIC);
+	if (fsf_req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) {
+		trace.flags |= ZFCP_BLK_LAT_VALID;
+		lat_inf = &fsf_req->qtcb->prefix.prot_status_qual.latency_info;
+		trace.channel_lat = cpu_to_be64(lat_inf->channel_lat * ticks);
+		trace.fabric_lat = cpu_to_be64(lat_inf->fabric_lat * ticks);
+	}
+	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
+		trace.flags |= ZFCP_BLK_REQ_ERROR;
+	trace.inb_usage = cpu_to_be16(fsf_req->qdio_inb_usage);
+	trace.outb_usage = cpu_to_be16(fsf_req->qdio_outb_usage);
+
+	blk_add_driver_data(req->q, req, &trace, sizeof(trace));
+}
+#else
+#define zfcp_fsf_trace_latency(fsf_req)	do { } while (0)
+#endif
+
 static void zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *req)
 {
 	struct scsi_cmnd *scpnt = req->data;
@@ -2114,6 +2144,8 @@ static void zfcp_fsf_send_fcp_command_ta
 	if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)
 		zfcp_fsf_req_latency(req);
 
+	zfcp_fsf_trace_latency(req);
+
 	if (unlikely(fcp_rsp_iu->validity.bits.fcp_rsp_len_valid)) {
 		if (fcp_rsp_info[3] = RSP_CODE_GOOD)
 			set_host_byte(scpnt, DID_OK);
--- a/drivers/s390/scsi/zfcp_def.h
+++ b/drivers/s390/scsi/zfcp_def.h
@@ -583,6 +583,8 @@ struct zfcp_fsf_req {
 	unsigned long long     issued;         /* request sent time (STCK) */
 	struct zfcp_unit       *unit;
 	void			(*handler)(struct zfcp_fsf_req *);
+	u16			qdio_outb_usage;/* usage of outbound queue */
+	u16			qdio_inb_usage;	/* usage of inbound queue */
 };
 
 /* driver data */
--- a/drivers/s390/scsi/zfcp_qdio.c
+++ b/drivers/s390/scsi/zfcp_qdio.c
@@ -115,6 +115,7 @@ static void zfcp_qdio_reqid_check(struct
 	spin_unlock_irqrestore(&adapter->req_list_lock, flags);
 
 	fsf_req->sbal_response = sbal_idx;
+	fsf_req->qdio_inb_usage = atomic_read(&adapter->resp_q.count);
 	zfcp_fsf_req_complete(fsf_req);
 }
 
--- a/drivers/s390/scsi/zfcp_fsf.h
+++ b/drivers/s390/scsi/zfcp_fsf.h
@@ -439,4 +439,16 @@ struct fsf_qtcb {
 	u8 log[FSF_QTCB_LOG_SIZE];
 } __attribute__ ((packed));
 
+struct zfcp_blk_drv_data {
+#define ZFCP_BLK_DRV_DATA_MAGIC			0x1
+	u32 magic;
+#define ZFCP_BLK_LAT_VALID			0x1
+#define ZFCP_BLK_REQ_ERROR			0x2
+	u16 flags;
+	u8 inb_usage;
+	u8 outb_usage;
+	u64 channel_lat;
+	u64 fabric_lat;
+} __attribute__ ((packed));
+
 #endif				/* FSF_H */



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Patch 2/3] driver data: pass zfcp data through blktrace
  2008-07-16 11:25 [Patch 2/3] driver data: pass zfcp data through blktrace Martin Peschke
  2008-10-05 13:07 ` Martin Peschke
@ 2008-10-06 10:59 ` Heiko Carstens
  2008-10-06 16:45 ` Martin Peschke
  2 siblings, 0 replies; 5+ messages in thread
From: Heiko Carstens @ 2008-10-06 10:59 UTC (permalink / raw)
  To: linux-btrace

> +	trace.flags = 0;
> +	trace.magic = cpu_to_be32(ZFCP_BLK_DRV_DATA_MAGIC);
> +	if (fsf_req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) {
> +		trace.flags |= ZFCP_BLK_LAT_VALID;
> +		lat_inf = &fsf_req->qtcb->prefix.prot_status_qual.latency_info;
> +		trace.channel_lat = cpu_to_be64(lat_inf->channel_lat * ticks);
> +		trace.fabric_lat = cpu_to_be64(lat_inf->fabric_lat * ticks);
> +	}
> +	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
> +		trace.flags |= ZFCP_BLK_REQ_ERROR;
> +	trace.inb_usage = cpu_to_be16(fsf_req->qdio_inb_usage);
> +	trace.outb_usage = cpu_to_be16(fsf_req->qdio_outb_usage);

Could we please not add any cpu_to_be* calls to s390 only code? s390 is a big
endian architecture and therefore these calls are confusing and pointless.

> +#else
> +#define zfcp_fsf_trace_latency(fsf_req)	do { } while (0)
> +#endif

Please convert that to a static inline function for type checking.

Thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Patch 2/3] driver data: pass zfcp data through blktrace
  2008-07-16 11:25 [Patch 2/3] driver data: pass zfcp data through blktrace Martin Peschke
  2008-10-05 13:07 ` Martin Peschke
  2008-10-06 10:59 ` Heiko Carstens
@ 2008-10-06 16:45 ` Martin Peschke
  2008-10-06 17:01   ` Martin Peschke
  2 siblings, 1 reply; 5+ messages in thread
From: Martin Peschke @ 2008-10-06 16:45 UTC (permalink / raw)
  To: linux-btrace


On Mon, 2008-10-06 at 12:59 +0200, Heiko Carstens wrote:
> > +	trace.flags = 0;
> > +	trace.magic = cpu_to_be32(ZFCP_BLK_DRV_DATA_MAGIC);
> > +	if (fsf_req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) {
> > +		trace.flags |= ZFCP_BLK_LAT_VALID;
> > +		lat_inf = &fsf_req->qtcb->prefix.prot_status_qual.latency_info;
> > +		trace.channel_lat = cpu_to_be64(lat_inf->channel_lat * ticks);
> > +		trace.fabric_lat = cpu_to_be64(lat_inf->fabric_lat * ticks);
> > +	}
> > +	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
> > +		trace.flags |= ZFCP_BLK_REQ_ERROR;
> > +	trace.inb_usage = cpu_to_be16(fsf_req->qdio_inb_usage);
> > +	trace.outb_usage = cpu_to_be16(fsf_req->qdio_outb_usage);
> 
> Could we please not add any cpu_to_be* calls to s390 only code? s390 is a big
> endian architecture and therefore these calls are confusing and pointless.
> 
> > +#else
> > +#define zfcp_fsf_trace_latency(fsf_req)	do { } while (0)
> > +#endif
> 
> Please convert that to a static inline function for type checking.


Correct. Fixed patch will follow..

Thanks,
Martin


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Patch 2/3] driver data: pass zfcp data through blktrace
  2008-10-06 16:45 ` Martin Peschke
@ 2008-10-06 17:01   ` Martin Peschke
  0 siblings, 0 replies; 5+ messages in thread
From: Martin Peschke @ 2008-10-06 17:01 UTC (permalink / raw)
  To: linux-s390, linux-btrace

Removed pointless cpu_to_be* and changed define to static inline.



From: Stefan Raspl <raspl@linux.vnet.ibm.com>

This patch writes the channel and fabric latencies in nanoseconds per
request via blktrace for later analysis. The utilization of the inbound
and outbound adapter queue is also reported.

Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
---
 drivers/s390/scsi/zfcp_def.h  |    2 ++
 drivers/s390/scsi/zfcp_fsf.c  |   34 ++++++++++++++++++++++++++++++++++
 drivers/s390/scsi/zfcp_fsf.h  |   12 ++++++++++++
 drivers/s390/scsi/zfcp_qdio.c |    1 +
 4 files changed, 49 insertions(+)

--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -6,6 +6,7 @@
  * Copyright IBM Corporation 2002, 2008
  */
 
+#include <linux/blktrace_api.h>
 #include "zfcp_ext.h"
 
 static void zfcp_fsf_request_timeout_handler(unsigned long data)
@@ -777,6 +778,7 @@ static int zfcp_fsf_req_send(struct zfcp
 	list_add_tail(&req->list, &adapter->req_list[idx]);
 	spin_unlock(&adapter->req_list_lock);
 
+	req->qdio_outb_usage = atomic_read(&req_q->count);
 	req->issued = get_clock();
 	if (zfcp_qdio_send(req)) {
 		/* Queues are down..... */
@@ -2082,6 +2084,36 @@ static void zfcp_fsf_req_latency(struct 
 	spin_unlock_irqrestore(&unit->latencies.lock, flags);
 }
 
+#ifdef CONFIG_BLK_DEV_IO_TRACE
+static void zfcp_fsf_trace_latency(struct zfcp_fsf_req *fsf_req)
+{
+	struct fsf_qual_latency_info *lat_inf;
+	struct scsi_cmnd *scsi_cmnd = (struct scsi_cmnd *)fsf_req->data;
+	struct request *req = scsi_cmnd->request;
+	struct zfcp_blk_drv_data trace;
+	int ticks = fsf_req->adapter->timer_ticks;
+
+	trace.flags = 0;
+	trace.magic = ZFCP_BLK_DRV_DATA_MAGIC;
+	if (fsf_req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) {
+		trace.flags |= ZFCP_BLK_LAT_VALID;
+		lat_inf = &fsf_req->qtcb->prefix.prot_status_qual.latency_info;
+		trace.channel_lat = lat_inf->channel_lat * ticks;
+		trace.fabric_lat = lat_inf->fabric_lat * ticks;
+	}
+	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
+		trace.flags |= ZFCP_BLK_REQ_ERROR;
+	trace.inb_usage = fsf_req->qdio_inb_usage;
+	trace.outb_usage = fsf_req->qdio_outb_usage;
+
+	blk_add_driver_data(req->q, req, &trace, sizeof(trace));
+}
+#else
+static inline void zfcp_fsf_trace_latency(struct zfcp_fsf_req *fsf_req)
+{
+}
+#endif
+
 static void zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *req)
 {
 	struct scsi_cmnd *scpnt = req->data;
@@ -2114,6 +2146,8 @@ static void zfcp_fsf_send_fcp_command_ta
 	if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)
 		zfcp_fsf_req_latency(req);
 
+	zfcp_fsf_trace_latency(req);
+
 	if (unlikely(fcp_rsp_iu->validity.bits.fcp_rsp_len_valid)) {
 		if (fcp_rsp_info[3] = RSP_CODE_GOOD)
 			set_host_byte(scpnt, DID_OK);
--- a/drivers/s390/scsi/zfcp_def.h
+++ b/drivers/s390/scsi/zfcp_def.h
@@ -583,6 +583,8 @@ struct zfcp_fsf_req {
 	unsigned long long     issued;         /* request sent time (STCK) */
 	struct zfcp_unit       *unit;
 	void			(*handler)(struct zfcp_fsf_req *);
+	u16			qdio_outb_usage;/* usage of outbound queue */
+	u16			qdio_inb_usage;	/* usage of inbound queue */
 };
 
 /* driver data */
--- a/drivers/s390/scsi/zfcp_qdio.c
+++ b/drivers/s390/scsi/zfcp_qdio.c
@@ -115,6 +115,7 @@ static void zfcp_qdio_reqid_check(struct
 	spin_unlock_irqrestore(&adapter->req_list_lock, flags);
 
 	fsf_req->sbal_response = sbal_idx;
+	fsf_req->qdio_inb_usage = atomic_read(&adapter->resp_q.count);
 	zfcp_fsf_req_complete(fsf_req);
 }
 
--- a/drivers/s390/scsi/zfcp_fsf.h
+++ b/drivers/s390/scsi/zfcp_fsf.h
@@ -439,4 +439,16 @@ struct fsf_qtcb {
 	u8 log[FSF_QTCB_LOG_SIZE];
 } __attribute__ ((packed));
 
+struct zfcp_blk_drv_data {
+#define ZFCP_BLK_DRV_DATA_MAGIC			0x1
+	u32 magic;
+#define ZFCP_BLK_LAT_VALID			0x1
+#define ZFCP_BLK_REQ_ERROR			0x2
+	u16 flags;
+	u8 inb_usage;
+	u8 outb_usage;
+	u64 channel_lat;
+	u64 fabric_lat;
+} __attribute__ ((packed));
+
 #endif				/* FSF_H */



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-10-06 17:01 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-16 11:25 [Patch 2/3] driver data: pass zfcp data through blktrace Martin Peschke
2008-10-05 13:07 ` Martin Peschke
2008-10-06 10:59 ` Heiko Carstens
2008-10-06 16:45 ` Martin Peschke
2008-10-06 17:01   ` Martin Peschke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).