diff options
author | Andres Lagar-Cavilla <andres@lagarcavilla.org> | 2012-01-26 12:46:26 +0000 |
---|---|---|
committer | Andres Lagar-Cavilla <andres@lagarcavilla.org> | 2012-01-26 12:46:26 +0000 |
commit | 2bc918fd8a5e7d81b8065e3399c614e7dfcdb659 (patch) | |
tree | 7515c290c84ffa9a5b7c469d8cd0653775fb330a /xen | |
parent | 8ed0c272481880b75442e62aad75c30ecfa798ce (diff) | |
download | xen-2bc918fd8a5e7d81b8065e3399c614e7dfcdb659.tar.gz xen-2bc918fd8a5e7d81b8065e3399c614e7dfcdb659.tar.bz2 xen-2bc918fd8a5e7d81b8065e3399c614e7dfcdb659.zip |
x86/mm: Check how many mfns are shared, in addition to how many are saved
This patch also moves the existing sharing-related memory op to the
correct location, and adds logic to the audit() method that uses the
new information.
This patch only provides the Xen implementation of the domctls.
Signed-off-by: Andres Lagar-Cavilla <andres@scannell.ca>
Signed-off-by: Adin Scannell <adin@scannell.ca>
Acked-by: Tim Deegan <tim@xen.org>
Committed-by: Tim Deegan <tim@xen.org>
Diffstat (limited to 'xen')
-rw-r--r-- | xen/arch/x86/mm.c | 6 | ||||
-rw-r--r-- | xen/arch/x86/mm/mem_sharing.c | 25 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/compat/mm.c | 6 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/mm.c | 7 | ||||
-rw-r--r-- | xen/include/asm-x86/mem_sharing.h | 1 | ||||
-rw-r--r-- | xen/include/public/memory.h | 1 |
6 files changed, 40 insertions, 6 deletions
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index ef9b202773..4478aae3e9 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -119,7 +119,6 @@ #include <xen/trace.h> #include <asm/setup.h> #include <asm/fixmap.h> -#include <asm/mem_sharing.h> /* * Mapping of first 2 or 4 megabytes of memory. This is mapped with 4kB @@ -5023,11 +5022,6 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) return rc; } -#ifdef __x86_64__ - case XENMEM_get_sharing_freed_pages: - return mem_sharing_get_nr_saved_mfns(); -#endif - default: return subarch_memory_op(op, arg); } diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index 237b5509f8..a01e7ece3a 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -138,6 +138,7 @@ static inline shr_handle_t get_next_handle(void) #define page_to_mfn(_pg) _mfn(__page_to_mfn(_pg)) static atomic_t nr_saved_mfns = ATOMIC_INIT(0); +static atomic_t nr_shared_mfns = ATOMIC_INIT(0); typedef struct gfn_info { @@ -208,9 +209,12 @@ static struct page_info* mem_sharing_lookup(unsigned long mfn) static void mem_sharing_audit(void) { int errors = 0; + unsigned long count_expected; + unsigned long count_found = 0; struct list_head *ae; ASSERT(shr_locked_by_me()); + count_expected = atomic_read(&nr_shared_mfns); list_for_each(ae, &shr_audit_list) { @@ -258,6 +262,9 @@ static void mem_sharing_audit(void) continue; } + /* We've found a page that is shared */ + count_found++; + /* Check if all GFNs map to the MFN, and the p2m types */ list_for_each(le, &pg->shared_info->gfns) { @@ -302,6 +309,14 @@ static void mem_sharing_audit(void) errors++; } } + + if ( count_found != count_expected ) + { + MEM_SHARING_DEBUG("Expected %ld shared mfns, found %ld.", + count_expected, count_found); + errors++; + } + } #endif @@ -342,6 +357,11 @@ unsigned int mem_sharing_get_nr_saved_mfns(void) return ((unsigned int)atomic_read(&nr_saved_mfns)); } +unsigned int mem_sharing_get_nr_shared_mfns(void) +{ + return (unsigned int)atomic_read(&nr_shared_mfns); +} + int mem_sharing_sharing_resume(struct domain *d) { mem_event_response_t rsp; @@ -663,6 +683,9 @@ int mem_sharing_nominate_page(struct domain *d, goto out; } + /* Account for this page. */ + atomic_inc(&nr_shared_mfns); + /* Update m2p entry to SHARED_M2P_ENTRY */ set_gpfn_from_mfn(mfn_x(mfn), SHARED_M2P_ENTRY); @@ -786,6 +809,7 @@ int mem_sharing_share_pages(struct domain *sd, unsigned long sgfn, shr_handle_t put_page(cpage); /* We managed to free a domain page. */ + atomic_dec(&nr_shared_mfns); atomic_inc(&nr_saved_mfns); ret = 0; @@ -851,6 +875,7 @@ gfn_found: audit_del_list(page); xfree(page->shared_info); page->shared_info = NULL; + atomic_dec(&nr_shared_mfns); } else atomic_dec(&nr_saved_mfns); diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c index bea94fe6a8..93325792f5 100644 --- a/xen/arch/x86/x86_64/compat/mm.c +++ b/xen/arch/x86/x86_64/compat/mm.c @@ -205,6 +205,12 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) break; } + case XENMEM_get_sharing_freed_pages: + return mem_sharing_get_nr_saved_mfns(); + + case XENMEM_get_sharing_shared_pages: + return mem_sharing_get_nr_shared_mfns(); + default: rc = -ENOSYS; break; diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 2f056fd3df..25bbbd1c7a 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -34,6 +34,7 @@ #include <asm/msr.h> #include <asm/setup.h> #include <asm/numa.h> +#include <asm/mem_sharing.h> #include <public/memory.h> /* Parameters for PFN/MADDR compression. */ @@ -1093,6 +1094,12 @@ long subarch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) break; + case XENMEM_get_sharing_freed_pages: + return mem_sharing_get_nr_saved_mfns(); + + case XENMEM_get_sharing_shared_pages: + return mem_sharing_get_nr_shared_mfns(); + default: rc = -ENOSYS; break; diff --git a/xen/include/asm-x86/mem_sharing.h b/xen/include/asm-x86/mem_sharing.h index 7925697645..f4f7407c89 100644 --- a/xen/include/asm-x86/mem_sharing.h +++ b/xen/include/asm-x86/mem_sharing.h @@ -45,6 +45,7 @@ struct page_sharing_info (is_hvm_domain(_d) && paging_mode_hap(_d)) unsigned int mem_sharing_get_nr_saved_mfns(void); +unsigned int mem_sharing_get_nr_shared_mfns(void); int mem_sharing_nominate_page(struct domain *d, unsigned long gfn, int expected_refcnt, diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h index c5b78a8487..3bc2f25cdc 100644 --- a/xen/include/public/memory.h +++ b/xen/include/public/memory.h @@ -294,6 +294,7 @@ typedef struct xen_pod_target xen_pod_target_t; * The call never fails. */ #define XENMEM_get_sharing_freed_pages 18 +#define XENMEM_get_sharing_shared_pages 19 #endif /* __XEN_PUBLIC_MEMORY_H__ */ |