Skip to content

Commit 0997f1c

Browse files
Stefan RasplJens Axboe
authored andcommitted
blktrace: pass zfcp driver data
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 <[email protected]> Signed-off-by: Martin Peschke <[email protected]> Signed-off-by: Christof Schmitt <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 756f824 commit 0997f1c

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

drivers/s390/scsi/zfcp_def.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@ struct zfcp_fsf_req {
583583
unsigned long long issued; /* request sent time (STCK) */
584584
struct zfcp_unit *unit;
585585
void (*handler)(struct zfcp_fsf_req *);
586+
u16 qdio_outb_usage;/* usage of outbound queue */
587+
u16 qdio_inb_usage; /* usage of inbound queue */
586588
};
587589

588590
/* driver data */

drivers/s390/scsi/zfcp_fsf.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* Copyright IBM Corporation 2002, 2008
77
*/
88

9+
#include <linux/blktrace_api.h>
910
#include "zfcp_ext.h"
1011

1112
static void zfcp_fsf_request_timeout_handler(unsigned long data)
@@ -777,6 +778,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
777778
list_add_tail(&req->list, &adapter->req_list[idx]);
778779
spin_unlock(&adapter->req_list_lock);
779780

781+
req->qdio_outb_usage = atomic_read(&req_q->count);
780782
req->issued = get_clock();
781783
if (zfcp_qdio_send(req)) {
782784
/* Queues are down..... */
@@ -2082,6 +2084,36 @@ static void zfcp_fsf_req_latency(struct zfcp_fsf_req *req)
20822084
spin_unlock_irqrestore(&unit->latencies.lock, flags);
20832085
}
20842086

2087+
#ifdef CONFIG_BLK_DEV_IO_TRACE
2088+
static void zfcp_fsf_trace_latency(struct zfcp_fsf_req *fsf_req)
2089+
{
2090+
struct fsf_qual_latency_info *lat_inf;
2091+
struct scsi_cmnd *scsi_cmnd = (struct scsi_cmnd *)fsf_req->data;
2092+
struct request *req = scsi_cmnd->request;
2093+
struct zfcp_blk_drv_data trace;
2094+
int ticks = fsf_req->adapter->timer_ticks;
2095+
2096+
trace.flags = 0;
2097+
trace.magic = ZFCP_BLK_DRV_DATA_MAGIC;
2098+
if (fsf_req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) {
2099+
trace.flags |= ZFCP_BLK_LAT_VALID;
2100+
lat_inf = &fsf_req->qtcb->prefix.prot_status_qual.latency_info;
2101+
trace.channel_lat = lat_inf->channel_lat * ticks;
2102+
trace.fabric_lat = lat_inf->fabric_lat * ticks;
2103+
}
2104+
if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
2105+
trace.flags |= ZFCP_BLK_REQ_ERROR;
2106+
trace.inb_usage = fsf_req->qdio_inb_usage;
2107+
trace.outb_usage = fsf_req->qdio_outb_usage;
2108+
2109+
blk_add_driver_data(req->q, req, &trace, sizeof(trace));
2110+
}
2111+
#else
2112+
static inline void zfcp_fsf_trace_latency(struct zfcp_fsf_req *fsf_req)
2113+
{
2114+
}
2115+
#endif
2116+
20852117
static void zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *req)
20862118
{
20872119
struct scsi_cmnd *scpnt = req->data;
@@ -2114,6 +2146,8 @@ static void zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *req)
21142146
if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)
21152147
zfcp_fsf_req_latency(req);
21162148

2149+
zfcp_fsf_trace_latency(req);
2150+
21172151
if (unlikely(fcp_rsp_iu->validity.bits.fcp_rsp_len_valid)) {
21182152
if (fcp_rsp_info[3] == RSP_CODE_GOOD)
21192153
set_host_byte(scpnt, DID_OK);

drivers/s390/scsi/zfcp_fsf.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,4 +439,16 @@ struct fsf_qtcb {
439439
u8 log[FSF_QTCB_LOG_SIZE];
440440
} __attribute__ ((packed));
441441

442+
struct zfcp_blk_drv_data {
443+
#define ZFCP_BLK_DRV_DATA_MAGIC 0x1
444+
u32 magic;
445+
#define ZFCP_BLK_LAT_VALID 0x1
446+
#define ZFCP_BLK_REQ_ERROR 0x2
447+
u16 flags;
448+
u8 inb_usage;
449+
u8 outb_usage;
450+
u64 channel_lat;
451+
u64 fabric_lat;
452+
} __attribute__ ((packed));
453+
442454
#endif /* FSF_H */

drivers/s390/scsi/zfcp_qdio.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ static void zfcp_qdio_reqid_check(struct zfcp_adapter *adapter,
115115
spin_unlock_irqrestore(&adapter->req_list_lock, flags);
116116

117117
fsf_req->sbal_response = sbal_idx;
118+
fsf_req->qdio_inb_usage = atomic_read(&adapter->resp_q.count);
118119
zfcp_fsf_req_complete(fsf_req);
119120
}
120121

0 commit comments

Comments
 (0)