[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/mm: Don't trigger unnecessary shadow scans on p2m entry update
# HG changeset patch # User Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> # Date 1322749035 0 # Node ID 75f4e4d9f039ea656051e6dfd73e40d4cb32896b # Parent 039f79e2c5dcb1e73b2b938f85594542a943c829 x86/mm: Don't trigger unnecessary shadow scans on p2m entry update When updating a p2m entry, the hypervisor scans all shadow pte's to find mappings of that gfn and tear them down. This is avoided if the page count reveals that there are no additional mappings. The current test ignores the PGC_allocated flag and its effect on the page count. Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> Signed-off-by: Adin Scannell <adin@xxxxxxxxxxx> Signed-off-by: Tim Deegan <tim@xxxxxxx> Committed-by: Tim Deegan <tim@xxxxxxx> --- diff -r 039f79e2c5dc -r 75f4e4d9f039 xen/arch/x86/mm/shadow/common.c --- a/xen/arch/x86/mm/shadow/common.c Thu Dec 01 14:17:14 2011 +0000 +++ b/xen/arch/x86/mm/shadow/common.c Thu Dec 01 14:17:15 2011 +0000 @@ -2464,7 +2464,6 @@ int sh_remove_all_mappings(struct vcpu *v, mfn_t gmfn) { struct page_info *page = mfn_to_page(gmfn); - int expected_count; /* Dispatch table for getting per-type functions */ static const hash_callback_t callbacks[SH_type_unused] = { @@ -2501,7 +2500,7 @@ ; perfc_incr(shadow_mappings); - if ( (page->count_info & PGC_count_mask) == 0 ) + if ( sh_check_page_has_no_refs(page) ) return 0; /* Although this is an externally visible function, we do not know @@ -2517,8 +2516,7 @@ hash_foreach(v, callback_mask, callbacks, gmfn); /* If that didn't catch the mapping, something is very wrong */ - expected_count = (page->count_info & PGC_allocated) ? 1 : 0; - if ( (page->count_info & PGC_count_mask) != expected_count ) + if ( !sh_check_page_has_no_refs(page) ) { /* Don't complain if we're in HVM and there are some extra mappings: * The qemu helper process has an untyped mapping of this dom's RAM diff -r 039f79e2c5dc -r 75f4e4d9f039 xen/arch/x86/mm/shadow/multi.c --- a/xen/arch/x86/mm/shadow/multi.c Thu Dec 01 14:17:14 2011 +0000 +++ b/xen/arch/x86/mm/shadow/multi.c Thu Dec 01 14:17:15 2011 +0000 @@ -4591,7 +4591,7 @@ { (void) shadow_set_l1e(v, sl1e, shadow_l1e_empty(), p2m_invalid, sl1mfn); - if ( (mfn_to_page(target_mfn)->count_info & PGC_count_mask) == 0 ) + if ( sh_check_page_has_no_refs(mfn_to_page(target_mfn)) ) /* This breaks us cleanly out of the FOREACH macro */ done = 1; } diff -r 039f79e2c5dc -r 75f4e4d9f039 xen/arch/x86/mm/shadow/private.h --- a/xen/arch/x86/mm/shadow/private.h Thu Dec 01 14:17:14 2011 +0000 +++ b/xen/arch/x86/mm/shadow/private.h Thu Dec 01 14:17:15 2011 +0000 @@ -30,6 +30,7 @@ #include <xen/domain_page.h> #include <asm/x86_emulate.h> #include <asm/hvm/support.h> +#include <asm/atomic.h> #include "../mm-locks.h" @@ -815,6 +816,12 @@ } #endif /* (SHADOW_OPTIMIZATIONS & SHOPT_VIRTUAL_TLB) */ +static inline int sh_check_page_has_no_refs(struct page_info *page) +{ + unsigned long count = read_atomic(&page->count_info); + return ( (count & PGC_count_mask) == + ((count & PGC_allocated) ? 1 : 0) ); +} #endif /* _XEN_SHADOW_PRIVATE_H */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |