| From 56d23ed7adf3974f10e91b643bd230e9c65b5f79 Mon Sep 17 00:00:00 2001 |
| From: Steffen Maier <maier@linux.vnet.ibm.com> |
| Date: Fri, 9 Dec 2016 17:16:32 +0100 |
| Subject: scsi: zfcp: do not trace pure benign residual HBA responses at default level |
| |
| From: Steffen Maier <maier@linux.vnet.ibm.com> |
| |
| commit 56d23ed7adf3974f10e91b643bd230e9c65b5f79 upstream. |
| |
| Since quite a while, Linux issues enough SCSI commands per scsi_device |
| which successfully return with FCP_RESID_UNDER, FSF_FCP_RSP_AVAILABLE, |
| and SAM_STAT_GOOD. This floods the HBA trace area and we cannot see |
| other and important HBA trace records long enough. |
| |
| Therefore, do not trace HBA response errors for pure benign residual |
| under counts at the default trace level. |
| |
| This excludes benign residual under count combined with other validity |
| bits set in FCP_RSP_IU, such as FCP_SNS_LEN_VAL. For all those other |
| cases, we still do want to see both the HBA record and the corresponding |
| SCSI record by default. |
| |
| Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com> |
| Fixes: a54ca0f62f95 ("[SCSI] zfcp: Redesign of the debug tracing for HBA records.") |
| Reviewed-by: Benjamin Block <bblock@linux.vnet.ibm.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/s390/scsi/zfcp_dbf.h | 30 ++++++++++++++++++++++++++++-- |
| drivers/s390/scsi/zfcp_fsf.h | 3 ++- |
| 2 files changed, 30 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/s390/scsi/zfcp_dbf.h |
| +++ b/drivers/s390/scsi/zfcp_dbf.h |
| @@ -2,7 +2,7 @@ |
| * zfcp device driver |
| * debug feature declarations |
| * |
| - * Copyright IBM Corp. 2008, 2015 |
| + * Copyright IBM Corp. 2008, 2016 |
| */ |
| |
| #ifndef ZFCP_DBF_H |
| @@ -283,6 +283,30 @@ struct zfcp_dbf { |
| struct zfcp_dbf_scsi scsi_buf; |
| }; |
| |
| +/** |
| + * zfcp_dbf_hba_fsf_resp_suppress - true if we should not trace by default |
| + * @req: request that has been completed |
| + * |
| + * Returns true if FCP response with only benign residual under count. |
| + */ |
| +static inline |
| +bool zfcp_dbf_hba_fsf_resp_suppress(struct zfcp_fsf_req *req) |
| +{ |
| + struct fsf_qtcb *qtcb = req->qtcb; |
| + u32 fsf_stat = qtcb->header.fsf_status; |
| + struct fcp_resp *fcp_rsp; |
| + u8 rsp_flags, fr_status; |
| + |
| + if (qtcb->prefix.qtcb_type != FSF_IO_COMMAND) |
| + return false; /* not an FCP response */ |
| + fcp_rsp = (struct fcp_resp *)&qtcb->bottom.io.fcp_rsp; |
| + rsp_flags = fcp_rsp->fr_flags; |
| + fr_status = fcp_rsp->fr_status; |
| + return (fsf_stat == FSF_FCP_RSP_AVAILABLE) && |
| + (rsp_flags == FCP_RESID_UNDER) && |
| + (fr_status == SAM_STAT_GOOD); |
| +} |
| + |
| static inline |
| void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req) |
| { |
| @@ -304,7 +328,9 @@ void zfcp_dbf_hba_fsf_response(struct zf |
| zfcp_dbf_hba_fsf_resp("fs_perr", 1, req); |
| |
| } else if (qtcb->header.fsf_status != FSF_GOOD) { |
| - zfcp_dbf_hba_fsf_resp("fs_ferr", 1, req); |
| + zfcp_dbf_hba_fsf_resp("fs_ferr", |
| + zfcp_dbf_hba_fsf_resp_suppress(req) |
| + ? 5 : 1, req); |
| |
| } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) || |
| (req->fsf_command == FSF_QTCB_OPEN_LUN)) { |
| --- a/drivers/s390/scsi/zfcp_fsf.h |
| +++ b/drivers/s390/scsi/zfcp_fsf.h |
| @@ -3,7 +3,7 @@ |
| * |
| * Interface to the FSF support functions. |
| * |
| - * Copyright IBM Corp. 2002, 2015 |
| + * Copyright IBM Corp. 2002, 2016 |
| */ |
| |
| #ifndef FSF_H |
| @@ -78,6 +78,7 @@ |
| #define FSF_APP_TAG_CHECK_FAILURE 0x00000082 |
| #define FSF_REF_TAG_CHECK_FAILURE 0x00000083 |
| #define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD |
| +#define FSF_FCP_RSP_AVAILABLE 0x000000AF |
| #define FSF_UNKNOWN_COMMAND 0x000000E2 |
| #define FSF_UNKNOWN_OP_SUBTYPE 0x000000E3 |
| #define FSF_INVALID_COMMAND_OPTION 0x000000E5 |