Skip to content

Commit

Permalink
scsi: ufs: ufshpb: Make eviction depend on region's reads
Browse files Browse the repository at this point in the history
In host mode, eviction is considered an extreme measure. Verify that the
entering region has enough reads, and the exiting region has fewer reads.

Link: https://lore.kernel.org/r/20210712095039.8093-6-avri.altman@wdc.com
Reviewed-by: Daejun Park <daejun7.park@samsung.com>
Signed-off-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Avri Altman authored and Martin K. Petersen committed Aug 1, 2021
1 parent c76a188 commit 6c59cb5
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion drivers/scsi/ufs/ufshpb.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "../sd.h"

#define ACTIVATION_THRESHOLD 8 /* 8 IOs */
#define EVICTION_THRESHOLD (ACTIVATION_THRESHOLD << 5) /* 256 IOs */

/* memory management */
static struct kmem_cache *ufshpb_mctx_cache;
Expand Down Expand Up @@ -1056,6 +1057,13 @@ static struct ufshpb_region *ufshpb_victim_lru_info(struct ufshpb_lu *hpb)
if (ufshpb_check_srgns_issue_state(hpb, rgn))
continue;

/*
* in host control mode, verify that the exiting region
* has fewer reads
*/
if (hpb->is_hcm && rgn->reads > (EVICTION_THRESHOLD >> 1))
continue;

victim_rgn = rgn;
break;
}
Expand Down Expand Up @@ -1223,7 +1231,7 @@ static int ufshpb_issue_map_req(struct ufshpb_lu *hpb,

static int ufshpb_add_region(struct ufshpb_lu *hpb, struct ufshpb_region *rgn)
{
struct ufshpb_region *victim_rgn;
struct ufshpb_region *victim_rgn = NULL;
struct victim_select_info *lru_info = &hpb->lru_info;
unsigned long flags;
int ret = 0;
Expand All @@ -1250,7 +1258,15 @@ static int ufshpb_add_region(struct ufshpb_lu *hpb, struct ufshpb_region *rgn)
* It is okay to evict the least recently used region,
* because the device could detect this region
* by not issuing HPB_READ
*
* in host control mode, verify that the entering
* region has enough reads
*/
if (hpb->is_hcm && rgn->reads < EVICTION_THRESHOLD) {
ret = -EACCES;
goto out;
}

victim_rgn = ufshpb_victim_lru_info(hpb);
if (!victim_rgn) {
dev_warn(&hpb->sdev_ufs_lu->sdev_dev,
Expand Down

0 comments on commit 6c59cb5

Please sign in to comment.