[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 05/20] x86/shadow: Alter shadow_hash_{lookup, insert, delete}() to take a domain
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Tim Deegan <tim@xxxxxxx> --- xen/arch/x86/mm/shadow/common.c | 11 ++++------- xen/arch/x86/mm/shadow/multi.c | 22 +++++++++++++--------- xen/arch/x86/mm/shadow/private.h | 6 +++--- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 26dab30..80174df 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -1878,11 +1878,10 @@ static void shadow_hash_teardown(struct domain *d) } -mfn_t shadow_hash_lookup(struct vcpu *v, unsigned long n, unsigned int t) +mfn_t shadow_hash_lookup(struct domain *d, unsigned long n, unsigned int t) /* Find an entry in the hash table. Returns the MFN of the shadow, * or INVALID_MFN if it doesn't exist */ { - struct domain *d = v->domain; struct page_info *sp, *prev; key_t key; @@ -1932,11 +1931,10 @@ mfn_t shadow_hash_lookup(struct vcpu *v, unsigned long n, unsigned int t) return _mfn(INVALID_MFN); } -void shadow_hash_insert(struct vcpu *v, unsigned long n, unsigned int t, +void shadow_hash_insert(struct domain *d, unsigned long n, unsigned int t, mfn_t smfn) /* Put a mapping (n,t)->smfn into the hash table */ { - struct domain *d = v->domain; struct page_info *sp; key_t key; @@ -1958,11 +1956,10 @@ void shadow_hash_insert(struct vcpu *v, unsigned long n, unsigned int t, sh_hash_audit_bucket(d, key); } -void shadow_hash_delete(struct vcpu *v, unsigned long n, unsigned int t, +void shadow_hash_delete(struct domain *d, unsigned long n, unsigned int t, mfn_t smfn) /* Excise the mapping (n,t)->smfn from the hash table */ { - struct domain *d = v->domain; struct page_info *sp, *x; key_t key; @@ -2611,7 +2608,7 @@ void sh_remove_shadows(struct vcpu *v, mfn_t gmfn, int fast, int all) if( !(pg->count_info & PGC_page_table) \ || !(pg->shadow_flags & (1 << t)) ) \ break; \ - smfn = shadow_hash_lookup(v, mfn_x(gmfn), t); \ + smfn = shadow_hash_lookup(d, mfn_x(gmfn), t); \ if ( unlikely(!mfn_valid(smfn)) ) \ { \ SHADOW_ERROR(": gmfn %#lx has flags %#"PRIx32 \ diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c index f532bff..1e6bc33 100644 --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -94,7 +94,8 @@ static inline mfn_t get_fl1_shadow_status(struct vcpu *v, gfn_t gfn) /* Look for FL1 shadows in the hash table */ { - mfn_t smfn = shadow_hash_lookup(v, gfn_x(gfn), SH_type_fl1_shadow); + struct domain *d = v->domain; + mfn_t smfn = shadow_hash_lookup(d, gfn_x(gfn), SH_type_fl1_shadow); ASSERT(!mfn_valid(smfn) || mfn_to_page(smfn)->u.sh.head); return smfn; } @@ -103,7 +104,8 @@ static inline mfn_t get_shadow_status(struct vcpu *v, mfn_t gmfn, u32 shadow_type) /* Look for shadows in the hash table */ { - mfn_t smfn = shadow_hash_lookup(v, mfn_x(gmfn), shadow_type); + struct domain *d = v->domain; + mfn_t smfn = shadow_hash_lookup(d, mfn_x(gmfn), shadow_type); ASSERT(!mfn_valid(smfn) || mfn_to_page(smfn)->u.sh.head); perfc_incr(shadow_get_shadow_status); return smfn; @@ -113,11 +115,12 @@ static inline void set_fl1_shadow_status(struct vcpu *v, gfn_t gfn, mfn_t smfn) /* Put an FL1 shadow into the hash table */ { + struct domain *d = v->domain; SHADOW_PRINTK("gfn=%"SH_PRI_gfn", type=%08x, smfn=%05lx\n", gfn_x(gfn), SH_type_fl1_shadow, mfn_x(smfn)); ASSERT(mfn_to_page(smfn)->u.sh.head); - shadow_hash_insert(v, gfn_x(gfn), SH_type_fl1_shadow, smfn); + shadow_hash_insert(d, gfn_x(gfn), SH_type_fl1_shadow, smfn); } static inline void @@ -140,17 +143,18 @@ set_shadow_status(struct vcpu *v, mfn_t gmfn, u32 shadow_type, mfn_t smfn) ASSERT(res == 1); } - shadow_hash_insert(v, mfn_x(gmfn), shadow_type, smfn); + shadow_hash_insert(d, mfn_x(gmfn), shadow_type, smfn); } static inline void delete_fl1_shadow_status(struct vcpu *v, gfn_t gfn, mfn_t smfn) /* Remove a shadow from the hash table */ { + struct domain *d = v->domain; SHADOW_PRINTK("gfn=%"SH_PRI_gfn", type=%08x, smfn=%05lx\n", gfn_x(gfn), SH_type_fl1_shadow, mfn_x(smfn)); ASSERT(mfn_to_page(smfn)->u.sh.head); - shadow_hash_delete(v, gfn_x(gfn), SH_type_fl1_shadow, smfn); + shadow_hash_delete(d, gfn_x(gfn), SH_type_fl1_shadow, smfn); } static inline void @@ -162,7 +166,7 @@ delete_shadow_status(struct vcpu *v, mfn_t gmfn, u32 shadow_type, mfn_t smfn) d->domain_id, v->vcpu_id, mfn_x(gmfn), shadow_type, mfn_x(smfn)); ASSERT(mfn_to_page(smfn)->u.sh.head); - shadow_hash_delete(v, mfn_x(gmfn), shadow_type, smfn); + shadow_hash_delete(d, mfn_x(gmfn), shadow_type, smfn); /* 32-on-64 PV guests don't own their l4 pages; see set_shadow_status */ if ( !is_pv_32on64_domain(d) || shadow_type != SH_type_l4_64_shadow ) put_page(mfn_to_page(gmfn)); @@ -4501,7 +4505,7 @@ static void sh_pagetable_dying(struct vcpu *v, paddr_t gpa) gl2a = guest_l3e_get_paddr(gl3e[i]); gfn = gl2a >> PAGE_SHIFT; gmfn = get_gfn_query_unlocked(d, gfn, &p2mt); - smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_pae_shadow); + smfn = shadow_hash_lookup(d, mfn_x(gmfn), SH_type_l2_pae_shadow); } if ( mfn_valid(smfn) ) @@ -4539,9 +4543,9 @@ static void sh_pagetable_dying(struct vcpu *v, paddr_t gpa) paging_lock(d); #if GUEST_PAGING_LEVELS == 2 - smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_32_shadow); + smfn = shadow_hash_lookup(d, mfn_x(gmfn), SH_type_l2_32_shadow); #else - smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l4_64_shadow); + smfn = shadow_hash_lookup(d, mfn_x(gmfn), SH_type_l4_64_shadow); #endif if ( mfn_valid(smfn) ) diff --git a/xen/arch/x86/mm/shadow/private.h b/xen/arch/x86/mm/shadow/private.h index baa271c..df1dd8c 100644 --- a/xen/arch/x86/mm/shadow/private.h +++ b/xen/arch/x86/mm/shadow/private.h @@ -343,10 +343,10 @@ shadow_size(unsigned int shadow_type) */ /* Hash table functions */ -mfn_t shadow_hash_lookup(struct vcpu *v, unsigned long n, unsigned int t); -void shadow_hash_insert(struct vcpu *v, +mfn_t shadow_hash_lookup(struct domain *d, unsigned long n, unsigned int t); +void shadow_hash_insert(struct domain *d, unsigned long n, unsigned int t, mfn_t smfn); -void shadow_hash_delete(struct vcpu *v, +void shadow_hash_delete(struct domain *d, unsigned long n, unsigned int t, mfn_t smfn); /* shadow promotion */ -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |