forked from Minki/linux
scsi: lpfc: Adjust CMF total bytes and rxmonitor
Calculate any extra bytes needed to account for timer accuracy. If we are less than LPFC_CMF_INTERVAL, then calculate the adjustment needed for total to reflect a full LPFC_CMF_INTERVAL. Add additional info to rxmonitor, and adjust some log formatting. Link: https://lore.kernel.org/r/20211204002644.116455-7-jsmart2021@gmail.com Co-developed-by: Justin Tee <justin.tee@broadcom.com> Signed-off-by: Justin Tee <justin.tee@broadcom.com> Signed-off-by: James Smart <jsmart2021@gmail.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
7dd2e2a923
commit
a6269f8370
@ -1602,6 +1602,7 @@ struct lpfc_hba {
|
||||
#define LPFC_MAX_RXMONITOR_ENTRY 800
|
||||
#define LPFC_MAX_RXMONITOR_DUMP 32
|
||||
struct rxtable_entry {
|
||||
uint64_t cmf_bytes; /* Total no of read bytes for CMF_SYNC_WQE */
|
||||
uint64_t total_bytes; /* Total no of read bytes requested */
|
||||
uint64_t rcv_bytes; /* Total no of read bytes completed */
|
||||
uint64_t avg_io_size;
|
||||
|
@ -5561,22 +5561,24 @@ lpfc_rx_monitor_read(struct file *file, char __user *buf, size_t nbytes,
|
||||
start = tail;
|
||||
|
||||
len += scnprintf(buffer + len, MAX_DEBUGFS_RX_TABLE_SIZE - len,
|
||||
" MaxBPI\t Total Data Cmd Total Data Cmpl "
|
||||
" Latency(us) Avg IO Size\tMax IO Size IO cnt "
|
||||
"Info BWutil(ms)\n");
|
||||
" MaxBPI Tot_Data_CMF Tot_Data_Cmd "
|
||||
"Tot_Data_Cmpl Lat(us) Avg_IO Max_IO "
|
||||
"Bsy IO_cnt Info BWutil(ms)\n");
|
||||
get_table:
|
||||
for (i = start; i < last; i++) {
|
||||
entry = &phba->rxtable[i];
|
||||
len += scnprintf(buffer + len, MAX_DEBUGFS_RX_TABLE_SIZE - len,
|
||||
"%3d:%12lld %12lld\t%12lld\t"
|
||||
"%8lldus\t%8lld\t%10lld "
|
||||
"%8d %2d %2d(%2d)\n",
|
||||
"%3d:%12lld %12lld %12lld %12lld "
|
||||
"%7lldus %8lld %7lld "
|
||||
"%2d %4d %2d %2d(%2d)\n",
|
||||
i, entry->max_bytes_per_interval,
|
||||
entry->cmf_bytes,
|
||||
entry->total_bytes,
|
||||
entry->rcv_bytes,
|
||||
entry->avg_io_latency,
|
||||
entry->avg_io_size,
|
||||
entry->max_read_cnt,
|
||||
entry->cmf_busy,
|
||||
entry->io_cnt,
|
||||
entry->cmf_info,
|
||||
entry->timer_utilization,
|
||||
|
@ -282,7 +282,7 @@ struct lpfc_idiag {
|
||||
void *ptr_private;
|
||||
};
|
||||
|
||||
#define MAX_DEBUGFS_RX_TABLE_SIZE (100 * LPFC_MAX_RXMONITOR_ENTRY)
|
||||
#define MAX_DEBUGFS_RX_TABLE_SIZE (128 * LPFC_MAX_RXMONITOR_ENTRY)
|
||||
struct lpfc_rx_monitor_debug {
|
||||
char *i_private;
|
||||
char *buffer;
|
||||
|
@ -5927,7 +5927,7 @@ lpfc_cmf_timer(struct hrtimer *timer)
|
||||
uint32_t io_cnt;
|
||||
uint32_t head, tail;
|
||||
uint32_t busy, max_read;
|
||||
uint64_t total, rcv, lat, mbpi, extra;
|
||||
uint64_t total, rcv, lat, mbpi, extra, cnt;
|
||||
int timer_interval = LPFC_CMF_INTERVAL;
|
||||
uint32_t ms;
|
||||
struct lpfc_cgn_stat *cgs;
|
||||
@ -5998,20 +5998,23 @@ lpfc_cmf_timer(struct hrtimer *timer)
|
||||
|
||||
/* Calculate any extra bytes needed to account for the
|
||||
* timer accuracy. If we are less than LPFC_CMF_INTERVAL
|
||||
* add an extra 3% slop factor, equal to LPFC_CMF_INTERVAL
|
||||
* add an extra 2%. The goal is to equalize total with a
|
||||
* time > LPFC_CMF_INTERVAL or <= LPFC_CMF_INTERVAL + 1
|
||||
* calculate the adjustment needed for total to reflect
|
||||
* a full LPFC_CMF_INTERVAL.
|
||||
*/
|
||||
if (ms == LPFC_CMF_INTERVAL)
|
||||
extra = div_u64(total, 50);
|
||||
else if (ms < LPFC_CMF_INTERVAL)
|
||||
extra = div_u64(total, 33);
|
||||
if (ms && ms < LPFC_CMF_INTERVAL) {
|
||||
cnt = div_u64(total, ms); /* bytes per ms */
|
||||
cnt *= LPFC_CMF_INTERVAL; /* what total should be */
|
||||
if (cnt > mbpi)
|
||||
cnt = mbpi;
|
||||
extra = cnt - total;
|
||||
}
|
||||
lpfc_issue_cmf_sync_wqe(phba, LPFC_CMF_INTERVAL, total + extra);
|
||||
} else {
|
||||
/* For Monitor mode or link down we want mbpi
|
||||
* to be the full link speed
|
||||
*/
|
||||
mbpi = phba->cmf_link_byte_count;
|
||||
extra = 0;
|
||||
}
|
||||
phba->cmf_timer_cnt++;
|
||||
|
||||
@ -6042,6 +6045,7 @@ lpfc_cmf_timer(struct hrtimer *timer)
|
||||
LPFC_RXMONITOR_TABLE_IN_USE);
|
||||
entry = &phba->rxtable[head];
|
||||
entry->total_bytes = total;
|
||||
entry->cmf_bytes = total + extra;
|
||||
entry->rcv_bytes = rcv;
|
||||
entry->cmf_busy = busy;
|
||||
entry->cmf_info = phba->cmf_active_info;
|
||||
|
Loading…
Reference in New Issue
Block a user