scsi: lpfc: use monotonic timestamps for statistics
authorArnd Bergmann <arnd@arndb.de>
Mon, 18 Jun 2018 15:28:23 +0000 (17:28 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 26 Jun 2018 16:00:27 +0000 (12:00 -0400)
The get_seconds() function suffers from a possible overflow in 2038 or
2106, as well as jitter due to settimeofday or leap second updates, and is
deprecated.

As we are interested in elapsed time only, using ktime_get_seconds() to
read the CLOCK_MONOTONIC timebase is ideal here. This also lets us remove
the hack that tries to deal with get_seconds() going slightly backwards,
which cannot happen with montonic timestamps.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/lpfc/lpfc_sli.h

index 729d343861f44f588a28875a98b9a201d82b0b54..15c07481fe233910978e144ff533d19f560c6bed 100644 (file)
@@ -5891,7 +5891,6 @@ lpfc_get_stats(struct Scsi_Host *shost)
        struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets;
        LPFC_MBOXQ_t *pmboxq;
        MAILBOX_t *pmb;
-       unsigned long seconds;
        int rc = 0;
 
        /*
@@ -5992,12 +5991,7 @@ lpfc_get_stats(struct Scsi_Host *shost)
 
        hs->dumped_frames = -1;
 
-       seconds = get_seconds();
-       if (seconds < psli->stats_start)
-               hs->seconds_since_last_reset = seconds +
-                               ((unsigned long)-1 - psli->stats_start);
-       else
-               hs->seconds_since_last_reset = seconds - psli->stats_start;
+       hs->seconds_since_last_reset = ktime_get_seconds() - psli->stats_start;
 
        mempool_free(pmboxq, phba->mbox_mem_pool);
 
@@ -6076,7 +6070,7 @@ lpfc_reset_stats(struct Scsi_Host *shost)
        else
                lso->link_events = (phba->fc_eventTag >> 1);
 
-       psli->stats_start = get_seconds();
+       psli->stats_start = ktime_get_seconds();
 
        mempool_free(pmboxq, phba->mbox_mem_pool);
 
index 6f3c00a233ecdde57e42100c8a1a83ba94a631b3..e6786a5db50233192554837e4603363710b30f8b 100644 (file)
@@ -4591,7 +4591,7 @@ lpfc_sli_brdrestart_s3(struct lpfc_hba *phba)
        spin_unlock_irq(&phba->hbalock);
 
        memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets));
-       psli->stats_start = get_seconds();
+       psli->stats_start = ktime_get_seconds();
 
        /* Give the INITFF and Post time to settle. */
        mdelay(100);
@@ -4638,7 +4638,7 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
        spin_unlock_irq(&phba->hbalock);
 
        memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets));
-       psli->stats_start = get_seconds();
+       psli->stats_start = ktime_get_seconds();
 
        /* Reset HBA AER if it was enabled, note hba_flag was reset above */
        if (hba_aer_enabled)
index 431754195505d04bb75087c80751d00b3408ee0a..80b191d7319007403779af914a37ce745e3d75d4 100644 (file)
@@ -339,7 +339,7 @@ struct lpfc_sli {
        struct lpfc_iocbq ** iocbq_lookup; /* array to lookup IOCB by IOTAG */
        size_t iocbq_lookup_len;           /* current lengs of the array */
        uint16_t  last_iotag;              /* last allocated IOTAG */
-       unsigned long  stats_start;        /* in seconds */
+       time64_t  stats_start;             /* in seconds */
        struct lpfc_lnk_stat lnk_stat_offsets;
 };