aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenpaging
diff options
context:
space:
mode:
Diffstat (limited to 'tools/xenpaging')
-rw-r--r--tools/xenpaging/policy.h2
-rw-r--r--tools/xenpaging/policy_default.c27
-rw-r--r--tools/xenpaging/xenpaging.c11
3 files changed, 35 insertions, 5 deletions
diff --git a/tools/xenpaging/policy.h b/tools/xenpaging/policy.h
index 18a92569ca..458ed27ce5 100644
--- a/tools/xenpaging/policy.h
+++ b/tools/xenpaging/policy.h
@@ -32,6 +32,8 @@ int policy_init(xenpaging_t *paging);
int policy_choose_victim(xenpaging_t *paging, xenpaging_victim_t *victim);
void policy_notify_paged_out(unsigned long gfn);
void policy_notify_paged_in(unsigned long gfn);
+void policy_notify_paged_in_nomru(unsigned long gfn);
+void policy_notify_dropped(unsigned long gfn);
#endif // __XEN_PAGING_POLICY_H__
diff --git a/tools/xenpaging/policy_default.c b/tools/xenpaging/policy_default.c
index 0285d0dd8a..e555ed4e59 100644
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -57,7 +57,7 @@ int policy_init(xenpaging_t *paging)
if ( paging->policy_mru_size > 0 )
mru_size = paging->policy_mru_size;
else
- mru_size = DEFAULT_MRU_SIZE;
+ mru_size = paging->policy_mru_size = DEFAULT_MRU_SIZE;
mru = malloc(sizeof(*mru) * mru_size);
if ( mru == NULL )
@@ -120,17 +120,38 @@ void policy_notify_paged_out(unsigned long gfn)
clear_bit(gfn, unconsumed);
}
-void policy_notify_paged_in(unsigned long gfn)
+static void policy_handle_paged_in(unsigned long gfn, int do_mru)
{
unsigned long old_gfn = mru[i_mru & (mru_size - 1)];
if ( old_gfn != INVALID_MFN )
clear_bit(old_gfn, bitmap);
- mru[i_mru & (mru_size - 1)] = gfn;
+ if (do_mru) {
+ mru[i_mru & (mru_size - 1)] = gfn;
+ } else {
+ clear_bit(gfn, bitmap);
+ mru[i_mru & (mru_size - 1)] = INVALID_MFN;
+ }
+
i_mru++;
}
+void policy_notify_paged_in(unsigned long gfn)
+{
+ policy_handle_paged_in(gfn, 1);
+}
+
+void policy_notify_paged_in_nomru(unsigned long gfn)
+{
+ policy_handle_paged_in(gfn, 0);
+}
+
+void policy_notify_dropped(unsigned long gfn)
+{
+ clear_bit(gfn, bitmap);
+}
+
/*
* Local variables:
diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c
index f6cd05f700..8f9f52d1e0 100644
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -615,7 +615,14 @@ static int xenpaging_resume_page(xenpaging_t *paging, mem_event_response_t *rsp,
/* Notify policy of page being paged in */
if ( notify_policy )
{
- policy_notify_paged_in(rsp->gfn);
+ /*
+ * Do not add gfn to mru list if the target is lower than mru size.
+ * This allows page-out of these gfns if the target grows again.
+ */
+ if (paging->num_paged_out > paging->policy_mru_size)
+ policy_notify_paged_in(rsp->gfn);
+ else
+ policy_notify_paged_in_nomru(rsp->gfn);
/* Record number of resumed pages */
paging->num_paged_out--;
@@ -869,7 +876,7 @@ int main(int argc, char *argv[])
{
DPRINTF("drop_page ^ gfn %"PRIx64" pageslot %d\n", req.gfn, i);
/* Notify policy of page being dropped */
- policy_notify_paged_in(req.gfn);
+ policy_notify_dropped(req.gfn);
}
else
{