[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 7 of 9] x86/mm: Fix paging stats
xen/arch/x86/mm/mem_sharing.c | 6 +++++- xen/arch/x86/mm/p2m.c | 12 +++++++++++- xen/common/memory.c | 2 +- xen/include/asm-x86/p2m.h | 6 ++++-- 4 files changed, 21 insertions(+), 5 deletions(-) There are several corner cases in which a page is paged back in, not by paging, and the stats are not properly updated. Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> diff -r 75dec1a0ba2d -r 244804e8a002 xen/arch/x86/mm/mem_sharing.c --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -881,8 +881,12 @@ int mem_sharing_add_to_physmap(struct do ret = -ENOENT; mem_sharing_gfn_destroy(cd, gfn_info); put_page_and_type(spage); - } else + } else { ret = 0; + /* There is a chance we're plugging a hole where a paged out page was */ + if ( p2m_is_paging(cmfn_type) && (cmfn_type != p2m_ram_paging_out) ) + atomic_dec(&cd->paged_pages); + } atomic_inc(&nr_saved_mfns); diff -r 75dec1a0ba2d -r 244804e8a002 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -510,6 +510,11 @@ guest_physmap_add_entry(struct domain *d /* Count how man PoD entries we'll be replacing if successful */ pod_count++; } + else if ( p2m_is_paging(ot) && (ot != p2m_ram_paging_out) ) + { + /* We're plugging a hole in the physmap where a paged out page was */ + atomic_dec(&d->paged_pages); + } } /* Then, look for m->p mappings for this range and deal with them */ @@ -878,7 +883,8 @@ int p2m_mem_paging_evict(struct domain * * released by the guest. The pager is supposed to drop its reference of the * gfn. */ -void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn) +void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn, + p2m_type_t p2mt) { mem_event_request_t req; @@ -897,6 +903,10 @@ void p2m_mem_paging_drop_page(struct dom req.flags = MEM_EVENT_FLAG_DROP_PAGE; mem_event_put_request(d, &d->mem_event->paging, &req); + + /* Update stats unless the page hasn't yet been evicted */ + if ( p2mt != p2m_ram_paging_out ) + atomic_dec(&d->paged_pages); } /** diff -r 75dec1a0ba2d -r 244804e8a002 xen/common/memory.c --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -166,7 +166,7 @@ int guest_remove_page(struct domain *d, if ( unlikely(p2m_is_paging(p2mt)) ) { guest_physmap_remove_page(d, gmfn, mfn, 0); - p2m_mem_paging_drop_page(d, gmfn); + p2m_mem_paging_drop_page(d, gmfn, p2mt); put_gfn(d, gmfn); return 1; } diff -r 75dec1a0ba2d -r 244804e8a002 xen/include/asm-x86/p2m.h --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -566,7 +566,8 @@ int p2m_mem_paging_nominate(struct domai /* Evict a frame */ int p2m_mem_paging_evict(struct domain *d, unsigned long gfn); /* Tell xenpaging to drop a paged out frame */ -void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn); +void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn, + p2m_type_t p2mt); /* Start populating a paged out frame */ void p2m_mem_paging_populate(struct domain *d, unsigned long gfn); /* Prepare the p2m for paging a frame in */ @@ -574,7 +575,8 @@ int p2m_mem_paging_prep(struct domain *d /* Resume normal operation (in case a domain was paused) */ void p2m_mem_paging_resume(struct domain *d); #else -static inline void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn) +static inline void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn, + p2m_type_t p2mt) { } static inline void p2m_mem_paging_populate(struct domain *d, unsigned long gfn) { } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |