]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-3-v2.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.arch / s390-01-04-fcpperf-3-v2.patch
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-3-v2.patch b/src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-3-v2.patch
new file mode 100644 (file)
index 0000000..5a4314d
--- /dev/null
@@ -0,0 +1,125 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject:     (kernel):FCP - Performance Data colletion & analysis
+References:  bnc#417243
+
+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>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ 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)
+@@ -834,6 +835,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..... */
+@@ -2036,6 +2038,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;
+@@ -2068,6 +2100,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
+@@ -638,6 +638,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
+@@ -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 */