|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/mm: Check how many mfns are shared, in addition to how many are saved
# HG changeset patch
# User Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
# Date 1327581986 0
# Node ID 17c4c25a473bc25233ba224ebe4721c086b39847
# Parent 823829bde70517ae047c10a71b808bc1419d7dff
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@xxxxxxxxxxx>
Signed-off-by: Adin Scannell <adin@xxxxxxxxxxx>
Acked-by: Tim Deegan <tim@xxxxxxx>
Committed-by: Tim Deegan <tim@xxxxxxx>
---
diff -r 823829bde705 -r 17c4c25a473b xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Jan 26 12:46:26 2012 +0000
+++ b/xen/arch/x86/mm.c Thu Jan 26 12:46:26 2012 +0000
@@ -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 @@
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 -r 823829bde705 -r 17c4c25a473b xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c Thu Jan 26 12:46:26 2012 +0000
+++ b/xen/arch/x86/mm/mem_sharing.c Thu Jan 26 12:46:26 2012 +0000
@@ -138,6 +138,7 @@
#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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
audit_del_list(page);
xfree(page->shared_info);
page->shared_info = NULL;
+ atomic_dec(&nr_shared_mfns);
}
else
atomic_dec(&nr_saved_mfns);
diff -r 823829bde705 -r 17c4c25a473b xen/arch/x86/x86_64/compat/mm.c
--- a/xen/arch/x86/x86_64/compat/mm.c Thu Jan 26 12:46:26 2012 +0000
+++ b/xen/arch/x86/x86_64/compat/mm.c Thu Jan 26 12:46:26 2012 +0000
@@ -205,6 +205,12 @@
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 -r 823829bde705 -r 17c4c25a473b xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c Thu Jan 26 12:46:26 2012 +0000
+++ b/xen/arch/x86/x86_64/mm.c Thu Jan 26 12:46:26 2012 +0000
@@ -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 @@
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 -r 823829bde705 -r 17c4c25a473b xen/include/asm-x86/mem_sharing.h
--- a/xen/include/asm-x86/mem_sharing.h Thu Jan 26 12:46:26 2012 +0000
+++ b/xen/include/asm-x86/mem_sharing.h Thu Jan 26 12:46:26 2012 +0000
@@ -45,6 +45,7 @@
(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 -r 823829bde705 -r 17c4c25a473b xen/include/public/memory.h
--- a/xen/include/public/memory.h Thu Jan 26 12:46:26 2012 +0000
+++ b/xen/include/public/memory.h Thu Jan 26 12:46:26 2012 +0000
@@ -294,6 +294,7 @@
* The call never fails.
*/
#define XENMEM_get_sharing_freed_pages 18
+#define XENMEM_get_sharing_shared_pages 19
#endif /* __XEN_PUBLIC_MEMORY_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |