[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/mm: New sharing audit memop
# HG changeset patch # User Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> # Date 1328890027 0 # Node ID 0dcb9d1e7b554a9f6f76b62b38a139acf9b2180a # Parent ae27691530e7d5047b46bf865fe3dd080a082f75 x86/mm: New sharing audit memop Remove costly mem_sharing audits from the inline path, and instead make them callable as a memop. Have the audit function return the number of errors detected. Update memshrtool to be able to trigger audits. Set sharing audits as enabled by default. Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> Signed-off-by: Adin Scannell <adin@xxxxxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Committed-by: Tim Deegan <tim@xxxxxxx> --- diff -r ae27691530e7 -r 0dcb9d1e7b55 tools/libxc/xc_memshr.c --- a/tools/libxc/xc_memshr.c Fri Feb 10 16:07:07 2012 +0000 +++ b/tools/libxc/xc_memshr.c Fri Feb 10 16:07:07 2012 +0000 @@ -211,6 +211,17 @@ return xc_memshr_memop(xch, domid, &mso); } +int xc_memshr_audit(xc_interface *xch) +{ + xen_mem_sharing_op_t mso; + + memset(&mso, 0, sizeof(mso)); + + mso.op = XENMEM_sharing_op_audit; + + return do_memory_op(xch, XENMEM_sharing_op, &mso, sizeof(mso)); +} + long xc_sharing_freed_pages(xc_interface *xch) { return do_memory_op(xch, XENMEM_get_sharing_freed_pages, NULL, 0); diff -r ae27691530e7 -r 0dcb9d1e7b55 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Fri Feb 10 16:07:07 2012 +0000 +++ b/tools/libxc/xenctrl.h Fri Feb 10 16:07:07 2012 +0000 @@ -1951,6 +1951,7 @@ int xc_memshr_debug_gref(xc_interface *xch, domid_t domid, grant_ref_t gref); +int xc_memshr_audit(xc_interface *xch); int xc_flask_load(xc_interface *xc_handle, char *buf, uint32_t size); int xc_flask_context_to_sid(xc_interface *xc_handle, char *buf, uint32_t size, uint32_t *sid); diff -r ae27691530e7 -r 0dcb9d1e7b55 tools/tests/mem-sharing/memshrtool.c --- a/tools/tests/mem-sharing/memshrtool.c Fri Feb 10 16:07:07 2012 +0000 +++ b/tools/tests/mem-sharing/memshrtool.c Fri Feb 10 16:07:07 2012 +0000 @@ -27,6 +27,7 @@ printf(" add-to-physmap <domid> <gfn> <source> <source-gfn> <source-handle>\n"); printf(" - Populate a page in a domain with a shared page.\n"); printf(" debug-gfn <domid> <gfn> - Debug a particular domain and gfn.\n"); + printf(" audit - Audit the sharing subsytem in Xen.\n"); return 1; } @@ -160,6 +161,16 @@ gfn = strtol(argv[3], NULL, 0); R(xc_memshr_debug_gfn(xch, domid, gfn)); } + else if( !strcasecmp(cmd, "audit") ) + { + int rc = xc_memshr_audit(xch); + if ( rc < 0 ) + { + printf("error executing xc_memshr_audit: %s\n", strerror(errno)); + return rc; + } + printf("Audit returned %d errors.\n", rc); + } return 0; } diff -r ae27691530e7 -r 0dcb9d1e7b55 xen/arch/x86/mm/mem_sharing.c --- a/xen/arch/x86/mm/mem_sharing.c Fri Feb 10 16:07:07 2012 +0000 +++ b/xen/arch/x86/mm/mem_sharing.c Fri Feb 10 16:07:07 2012 +0000 @@ -50,8 +50,6 @@ #if MEM_SHARING_AUDIT -static void mem_sharing_audit(void); - static struct list_head shr_audit_list; static spinlock_t shr_audit_lock; DEFINE_RCU_READ_LOCK(shr_audit_read_lock); @@ -81,7 +79,10 @@ #else -#define mem_sharing_audit() ((void)0) +int mem_sharing_audit(void) +{ + return -ENOSYS; +} #define audit_add_list(p) ((void)0) static inline void audit_del_list(struct page_info *page) @@ -210,7 +211,7 @@ } #if MEM_SHARING_AUDIT -static void mem_sharing_audit(void) +int mem_sharing_audit(void) { int errors = 0; unsigned long count_expected; @@ -336,6 +337,7 @@ errors++; } + return errors; } #endif @@ -912,7 +914,6 @@ gfn_info_t *gfn_info = NULL; struct list_head *le; - mem_sharing_audit(); mfn = get_gfn(d, gfn, &p2mt); /* Has someone already unshared it? */ @@ -1176,8 +1177,6 @@ break; } - mem_sharing_audit(); - return rc; } diff -r ae27691530e7 -r 0dcb9d1e7b55 xen/arch/x86/x86_64/compat/mm.c --- a/xen/arch/x86/x86_64/compat/mm.c Fri Feb 10 16:07:07 2012 +0000 +++ b/xen/arch/x86/x86_64/compat/mm.c Fri Feb 10 16:07:07 2012 +0000 @@ -3,6 +3,7 @@ #include <compat/memory.h> #include <compat/xen.h> #include <asm/mem_event.h> +#include <asm/mem_sharing.h> int compat_set_gdt(XEN_GUEST_HANDLE(uint) frame_list, unsigned int entries) { @@ -228,6 +229,8 @@ xen_mem_sharing_op_t mso; if ( copy_from_guest(&mso, arg, 1) ) return -EFAULT; + if ( mso.op == XENMEM_sharing_op_audit ) + return mem_sharing_audit(); rc = do_mem_event_op(op, mso.domain, (void *) &mso); if ( !rc && copy_to_guest(arg, &mso, 1) ) return -EFAULT; diff -r ae27691530e7 -r 0dcb9d1e7b55 xen/arch/x86/x86_64/mm.c --- a/xen/arch/x86/x86_64/mm.c Fri Feb 10 16:07:07 2012 +0000 +++ b/xen/arch/x86/x86_64/mm.c Fri Feb 10 16:07:07 2012 +0000 @@ -1117,6 +1117,8 @@ xen_mem_sharing_op_t mso; if ( copy_from_guest(&mso, arg, 1) ) return -EFAULT; + if ( mso.op == XENMEM_sharing_op_audit ) + return mem_sharing_audit(); rc = do_mem_event_op(op, mso.domain, (void *) &mso); if ( !rc && copy_to_guest(arg, &mso, 1) ) return -EFAULT; diff -r ae27691530e7 -r 0dcb9d1e7b55 xen/include/asm-x86/mem_sharing.h --- a/xen/include/asm-x86/mem_sharing.h Fri Feb 10 16:07:07 2012 +0000 +++ b/xen/include/asm-x86/mem_sharing.h Fri Feb 10 16:07:07 2012 +0000 @@ -26,7 +26,7 @@ #include <public/memory.h> /* Auditing of memory sharing code? */ -#define MEM_SHARING_AUDIT 0 +#define MEM_SHARING_AUDIT 1 typedef uint64_t shr_handle_t; @@ -61,6 +61,7 @@ xen_mem_sharing_op_t *mec); int mem_sharing_domctl(struct domain *d, xen_domctl_mem_sharing_op_t *mec); +int mem_sharing_audit(void); void mem_sharing_init(void); #else diff -r ae27691530e7 -r 0dcb9d1e7b55 xen/include/public/memory.h --- a/xen/include/public/memory.h Fri Feb 10 16:07:07 2012 +0000 +++ b/xen/include/public/memory.h Fri Feb 10 16:07:07 2012 +0000 @@ -349,6 +349,7 @@ #define XENMEM_sharing_op_debug_mfn 5 #define XENMEM_sharing_op_debug_gref 6 #define XENMEM_sharing_op_add_physmap 7 +#define XENMEM_sharing_op_audit 8 #define XENMEM_SHARING_OP_S_HANDLE_INVALID (-10) #define XENMEM_SHARING_OP_C_HANDLE_INVALID (-9) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |