* [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).