[SCSI] zfcp: Only collect SCSI debug data for matching trace levels
The default trace level is to only trace failed SCSI commands. Thus it is not necessary to collect trace data for most SCSI commands since it will be thrown away later. Restructure the SCSI trace infrastructure to first check the trace level in a inline function and only do the expensive data collection for matching trace levels. Reviewed-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
d46f384a89
commit
dcd20e2316
@ -921,13 +921,11 @@ static struct debug_view zfcp_san_dbf_view = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
|
void _zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
|
||||||
struct zfcp_adapter *adapter,
|
struct zfcp_dbf *dbf, struct scsi_cmnd *scsi_cmnd,
|
||||||
struct scsi_cmnd *scsi_cmnd,
|
struct zfcp_fsf_req *fsf_req,
|
||||||
struct zfcp_fsf_req *fsf_req,
|
unsigned long old_req_id)
|
||||||
unsigned long old_req_id)
|
|
||||||
{
|
{
|
||||||
struct zfcp_dbf *dbf = adapter->dbf;
|
|
||||||
struct zfcp_scsi_dbf_record *rec = &dbf->scsi_dbf_buf;
|
struct zfcp_scsi_dbf_record *rec = &dbf->scsi_dbf_buf;
|
||||||
struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec;
|
struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -999,54 +997,6 @@ static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
|
|||||||
spin_unlock_irqrestore(&dbf->scsi_dbf_lock, flags);
|
spin_unlock_irqrestore(&dbf->scsi_dbf_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* zfcp_scsi_dbf_event_result - trace event for SCSI command completion
|
|
||||||
* @tag: tag indicating success or failure of SCSI command
|
|
||||||
* @level: trace level applicable for this event
|
|
||||||
* @adapter: adapter that has been used to issue the SCSI command
|
|
||||||
* @scsi_cmnd: SCSI command pointer
|
|
||||||
* @fsf_req: request used to issue SCSI command (might be NULL)
|
|
||||||
*/
|
|
||||||
void zfcp_scsi_dbf_event_result(const char *tag, int level,
|
|
||||||
struct zfcp_adapter *adapter,
|
|
||||||
struct scsi_cmnd *scsi_cmnd,
|
|
||||||
struct zfcp_fsf_req *fsf_req)
|
|
||||||
{
|
|
||||||
zfcp_scsi_dbf_event("rslt", tag, level, adapter, scsi_cmnd, fsf_req, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
|
|
||||||
* @tag: tag indicating success or failure of abort operation
|
|
||||||
* @adapter: adapter thas has been used to issue SCSI command to be aborted
|
|
||||||
* @scsi_cmnd: SCSI command to be aborted
|
|
||||||
* @new_fsf_req: request containing abort (might be NULL)
|
|
||||||
* @old_req_id: identifier of request containg SCSI command to be aborted
|
|
||||||
*/
|
|
||||||
void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
|
|
||||||
struct scsi_cmnd *scsi_cmnd,
|
|
||||||
struct zfcp_fsf_req *new_fsf_req,
|
|
||||||
unsigned long old_req_id)
|
|
||||||
{
|
|
||||||
zfcp_scsi_dbf_event("abrt", tag, 1, adapter, scsi_cmnd, new_fsf_req,
|
|
||||||
old_req_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
|
|
||||||
* @tag: tag indicating success or failure of reset operation
|
|
||||||
* @flag: indicates type of reset (Target Reset, Logical Unit Reset)
|
|
||||||
* @unit: unit that needs reset
|
|
||||||
* @scsi_cmnd: SCSI command which caused this error recovery
|
|
||||||
*/
|
|
||||||
void zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag,
|
|
||||||
struct zfcp_unit *unit,
|
|
||||||
struct scsi_cmnd *scsi_cmnd)
|
|
||||||
{
|
|
||||||
zfcp_scsi_dbf_event(flag == FCP_TARGET_RESET ? "trst" : "lrst", tag, 1,
|
|
||||||
unit->port->adapter, scsi_cmnd, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int zfcp_scsi_dbf_view_format(debug_info_t *id, struct debug_view *view,
|
static int zfcp_scsi_dbf_view_format(debug_info_t *id, struct debug_view *view,
|
||||||
char *out_buf, const char *in_buf)
|
char *out_buf, const char *in_buf)
|
||||||
{
|
{
|
||||||
|
@ -22,7 +22,9 @@
|
|||||||
#ifndef ZFCP_DBF_H
|
#ifndef ZFCP_DBF_H
|
||||||
#define ZFCP_DBF_H
|
#define ZFCP_DBF_H
|
||||||
|
|
||||||
|
#include "zfcp_ext.h"
|
||||||
#include "zfcp_fsf.h"
|
#include "zfcp_fsf.h"
|
||||||
|
#include "zfcp_def.h"
|
||||||
|
|
||||||
#define ZFCP_DBF_TAG_SIZE 4
|
#define ZFCP_DBF_TAG_SIZE 4
|
||||||
#define ZFCP_DBF_ID_SIZE 7
|
#define ZFCP_DBF_ID_SIZE 7
|
||||||
@ -237,4 +239,65 @@ struct zfcp_dbf {
|
|||||||
struct zfcp_scsi_dbf_record scsi_dbf_buf;
|
struct zfcp_scsi_dbf_record scsi_dbf_buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
|
||||||
|
struct zfcp_adapter *adapter, struct scsi_cmnd *scmd,
|
||||||
|
struct zfcp_fsf_req *req, unsigned long old_id)
|
||||||
|
{
|
||||||
|
struct zfcp_dbf *dbf = adapter->dbf;
|
||||||
|
|
||||||
|
if (level <= dbf->scsi_dbf->level)
|
||||||
|
_zfcp_scsi_dbf_event(tag, tag2, level, dbf, scmd, req, old_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zfcp_scsi_dbf_event_result - trace event for SCSI command completion
|
||||||
|
* @tag: tag indicating success or failure of SCSI command
|
||||||
|
* @level: trace level applicable for this event
|
||||||
|
* @adapter: adapter that has been used to issue the SCSI command
|
||||||
|
* @scmd: SCSI command pointer
|
||||||
|
* @fsf_req: request used to issue SCSI command (might be NULL)
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
void zfcp_scsi_dbf_event_result(const char *tag, int level,
|
||||||
|
struct zfcp_adapter *adapter,
|
||||||
|
struct scsi_cmnd *scmd,
|
||||||
|
struct zfcp_fsf_req *fsf_req)
|
||||||
|
{
|
||||||
|
zfcp_scsi_dbf_event("rslt", tag, level, adapter, scmd, fsf_req, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
|
||||||
|
* @tag: tag indicating success or failure of abort operation
|
||||||
|
* @adapter: adapter thas has been used to issue SCSI command to be aborted
|
||||||
|
* @scmd: SCSI command to be aborted
|
||||||
|
* @new_req: request containing abort (might be NULL)
|
||||||
|
* @old_id: identifier of request containg SCSI command to be aborted
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
|
||||||
|
struct scsi_cmnd *scmd,
|
||||||
|
struct zfcp_fsf_req *new_req,
|
||||||
|
unsigned long old_id)
|
||||||
|
{
|
||||||
|
zfcp_scsi_dbf_event("abrt", tag, 1, adapter, scmd, new_req, old_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
|
||||||
|
* @tag: tag indicating success or failure of reset operation
|
||||||
|
* @flag: indicates type of reset (Target Reset, Logical Unit Reset)
|
||||||
|
* @unit: unit that needs reset
|
||||||
|
* @scsi_cmnd: SCSI command which caused this error recovery
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
void zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag,
|
||||||
|
struct zfcp_unit *unit,
|
||||||
|
struct scsi_cmnd *scsi_cmnd)
|
||||||
|
{
|
||||||
|
zfcp_scsi_dbf_event(flag == FCP_TARGET_RESET ? "trst" : "lrst", tag, 1,
|
||||||
|
unit->port->adapter, scsi_cmnd, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* ZFCP_DBF_H */
|
#endif /* ZFCP_DBF_H */
|
||||||
|
@ -57,14 +57,9 @@ extern void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *);
|
|||||||
extern void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *);
|
extern void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *);
|
||||||
extern void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *);
|
extern void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *);
|
||||||
extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *);
|
extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *);
|
||||||
extern void zfcp_scsi_dbf_event_result(const char *, int, struct zfcp_adapter *,
|
extern void _zfcp_scsi_dbf_event(const char *, const char *, int,
|
||||||
struct scsi_cmnd *,
|
struct zfcp_dbf *, struct scsi_cmnd *,
|
||||||
struct zfcp_fsf_req *);
|
struct zfcp_fsf_req *, unsigned long);
|
||||||
extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *,
|
|
||||||
struct scsi_cmnd *, struct zfcp_fsf_req *,
|
|
||||||
unsigned long);
|
|
||||||
extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *,
|
|
||||||
struct scsi_cmnd *);
|
|
||||||
|
|
||||||
/* zfcp_erp.c */
|
/* zfcp_erp.c */
|
||||||
extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, char *,
|
extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, char *,
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <linux/blktrace_api.h>
|
#include <linux/blktrace_api.h>
|
||||||
#include "zfcp_ext.h"
|
#include "zfcp_ext.h"
|
||||||
|
#include "zfcp_dbf.h"
|
||||||
|
|
||||||
#define ZFCP_REQ_AUTO_CLEANUP 0x00000002
|
#define ZFCP_REQ_AUTO_CLEANUP 0x00000002
|
||||||
#define ZFCP_REQ_NO_QTCB 0x00000008
|
#define ZFCP_REQ_NO_QTCB 0x00000008
|
||||||
|
@ -9,8 +9,9 @@
|
|||||||
#define KMSG_COMPONENT "zfcp"
|
#define KMSG_COMPONENT "zfcp"
|
||||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||||
|
|
||||||
#include "zfcp_ext.h"
|
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
|
#include "zfcp_ext.h"
|
||||||
|
#include "zfcp_dbf.h"
|
||||||
|
|
||||||
static unsigned int default_depth = 32;
|
static unsigned int default_depth = 32;
|
||||||
module_param_named(queue_depth, default_depth, uint, 0600);
|
module_param_named(queue_depth, default_depth, uint, 0600);
|
||||||
|
Loading…
Reference in New Issue
Block a user