FROMLIST: scsi: ufs: Eviction in HCM
In host mode, eviction is considered an extreme measure. verify that the entering region has enough reads, and the exiting region has much less reads. Bug: 183467926 Bug: 170940265 Bug: 183454255 Link: https://lore.kernel.org/lkml/20210607061401.58884-6-avri.altman@wdc.com/ Signed-off-by: Avri Altman <avri.altman@wdc.com> Change-Id: Ia08e3af69302c4f0474efa7c616832dde48df4e0
This commit is contained in:
@@ -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;
|
||||||
@@ -1057,6 +1058,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 less reads
|
||||||
|
*/
|
||||||
|
if (hpb->is_hcm && rgn->reads > (EVICTION_THRESHOLD >> 1))
|
||||||
|
continue;
|
||||||
|
|
||||||
victim_rgn = rgn;
|
victim_rgn = rgn;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1223,7 +1231,7 @@ unlock_out:
|
|||||||
|
|
||||||
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,
|
||||||
|
Reference in New Issue
Block a user