mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
[IA64] pte_xchg added
pte_xchg added to atomically exchange pte. Signed-off-by: Tristan Gingold <tristan.gingold@bull.net>
This commit is contained in:
1 parent
911e3e203f
commit
b752ccb8d2
2 files changed
+17
-3
No files matched your search
@@ -746,6 +746,7 @@ __assign_new_domain_page(struct domain *d, unsigned long mpaddr, pte_t* pte)
|
||||
set_pte(pte, pfn_pte(maddr >> PAGE_SHIFT,
|
||||
__pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX)));
|
||||
|
||||
mb ();
|
||||
//XXX CONFIG_XEN_IA64_DOM0_VP
|
||||
// TODO racy
|
||||
set_gpfn_from_mfn(page_to_mfn(p), mpaddr >> PAGE_SHIFT);
|
||||
@@ -803,6 +804,7 @@ __assign_domain_page(struct domain *d,
|
||||
set_pte(pte,
|
||||
pfn_pte(physaddr >> PAGE_SHIFT,
|
||||
__pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX)));
|
||||
mb ();
|
||||
} else
|
||||
printk("%s: mpaddr %lx already mapped!\n", __func__, mpaddr);
|
||||
}
|
||||
@@ -1123,13 +1125,13 @@ assign_domain_page_replace(struct domain *d, unsigned long mpaddr,
|
||||
struct mm_struct *mm = &d->arch.mm;
|
||||
pte_t* pte;
|
||||
pte_t old_pte;
|
||||
pte_t npte;
|
||||
|
||||
pte = lookup_alloc_domain_pte(d, mpaddr);
|
||||
|
||||
// update pte
|
||||
old_pte = ptep_get_and_clear(mm, mpaddr, pte);
|
||||
set_pte(pte, pfn_pte(mfn,
|
||||
__pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX)));
|
||||
npte = pfn_pte(mfn, __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX));
|
||||
old_pte = ptep_xchg(mm, mpaddr, pte, npte);
|
||||
if (!pte_none(old_pte)) {
|
||||
unsigned long old_mfn;
|
||||
struct page_info* old_page;
|
||||
|
||||
@@ -397,6 +397,18 @@ ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline pte_t
|
||||
ptep_xchg(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t npte)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
return __pte(xchg((long *) ptep, pte_val(npte)));
|
||||
#else
|
||||
pte_t pte = *ptep;
|
||||
set_pte (ptep, npte);
|
||||
return pte;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef XEN
|
||||
static inline void
|
||||
ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
||||
|
||||