mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 23:27:06 +00:00
scsi: ufs: ufshpb: Make eviction depend on region's reads
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>
This commit is contained in:
parent
c76a188856
commit
6c59cb501b
1 changed files with 17 additions and 1 deletions
|
@ -17,6 +17,7 @@
|
||||||
#include "../sd.h"
|
#include "../sd.h"
|
||||||
|
|
||||||
#define ACTIVATION_THRESHOLD 8 /* 8 IOs */
|
#define ACTIVATION_THRESHOLD 8 /* 8 IOs */
|
||||||
|
#define EVICTION_THRESHOLD (ACTIVATION_THRESHOLD << 5) /* 256 IOs */
|
||||||
|
|
||||||
/* memory management */
|
/* memory management */
|
||||||
static struct kmem_cache *ufshpb_mctx_cache;
|
static struct kmem_cache *ufshpb_mctx_cache;
|
||||||
|
@ -1056,6 +1057,13 @@ static struct ufshpb_region *ufshpb_victim_lru_info(struct ufshpb_lu *hpb)
|
||||||
if (ufshpb_check_srgns_issue_state(hpb, rgn))
|
if (ufshpb_check_srgns_issue_state(hpb, rgn))
|
||||||
continue;
|
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;
|
victim_rgn = rgn;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
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;
|
struct victim_select_info *lru_info = &hpb->lru_info;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -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,
|
* It is okay to evict the least recently used region,
|
||||||
* because the device could detect this region
|
* because the device could detect this region
|
||||||
* by not issuing HPB_READ
|
* 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);
|
victim_rgn = ufshpb_victim_lru_info(hpb);
|
||||||
if (!victim_rgn) {
|
if (!victim_rgn) {
|
||||||
dev_warn(&hpb->sdev_ufs_lu->sdev_dev,
|
dev_warn(&hpb->sdev_ufs_lu->sdev_dev,
|
||||||
|
|
Loading…
Reference in a new issue