|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 3/7] x86: extend update_intpte() to support atomic get-and-update
The update_intpte() now accepts a new swap flag and if set
returns the old pte value.
No functional change for existing callers.
Signed-off-by: Kevin Lampis <kevin.lampis@xxxxxxxxxx>
---
Changes in v2:
- Add new PTE_UPDATE_SWAP flag instead of a bool argument
- Return the old pte value instead of turning `old` into an out pointer
---
xen/arch/x86/pv/mm.h | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/pv/mm.h b/xen/arch/x86/pv/mm.h
index bfee0feb7b21..f2bb26aef5b3 100644
--- a/xen/arch/x86/pv/mm.h
+++ b/xen/arch/x86/pv/mm.h
@@ -64,15 +64,18 @@ static inline intpte_t paging_cmpxchg_guest_entry(
#define PTE_UPDATE_PRESERVE_AD (1u << 0)
#define PTE_UPDATE_NO_TRANSLATE (1u << 1)
+#define PTE_UPDATE_SWAP (1u << 2)
/*
* How to write an entry to the guest pagetables.
+ * Returns the old PTE value.
*/
-static inline void update_intpte(intpte_t *p, intpte_t old, intpte_t new,
- mfn_t mfn, struct vcpu *v, unsigned int flags)
+static inline intpte_t update_intpte(intpte_t *p, intpte_t old, intpte_t new,
+ mfn_t mfn, struct vcpu *v,
+ unsigned int flags)
{
#ifndef PTE_UPDATE_WITH_CMPXCHG
- if ( !(flags & PTE_UPDATE_PRESERVE_AD) )
+ if ( !(flags & (PTE_UPDATE_PRESERVE_AD | PTE_UPDATE_SWAP)) )
paging_write_guest_entry(v, p, new, mfn);
else
#endif
@@ -95,15 +98,16 @@ static inline void update_intpte(intpte_t *p, intpte_t old,
intpte_t new,
old = t;
}
}
+ return old;
}
/*
* Macro that wraps the appropriate type-changes around update_intpte().
* Arguments are: type, ptr, old, new, mfn, vcpu
*/
-#define UPDATE_ENTRY(_t ,_p ,_o ,_n ,_m ,_v , fl) \
- update_intpte(&_t ## e_get_intpte(*(_p)), \
- _t ## e_get_intpte(_o), _t ## e_get_intpte(_n), \
+#define UPDATE_ENTRY(_t ,_p ,_o ,_n ,_m ,_v , fl) \
+ update_intpte(&_t ## e_get_intpte(*(_p)), \
+ _t ## e_get_intpte(_o), _t ## e_get_intpte(_n), \
_m, _v, fl)
static always_inline l1_pgentry_t adjust_guest_l1e(l1_pgentry_t l1e,
--
2.52.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |