scsi: lpfc: Adjust CMF total bytes and rxmonitor
authorJames Smart <jsmart2021@gmail.com>
Sat, 4 Dec 2021 00:26:41 +0000 (16:26 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Nov 2022 17:15:23 +0000 (18:15 +0100)
[ Upstream commit a6269f837045acb02904f31f05acde847ec8f8a7 ]

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>
Stable-dep-of: bd269188ea94 ("scsi: lpfc: Rework MIB Rx Monitor debug info logic")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_debugfs.c
drivers/scsi/lpfc/lpfc_debugfs.h
drivers/scsi/lpfc/lpfc_init.c

index b2508a0..9244833 100644 (file)
@@ -1611,6 +1611,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;
index 79bc86b..61f8dcd 100644 (file)
@@ -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,
index a5bf71b..6dd361c 100644 (file)
@@ -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;
index 38bd58f..5dad0b0 100644 (file)
@@ -5870,7 +5870,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;
@@ -5941,20 +5941,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++;
 
@@ -5985,6 +5988,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;