diff options
Diffstat (limited to 'tools/xenpaging')
-rw-r--r-- | tools/xenpaging/policy.h | 2 | ||||
-rw-r--r-- | tools/xenpaging/policy_default.c | 27 | ||||
-rw-r--r-- | tools/xenpaging/xenpaging.c | 11 |
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 { |