[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/mm: remove some indirection from {paging,sh}_cmpxchg_guest_entry()
commit 30bfa535fa9de47c47d0655e502eaf23724f837b Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Sep 28 13:58:14 2020 +0200 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Tue Oct 6 12:28:37 2020 +0100 x86/mm: remove some indirection from {paging,sh}_cmpxchg_guest_entry() Make the functions more similar to cmpxchg() in that they now take an integral "old" input and return the value read. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> --- xen/arch/x86/mm/shadow/private.h | 4 ++-- xen/arch/x86/mm/shadow/pv.c | 16 ++++++++-------- xen/arch/x86/pv/mm.h | 6 ++---- xen/arch/x86/pv/ro-page-fault.c | 4 ++-- xen/include/asm-x86/paging.h | 15 +++++++-------- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/xen/arch/x86/mm/shadow/private.h b/xen/arch/x86/mm/shadow/private.h index fd72f4afb0..992461d4bc 100644 --- a/xen/arch/x86/mm/shadow/private.h +++ b/xen/arch/x86/mm/shadow/private.h @@ -398,8 +398,8 @@ int shadow_write_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, /* Functions that atomically write PV guest PT entries */ void sh_write_guest_entry(struct vcpu *v, intpte_t *p, intpte_t new, mfn_t gmfn); -void sh_cmpxchg_guest_entry(struct vcpu *v, intpte_t *p, intpte_t *old, - intpte_t new, mfn_t gmfn); +intpte_t sh_cmpxchg_guest_entry(struct vcpu *v, intpte_t *p, intpte_t old, + intpte_t new, mfn_t gmfn); /* Update all the things that are derived from the guest's CR0/CR3/CR4. * Called to initialize paging structures if the paging mode diff --git a/xen/arch/x86/mm/shadow/pv.c b/xen/arch/x86/mm/shadow/pv.c index ac779afce1..f51f980f26 100644 --- a/xen/arch/x86/mm/shadow/pv.c +++ b/xen/arch/x86/mm/shadow/pv.c @@ -39,22 +39,22 @@ sh_write_guest_entry(struct vcpu *v, intpte_t *p, intpte_t new, mfn_t gmfn) /* * Cmpxchg a new value into the guest pagetable, and update the shadows - * appropriately. - * N.B. caller should check the value of "old" to see if the cmpxchg itself - * was successful. + * appropriately. Returns the previous entry found, which the caller is + * expected to check to see if the cmpxchg was successful. */ -void -sh_cmpxchg_guest_entry(struct vcpu *v, intpte_t *p, intpte_t *old, +intpte_t +sh_cmpxchg_guest_entry(struct vcpu *v, intpte_t *p, intpte_t old, intpte_t new, mfn_t gmfn) { intpte_t t; paging_lock(v->domain); - t = cmpxchg(p, *old, new); - if ( t == *old ) + t = cmpxchg(p, old, new); + if ( t == old ) sh_validate_guest_entry(v, gmfn, p, sizeof(new)); - *old = t; paging_unlock(v->domain); + + return t; } /* diff --git a/xen/arch/x86/pv/mm.h b/xen/arch/x86/pv/mm.h index f537e58a8d..b1b66e46c8 100644 --- a/xen/arch/x86/pv/mm.h +++ b/xen/arch/x86/pv/mm.h @@ -47,16 +47,14 @@ static inline bool update_intpte(intpte_t *p, intpte_t old, intpte_t new, else #endif { - intpte_t t = old; - for ( ; ; ) { - intpte_t _new = new; + intpte_t _new = new, t; if ( preserve_ad ) _new |= old & (_PAGE_ACCESSED | _PAGE_DIRTY); - paging_cmpxchg_guest_entry(v, p, &t, _new, mfn); + t = paging_cmpxchg_guest_entry(v, p, old, _new, mfn); if ( t == old ) break; diff --git a/xen/arch/x86/pv/ro-page-fault.c b/xen/arch/x86/pv/ro-page-fault.c index 8468f9e9bb..7f6fbc92fb 100644 --- a/xen/arch/x86/pv/ro-page-fault.c +++ b/xen/arch/x86/pv/ro-page-fault.c @@ -168,8 +168,8 @@ static int ptwr_emulated_update(unsigned long addr, intpte_t *p_old, if ( p_old ) { ol1e = l1e_from_intpte(old); - paging_cmpxchg_guest_entry(v, &l1e_get_intpte(*pl1e), &old, - l1e_get_intpte(nl1e), mfn); + old = paging_cmpxchg_guest_entry(v, &l1e_get_intpte(*pl1e), old, + l1e_get_intpte(nl1e), mfn); if ( l1e_get_intpte(ol1e) == old ) ret = X86EMUL_OKAY; else diff --git a/xen/include/asm-x86/paging.h b/xen/include/asm-x86/paging.h index 4a26f30c81..61534da538 100644 --- a/xen/include/asm-x86/paging.h +++ b/xen/include/asm-x86/paging.h @@ -102,8 +102,8 @@ struct shadow_paging_mode { #ifdef CONFIG_PV void (*write_guest_entry )(struct vcpu *v, intpte_t *p, intpte_t new, mfn_t gmfn); - void (*cmpxchg_guest_entry )(struct vcpu *v, intpte_t *p, - intpte_t *old, intpte_t new, + intpte_t (*cmpxchg_guest_entry )(struct vcpu *v, intpte_t *p, + intpte_t old, intpte_t new, mfn_t gmfn); #endif #ifdef CONFIG_HVM @@ -351,16 +351,15 @@ static inline void paging_write_guest_entry( * true if not. N.B. caller should check the value of "old" to see if the * cmpxchg itself was successful. */ -static inline void paging_cmpxchg_guest_entry( - struct vcpu *v, intpte_t *p, intpte_t *old, intpte_t new, mfn_t gmfn) +static inline intpte_t paging_cmpxchg_guest_entry( + struct vcpu *v, intpte_t *p, intpte_t old, intpte_t new, mfn_t gmfn) { #ifdef CONFIG_SHADOW_PAGING if ( unlikely(paging_mode_shadow(v->domain)) && paging_get_hostmode(v) ) - paging_get_hostmode(v)->shadow.cmpxchg_guest_entry(v, p, old, - new, gmfn); - else + return paging_get_hostmode(v)->shadow.cmpxchg_guest_entry(v, p, old, + new, gmfn); #endif - *old = cmpxchg(p, *old, new); + return cmpxchg(p, old, new); } #endif /* CONFIG_PV */ -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |