Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /* Copyright 2014 Cisco Systems, Inc.  All rights reserved. */
0003 
0004 #ifndef __SNIC_STATS_H
0005 #define __SNIC_STATS_H
0006 
0007 struct snic_io_stats {
0008     atomic64_t active;      /* Active IOs */
0009     atomic64_t max_active;      /* Max # active IOs */
0010     atomic64_t max_sgl;     /* Max # SGLs for any IO */
0011     atomic64_t max_time;        /* Max time to process IO */
0012     atomic64_t max_qtime;       /* Max time to Queue the IO */
0013     atomic64_t max_cmpl_time;   /* Max time to complete the IO */
0014     atomic64_t sgl_cnt[SNIC_MAX_SG_DESC_CNT]; /* SGL Counters */
0015     atomic64_t max_io_sz;       /* Max IO Size */
0016     atomic64_t compl;       /* IO Completions */
0017     atomic64_t fail;        /* IO Failures */
0018     atomic64_t req_null;        /* req or req info is NULL */
0019     atomic64_t alloc_fail;      /* Alloc Failures */
0020     atomic64_t sc_null;
0021     atomic64_t io_not_found;    /* IO Not Found */
0022     atomic64_t num_ios;     /* Number of IOs */
0023 };
0024 
0025 struct snic_abort_stats {
0026     atomic64_t num;     /* Abort counter */
0027     atomic64_t fail;    /* Abort Failure Counter */
0028     atomic64_t drv_tmo; /* Abort Driver Timeouts */
0029     atomic64_t fw_tmo;  /* Abort Firmware Timeouts */
0030     atomic64_t io_not_found;/* Abort IO Not Found */
0031     atomic64_t q_fail;  /* Abort Queuing Failed */
0032 };
0033 
0034 struct snic_reset_stats {
0035     atomic64_t dev_resets;      /* Device Reset Counter */
0036     atomic64_t dev_reset_fail;  /* Device Reset Failures */
0037     atomic64_t dev_reset_aborts;    /* Device Reset Aborts */
0038     atomic64_t dev_reset_tmo;   /* Device Reset Timeout */
0039     atomic64_t dev_reset_terms; /* Device Reset terminate */
0040     atomic64_t hba_resets;      /* hba/firmware resets */
0041     atomic64_t hba_reset_cmpl;  /* hba/firmware reset completions */
0042     atomic64_t hba_reset_fail;  /* hba/firmware failures */
0043     atomic64_t snic_resets;     /* snic resets */
0044     atomic64_t snic_reset_compl;    /* snic reset completions */
0045     atomic64_t snic_reset_fail; /* snic reset failures */
0046 };
0047 
0048 struct snic_fw_stats {
0049     atomic64_t actv_reqs;       /* Active Requests */
0050     atomic64_t max_actv_reqs;   /* Max Active Requests */
0051     atomic64_t out_of_res;      /* Firmware Out Of Resources */
0052     atomic64_t io_errs;     /* Firmware IO Firmware Errors */
0053     atomic64_t scsi_errs;       /* Target hits check condition */
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;     /* Max CQ Entries */
0063     atomic64_t data_cnt_mismat; /* Data Count Mismatch */
0064     atomic64_t io_tmo;
0065     atomic64_t io_aborted;
0066     atomic64_t sgl_inval;       /* SGL Invalid */
0067     atomic64_t abts_wq_alloc_fail;  /* Abort Path WQ desc alloc failure */
0068     atomic64_t devrst_wq_alloc_fail;/* Device Reset - WQ desc alloc fail */
0069     atomic64_t wq_alloc_fail;   /* IO WQ desc alloc failure */
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 /* Auxillary function to update active IO counter */
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 /* Auxillary function to update IO completion counter */
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 /* __SNIC_STATS_H */