0001
0002
0003
0004 #ifndef __SNIC_STATS_H
0005 #define __SNIC_STATS_H
0006
0007 struct snic_io_stats {
0008 atomic64_t active;
0009 atomic64_t max_active;
0010 atomic64_t max_sgl;
0011 atomic64_t max_time;
0012 atomic64_t max_qtime;
0013 atomic64_t max_cmpl_time;
0014 atomic64_t sgl_cnt[SNIC_MAX_SG_DESC_CNT];
0015 atomic64_t max_io_sz;
0016 atomic64_t compl;
0017 atomic64_t fail;
0018 atomic64_t req_null;
0019 atomic64_t alloc_fail;
0020 atomic64_t sc_null;
0021 atomic64_t io_not_found;
0022 atomic64_t num_ios;
0023 };
0024
0025 struct snic_abort_stats {
0026 atomic64_t num;
0027 atomic64_t fail;
0028 atomic64_t drv_tmo;
0029 atomic64_t fw_tmo;
0030 atomic64_t io_not_found;
0031 atomic64_t q_fail;
0032 };
0033
0034 struct snic_reset_stats {
0035 atomic64_t dev_resets;
0036 atomic64_t dev_reset_fail;
0037 atomic64_t dev_reset_aborts;
0038 atomic64_t dev_reset_tmo;
0039 atomic64_t dev_reset_terms;
0040 atomic64_t hba_resets;
0041 atomic64_t hba_reset_cmpl;
0042 atomic64_t hba_reset_fail;
0043 atomic64_t snic_resets;
0044 atomic64_t snic_reset_compl;
0045 atomic64_t snic_reset_fail;
0046 };
0047
0048 struct snic_fw_stats {
0049 atomic64_t actv_reqs;
0050 atomic64_t max_actv_reqs;
0051 atomic64_t out_of_res;
0052 atomic64_t io_errs;
0053 atomic64_t scsi_errs;
0054 };
0055
0056 struct snic_misc_stats {
0057 u64 last_isr_time;
0058 u64 last_ack_time;
0059 atomic64_t ack_isr_cnt;
0060 atomic64_t cmpl_isr_cnt;
0061 atomic64_t errnotify_isr_cnt;
0062 atomic64_t max_cq_ents;
0063 atomic64_t data_cnt_mismat;
0064 atomic64_t io_tmo;
0065 atomic64_t io_aborted;
0066 atomic64_t sgl_inval;
0067 atomic64_t abts_wq_alloc_fail;
0068 atomic64_t devrst_wq_alloc_fail;
0069 atomic64_t wq_alloc_fail;
0070 atomic64_t no_icmnd_itmf_cmpls;
0071 atomic64_t io_under_run;
0072 atomic64_t qfull;
0073 atomic64_t qsz_rampup;
0074 atomic64_t qsz_rampdown;
0075 atomic64_t last_qsz;
0076 atomic64_t tgt_not_rdy;
0077 };
0078
0079 struct snic_stats {
0080 struct snic_io_stats io;
0081 struct snic_abort_stats abts;
0082 struct snic_reset_stats reset;
0083 struct snic_fw_stats fw;
0084 struct snic_misc_stats misc;
0085 atomic64_t io_cmpl_skip;
0086 };
0087
0088 void snic_stats_debugfs_init(struct snic *);
0089 void snic_stats_debugfs_remove(struct snic *);
0090
0091
0092 static inline void
0093 snic_stats_update_active_ios(struct snic_stats *s_stats)
0094 {
0095 struct snic_io_stats *io = &s_stats->io;
0096 int nr_active_ios;
0097
0098 nr_active_ios = atomic64_read(&io->active);
0099 if (atomic64_read(&io->max_active) < nr_active_ios)
0100 atomic64_set(&io->max_active, nr_active_ios);
0101
0102 atomic64_inc(&io->num_ios);
0103 }
0104
0105
0106 static inline void
0107 snic_stats_update_io_cmpl(struct snic_stats *s_stats)
0108 {
0109 atomic64_dec(&s_stats->io.active);
0110 if (unlikely(atomic64_read(&s_stats->io_cmpl_skip)))
0111 atomic64_dec(&s_stats->io_cmpl_skip);
0112 else
0113 atomic64_inc(&s_stats->io.compl);
0114 }
0115 #endif