mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-17 22:05:08 +00:00
scsi: fc: Add FPIN statistics to fc_host and fc_rport objects
Add a structure for holding FPIN statistics, for host & rport respectively, and add associated sysfs nodes: /sys/class/fc_host/hostXX/statistics/ /sys/class/fc_remote_ports/rport-XX\:Y-Z/statistics/ Link: https://lore.kernel.org/r/20201021092715.22669-3-njavali@marvell.com Reviewed-by: James Smart <james.smart@broadcom.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Shyam Sundar <ssundar@marvell.com> Signed-off-by: Nilesh Javali <njavali@marvell.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
874163aab7
commit
547aab51a9
@ -22,6 +22,7 @@
|
|||||||
#include <net/netlink.h>
|
#include <net/netlink.h>
|
||||||
#include <scsi/scsi_netlink_fc.h>
|
#include <scsi/scsi_netlink_fc.h>
|
||||||
#include <scsi/scsi_bsg_fc.h>
|
#include <scsi/scsi_bsg_fc.h>
|
||||||
|
#include <uapi/scsi/fc/fc_els.h>
|
||||||
#include "scsi_priv.h"
|
#include "scsi_priv.h"
|
||||||
|
|
||||||
static int fc_queue_work(struct Scsi_Host *, struct work_struct *);
|
static int fc_queue_work(struct Scsi_Host *, struct work_struct *);
|
||||||
@ -419,6 +420,7 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,
|
|||||||
fc_host->fabric_name = -1;
|
fc_host->fabric_name = -1;
|
||||||
memset(fc_host->symbolic_name, 0, sizeof(fc_host->symbolic_name));
|
memset(fc_host->symbolic_name, 0, sizeof(fc_host->symbolic_name));
|
||||||
memset(fc_host->system_hostname, 0, sizeof(fc_host->system_hostname));
|
memset(fc_host->system_hostname, 0, sizeof(fc_host->system_hostname));
|
||||||
|
memset(&fc_host->fpin_stats, 0, sizeof(fc_host->fpin_stats));
|
||||||
|
|
||||||
fc_host->tgtid_bind_type = FC_TGTID_BIND_BY_WWPN;
|
fc_host->tgtid_bind_type = FC_TGTID_BIND_BY_WWPN;
|
||||||
|
|
||||||
@ -991,6 +993,67 @@ store_fc_rport_fast_io_fail_tmo(struct device *dev,
|
|||||||
static FC_DEVICE_ATTR(rport, fast_io_fail_tmo, S_IRUGO | S_IWUSR,
|
static FC_DEVICE_ATTR(rport, fast_io_fail_tmo, S_IRUGO | S_IWUSR,
|
||||||
show_fc_rport_fast_io_fail_tmo, store_fc_rport_fast_io_fail_tmo);
|
show_fc_rport_fast_io_fail_tmo, store_fc_rport_fast_io_fail_tmo);
|
||||||
|
|
||||||
|
#define fc_rport_fpin_statistic(name) \
|
||||||
|
static ssize_t fc_rport_fpinstat_##name(struct device *cd, \
|
||||||
|
struct device_attribute *attr, \
|
||||||
|
char *buf) \
|
||||||
|
{ \
|
||||||
|
struct fc_rport *rport = transport_class_to_rport(cd); \
|
||||||
|
\
|
||||||
|
return snprintf(buf, 20, "0x%llx\n", rport->fpin_stats.name); \
|
||||||
|
} \
|
||||||
|
static FC_DEVICE_ATTR(rport, fpin_##name, 0444, fc_rport_fpinstat_##name, NULL)
|
||||||
|
|
||||||
|
fc_rport_fpin_statistic(dn);
|
||||||
|
fc_rport_fpin_statistic(dn_unknown);
|
||||||
|
fc_rport_fpin_statistic(dn_timeout);
|
||||||
|
fc_rport_fpin_statistic(dn_unable_to_route);
|
||||||
|
fc_rport_fpin_statistic(dn_device_specific);
|
||||||
|
fc_rport_fpin_statistic(cn);
|
||||||
|
fc_rport_fpin_statistic(cn_clear);
|
||||||
|
fc_rport_fpin_statistic(cn_lost_credit);
|
||||||
|
fc_rport_fpin_statistic(cn_credit_stall);
|
||||||
|
fc_rport_fpin_statistic(cn_oversubscription);
|
||||||
|
fc_rport_fpin_statistic(cn_device_specific);
|
||||||
|
fc_rport_fpin_statistic(li);
|
||||||
|
fc_rport_fpin_statistic(li_failure_unknown);
|
||||||
|
fc_rport_fpin_statistic(li_link_failure_count);
|
||||||
|
fc_rport_fpin_statistic(li_loss_of_sync_count);
|
||||||
|
fc_rport_fpin_statistic(li_loss_of_signals_count);
|
||||||
|
fc_rport_fpin_statistic(li_prim_seq_err_count);
|
||||||
|
fc_rport_fpin_statistic(li_invalid_tx_word_count);
|
||||||
|
fc_rport_fpin_statistic(li_invalid_crc_count);
|
||||||
|
fc_rport_fpin_statistic(li_device_specific);
|
||||||
|
|
||||||
|
static struct attribute *fc_rport_statistics_attrs[] = {
|
||||||
|
&device_attr_rport_fpin_dn.attr,
|
||||||
|
&device_attr_rport_fpin_dn_unknown.attr,
|
||||||
|
&device_attr_rport_fpin_dn_timeout.attr,
|
||||||
|
&device_attr_rport_fpin_dn_unable_to_route.attr,
|
||||||
|
&device_attr_rport_fpin_dn_device_specific.attr,
|
||||||
|
&device_attr_rport_fpin_li.attr,
|
||||||
|
&device_attr_rport_fpin_li_failure_unknown.attr,
|
||||||
|
&device_attr_rport_fpin_li_link_failure_count.attr,
|
||||||
|
&device_attr_rport_fpin_li_loss_of_sync_count.attr,
|
||||||
|
&device_attr_rport_fpin_li_loss_of_signals_count.attr,
|
||||||
|
&device_attr_rport_fpin_li_prim_seq_err_count.attr,
|
||||||
|
&device_attr_rport_fpin_li_invalid_tx_word_count.attr,
|
||||||
|
&device_attr_rport_fpin_li_invalid_crc_count.attr,
|
||||||
|
&device_attr_rport_fpin_li_device_specific.attr,
|
||||||
|
&device_attr_rport_fpin_cn.attr,
|
||||||
|
&device_attr_rport_fpin_cn_clear.attr,
|
||||||
|
&device_attr_rport_fpin_cn_lost_credit.attr,
|
||||||
|
&device_attr_rport_fpin_cn_credit_stall.attr,
|
||||||
|
&device_attr_rport_fpin_cn_oversubscription.attr,
|
||||||
|
&device_attr_rport_fpin_cn_device_specific.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group fc_rport_statistics_group = {
|
||||||
|
.name = "statistics",
|
||||||
|
.attrs = fc_rport_statistics_attrs,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FC SCSI Target Attribute Management
|
* FC SCSI Target Attribute Management
|
||||||
@ -1745,6 +1808,39 @@ fc_host_statistic(fc_xid_busy);
|
|||||||
fc_host_statistic(fc_seq_not_found);
|
fc_host_statistic(fc_seq_not_found);
|
||||||
fc_host_statistic(fc_non_bls_resp);
|
fc_host_statistic(fc_non_bls_resp);
|
||||||
|
|
||||||
|
#define fc_host_fpin_statistic(name) \
|
||||||
|
static ssize_t fc_host_fpinstat_##name(struct device *cd, \
|
||||||
|
struct device_attribute *attr, \
|
||||||
|
char *buf) \
|
||||||
|
{ \
|
||||||
|
struct Scsi_Host *shost = transport_class_to_shost(cd); \
|
||||||
|
struct fc_host_attrs *fc_host = shost_to_fc_host(shost); \
|
||||||
|
\
|
||||||
|
return snprintf(buf, 20, "0x%llx\n", fc_host->fpin_stats.name); \
|
||||||
|
} \
|
||||||
|
static FC_DEVICE_ATTR(host, fpin_##name, 0444, fc_host_fpinstat_##name, NULL)
|
||||||
|
|
||||||
|
fc_host_fpin_statistic(dn);
|
||||||
|
fc_host_fpin_statistic(dn_unknown);
|
||||||
|
fc_host_fpin_statistic(dn_timeout);
|
||||||
|
fc_host_fpin_statistic(dn_unable_to_route);
|
||||||
|
fc_host_fpin_statistic(dn_device_specific);
|
||||||
|
fc_host_fpin_statistic(cn);
|
||||||
|
fc_host_fpin_statistic(cn_clear);
|
||||||
|
fc_host_fpin_statistic(cn_lost_credit);
|
||||||
|
fc_host_fpin_statistic(cn_credit_stall);
|
||||||
|
fc_host_fpin_statistic(cn_oversubscription);
|
||||||
|
fc_host_fpin_statistic(cn_device_specific);
|
||||||
|
fc_host_fpin_statistic(li);
|
||||||
|
fc_host_fpin_statistic(li_failure_unknown);
|
||||||
|
fc_host_fpin_statistic(li_link_failure_count);
|
||||||
|
fc_host_fpin_statistic(li_loss_of_sync_count);
|
||||||
|
fc_host_fpin_statistic(li_loss_of_signals_count);
|
||||||
|
fc_host_fpin_statistic(li_prim_seq_err_count);
|
||||||
|
fc_host_fpin_statistic(li_invalid_tx_word_count);
|
||||||
|
fc_host_fpin_statistic(li_invalid_crc_count);
|
||||||
|
fc_host_fpin_statistic(li_device_specific);
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
fc_reset_statistics(struct device *dev, struct device_attribute *attr,
|
fc_reset_statistics(struct device *dev, struct device_attribute *attr,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
@ -1794,6 +1890,26 @@ static struct attribute *fc_statistics_attrs[] = {
|
|||||||
&device_attr_host_fc_seq_not_found.attr,
|
&device_attr_host_fc_seq_not_found.attr,
|
||||||
&device_attr_host_fc_non_bls_resp.attr,
|
&device_attr_host_fc_non_bls_resp.attr,
|
||||||
&device_attr_host_reset_statistics.attr,
|
&device_attr_host_reset_statistics.attr,
|
||||||
|
&device_attr_host_fpin_dn.attr,
|
||||||
|
&device_attr_host_fpin_dn_unknown.attr,
|
||||||
|
&device_attr_host_fpin_dn_timeout.attr,
|
||||||
|
&device_attr_host_fpin_dn_unable_to_route.attr,
|
||||||
|
&device_attr_host_fpin_dn_device_specific.attr,
|
||||||
|
&device_attr_host_fpin_li.attr,
|
||||||
|
&device_attr_host_fpin_li_failure_unknown.attr,
|
||||||
|
&device_attr_host_fpin_li_link_failure_count.attr,
|
||||||
|
&device_attr_host_fpin_li_loss_of_sync_count.attr,
|
||||||
|
&device_attr_host_fpin_li_loss_of_signals_count.attr,
|
||||||
|
&device_attr_host_fpin_li_prim_seq_err_count.attr,
|
||||||
|
&device_attr_host_fpin_li_invalid_tx_word_count.attr,
|
||||||
|
&device_attr_host_fpin_li_invalid_crc_count.attr,
|
||||||
|
&device_attr_host_fpin_li_device_specific.attr,
|
||||||
|
&device_attr_host_fpin_cn.attr,
|
||||||
|
&device_attr_host_fpin_cn_clear.attr,
|
||||||
|
&device_attr_host_fpin_cn_lost_credit.attr,
|
||||||
|
&device_attr_host_fpin_cn_credit_stall.attr,
|
||||||
|
&device_attr_host_fpin_cn_oversubscription.attr,
|
||||||
|
&device_attr_host_fpin_cn_device_specific.attr,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2177,6 +2293,7 @@ fc_attach_transport(struct fc_function_template *ft)
|
|||||||
i->rport_attr_cont.ac.attrs = &i->rport_attrs[0];
|
i->rport_attr_cont.ac.attrs = &i->rport_attrs[0];
|
||||||
i->rport_attr_cont.ac.class = &fc_rport_class.class;
|
i->rport_attr_cont.ac.class = &fc_rport_class.class;
|
||||||
i->rport_attr_cont.ac.match = fc_rport_match;
|
i->rport_attr_cont.ac.match = fc_rport_match;
|
||||||
|
i->rport_attr_cont.statistics = &fc_rport_statistics_group;
|
||||||
transport_container_register(&i->rport_attr_cont);
|
transport_container_register(&i->rport_attr_cont);
|
||||||
|
|
||||||
i->vport_attr_cont.ac.attrs = &i->vport_attrs[0];
|
i->vport_attr_cont.ac.attrs = &i->vport_attrs[0];
|
||||||
|
@ -285,6 +285,36 @@ struct fc_rport_identifiers {
|
|||||||
u32 roles;
|
u32 roles;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fabric Performance Impact Notification Statistics
|
||||||
|
*/
|
||||||
|
struct fc_fpin_stats {
|
||||||
|
/* Delivery */
|
||||||
|
u64 dn;
|
||||||
|
u64 dn_unknown;
|
||||||
|
u64 dn_timeout;
|
||||||
|
u64 dn_unable_to_route;
|
||||||
|
u64 dn_device_specific;
|
||||||
|
|
||||||
|
/* Link Integrity */
|
||||||
|
u64 li;
|
||||||
|
u64 li_failure_unknown;
|
||||||
|
u64 li_link_failure_count;
|
||||||
|
u64 li_loss_of_sync_count;
|
||||||
|
u64 li_loss_of_signals_count;
|
||||||
|
u64 li_prim_seq_err_count;
|
||||||
|
u64 li_invalid_tx_word_count;
|
||||||
|
u64 li_invalid_crc_count;
|
||||||
|
u64 li_device_specific;
|
||||||
|
|
||||||
|
/* Congestion/Peer Congestion */
|
||||||
|
u64 cn;
|
||||||
|
u64 cn_clear;
|
||||||
|
u64 cn_lost_credit;
|
||||||
|
u64 cn_credit_stall;
|
||||||
|
u64 cn_oversubscription;
|
||||||
|
u64 cn_device_specific;
|
||||||
|
};
|
||||||
|
|
||||||
/* Macro for use in defining Remote Port attributes */
|
/* Macro for use in defining Remote Port attributes */
|
||||||
#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
|
#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
|
||||||
@ -326,6 +356,7 @@ struct fc_rport { /* aka fc_starget_attrs */
|
|||||||
|
|
||||||
/* Dynamic Attributes */
|
/* Dynamic Attributes */
|
||||||
u32 dev_loss_tmo; /* Remote Port loss timeout in seconds. */
|
u32 dev_loss_tmo; /* Remote Port loss timeout in seconds. */
|
||||||
|
struct fc_fpin_stats fpin_stats;
|
||||||
|
|
||||||
/* Private (Transport-managed) Attributes */
|
/* Private (Transport-managed) Attributes */
|
||||||
u64 node_name;
|
u64 node_name;
|
||||||
@ -516,6 +547,7 @@ struct fc_host_attrs {
|
|||||||
char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
|
char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
|
||||||
char system_hostname[FC_SYMBOLIC_NAME_SIZE];
|
char system_hostname[FC_SYMBOLIC_NAME_SIZE];
|
||||||
u32 dev_loss_tmo;
|
u32 dev_loss_tmo;
|
||||||
|
struct fc_fpin_stats fpin_stats;
|
||||||
|
|
||||||
/* Private (Transport-managed) Attributes */
|
/* Private (Transport-managed) Attributes */
|
||||||
enum fc_tgtid_binding_type tgtid_bind_type;
|
enum fc_tgtid_binding_type tgtid_bind_type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user