Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
DISCONTINUED:openSUSE:11.1:Update
xen
19894-shadow-resync-fastpath-race.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 19894-shadow-resync-fastpath-race.patch of Package xen
# HG changeset patch # User Keir Fraser <keir.fraser@citrix.com> # Date 1246877396 -3600 # Node ID 3a5d8601293c95f7d783fef3a5f8282fd68603f2 # Parent d33a665b2c05b0785637330074c285034571faf1 x86 shadow: Fix lock-less race between resync and fast path. Signed-off-by: Gianluca Guida <gianluca.guida@eu.citrix.com> --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -3123,6 +3123,30 @@ static int sh_page_fault(struct vcpu *v, #if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH) if ( (regs->error_code & PFEC_reserved_bit) ) { +#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC) + /* First, need to check that this isn't an out-of-sync + * shadow l1e. If it is, we fall back to the slow path, which + * will sync it up again. */ + { + shadow_l2e_t sl2e; + mfn_t gl1mfn; + if ( (__copy_from_user(&sl2e, + (sh_linear_l2_table(v) + + shadow_l2_linear_offset(va)), + sizeof(sl2e)) != 0) + || !(shadow_l2e_get_flags(sl2e) & _PAGE_PRESENT) + || !mfn_valid(gl1mfn = _mfn(mfn_to_shadow_page( + shadow_l2e_get_mfn(sl2e))->v.sh.back)) + || unlikely(mfn_is_out_of_sync(gl1mfn)) ) + { + /* Hit the slow path as if there had been no + * shadow entry at all, and let it tidy up */ + ASSERT(regs->error_code & PFEC_page_present); + regs->error_code ^= (PFEC_reserved_bit|PFEC_page_present); + goto page_fault_slow_path; + } + } +#endif /* SHOPT_OUT_OF_SYNC */ /* The only reasons for reserved bits to be set in shadow entries * are the two "magic" shadow_l1e entries. */ if ( likely((__copy_from_user(&sl1e, @@ -3131,30 +3155,6 @@ static int sh_page_fault(struct vcpu *v, sizeof(sl1e)) == 0) && sh_l1e_is_magic(sl1e)) ) { -#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC) - /* First, need to check that this isn't an out-of-sync - * shadow l1e. If it is, we fall back to the slow path, which - * will sync it up again. */ - { - shadow_l2e_t sl2e; - mfn_t gl1mfn; - if ( (__copy_from_user(&sl2e, - (sh_linear_l2_table(v) - + shadow_l2_linear_offset(va)), - sizeof(sl2e)) != 0) - || !(shadow_l2e_get_flags(sl2e) & _PAGE_PRESENT) - || !mfn_valid(gl1mfn = _mfn(mfn_to_shadow_page( - shadow_l2e_get_mfn(sl2e))->v.sh.back)) - || unlikely(mfn_is_out_of_sync(gl1mfn)) ) - { - /* Hit the slow path as if there had been no - * shadow entry at all, and let it tidy up */ - ASSERT(regs->error_code & PFEC_page_present); - regs->error_code ^= (PFEC_reserved_bit|PFEC_page_present); - goto page_fault_slow_path; - } - } -#endif /* SHOPT_OUT_OF_SYNC */ if ( sh_l1e_is_gnp(sl1e) ) {
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor