|
[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 |