scsi: ufs: ufshpb: Rewind the read timeout on every read
authorAvri Altman <avri.altman@wdc.com>
Sun, 8 Aug 2021 09:00:21 +0000 (12:00 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 12 Aug 2021 02:25:36 +0000 (22:25 -0400)
The purpose of the "cold"-timer is not to hang-on to active regions with no
reads.  Therefore the read timeout should be rewound on every read, and not
just when the region is activated.

Link: https://lore.kernel.org/r/20210808090024.21721-2-avri.altman@wdc.com
Fixes: 13c044e91678 (scsi: ufs: ufshpb: Add "cold" regions timer)
Signed-off-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshpb.c

index d0eb14b..8e92c61 100644 (file)
@@ -178,9 +178,19 @@ next_srgn:
                set_bit_len = cnt;
 
        spin_lock_irqsave(&hpb->rgn_state_lock, flags);
-       if (set_dirty && rgn->rgn_state != HPB_RGN_INACTIVE &&
-           srgn->srgn_state == HPB_SRGN_VALID)
-               bitmap_set(srgn->mctx->ppn_dirty, srgn_offset, set_bit_len);
+       if (rgn->rgn_state != HPB_RGN_INACTIVE) {
+               if (set_dirty) {
+                       if (srgn->srgn_state == HPB_SRGN_VALID)
+                               bitmap_set(srgn->mctx->ppn_dirty, srgn_offset,
+                                          set_bit_len);
+               } else if (hpb->is_hcm) {
+                        /* rewind the read timer for lru regions */
+                       rgn->read_timeout = ktime_add_ms(ktime_get(),
+                                       rgn->hpb->params.read_timeout_ms);
+                       rgn->read_timeout_expiries =
+                               rgn->hpb->params.read_timeout_expiries;
+               }
+       }
        spin_unlock_irqrestore(&hpb->rgn_state_lock, flags);
 
        if (hpb->is_hcm && prev_srgn != srgn) {