mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
bitkeeper revision 1.1159.57.2 (412f4f96lcvl1zNFbliRXwffVN2DFg)
Add ptep_establish_new and use in page fault path.
This commit is contained in:
1 parent
f1cd150e1f
commit
c50cb033fa
4 files changed
+1979
No files matched your search
@@ -202,6 +202,7 @@
|
||||
405853f6nbeazrNyEWNHBuoSg2PiPA linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c
|
||||
4108f5c1ppFXVpQzCOAZ6xXYubsjKA linux-2.6.8.1-xen-sparse/drivers/xen/privcmd/Makefile
|
||||
3e5a4e65IUfzzMu2kZFlGEB8-rpTaA linux-2.6.8.1-xen-sparse/drivers/xen/privcmd/privcmd.c
|
||||
412f47e4RKD-R5IS5gEXvcT8L4v8gA linux-2.6.8.1-xen-sparse/include/asm-generic/pgtable.h
|
||||
40f56239YAjS52QG2FIAQpHDZAdGHg linux-2.6.8.1-xen-sparse/include/asm-xen/asm-i386/desc.h
|
||||
4107adf1E5O4ztGHNGMzCCNhcvqNow linux-2.6.8.1-xen-sparse/include/asm-xen/asm-i386/dma-mapping.h
|
||||
40f5623anSzpuEHgiNmQ56fIRfCoaQ linux-2.6.8.1-xen-sparse/include/asm-xen/asm-i386/e820.h
|
||||
@@ -252,6 +253,7 @@
|
||||
4124f66fp5QwbDHEfoUIa7pqO5Xhag linux-2.6.8.1-xen-sparse/include/linux/page-flags.h
|
||||
4124f66f4NaKNa0xPiGGykn9QaZk3w linux-2.6.8.1-xen-sparse/include/linux/skbuff.h
|
||||
40f56a0ddHCSs3501MY4hRf22tctOw linux-2.6.8.1-xen-sparse/mkbuildtree
|
||||
412f46c0LJuKAgSPGoC0Z1DEkLfuLA linux-2.6.8.1-xen-sparse/mm/memory.c
|
||||
410a94a4KT6I6X0LVc7djB39tRDp4g linux-2.6.8.1-xen-sparse/mm/page_alloc.c
|
||||
40e1b09db5mN69Ijj0X_Eol-S7dXiw tools/Make.defs
|
||||
3f776bd1Hy9rn69ntXBhPReUFw9IEA tools/Makefile
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
#ifndef _ASM_GENERIC_PGTABLE_H
|
||||
#define _ASM_GENERIC_PGTABLE_H
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_ESTABLISH
|
||||
/*
|
||||
* Establish a new mapping:
|
||||
* - flush the old one
|
||||
* - update the page tables
|
||||
* - inform the TLB about the new one
|
||||
*
|
||||
* We hold the mm semaphore for reading and vma->vm_mm->page_table_lock.
|
||||
*
|
||||
* Note: the old pte is known to not be writable, so we don't need to
|
||||
* worry about dirty bits etc getting lost.
|
||||
*/
|
||||
#define ptep_establish(__vma, __address, __ptep, __entry) \
|
||||
do { \
|
||||
set_pte(__ptep, __entry); \
|
||||
flush_tlb_page(__vma, __address); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
||||
/*
|
||||
* Largely same as above, but only sets the access flags (dirty,
|
||||
* accessed, and writable). Furthermore, we know it always gets set
|
||||
* to a "more permissive" setting, which allows most architectures
|
||||
* to optimize this.
|
||||
*/
|
||||
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
|
||||
do { \
|
||||
set_pte(__ptep, __entry); \
|
||||
flush_tlb_page(__vma, __address); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_ESTABLISH_NEW
|
||||
#define ptep_establish_new(__vma, __address, __ptep, __entry) \
|
||||
do { \
|
||||
set_pte(__ptep, __entry); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
|
||||
static inline int ptep_test_and_clear_young(pte_t *ptep)
|
||||
{
|
||||
pte_t pte = *ptep;
|
||||
if (!pte_young(pte))
|
||||
return 0;
|
||||
set_pte(ptep, pte_mkold(pte));
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
|
||||
#define ptep_clear_flush_young(__vma, __address, __ptep) \
|
||||
({ \
|
||||
int __young = ptep_test_and_clear_young(__ptep); \
|
||||
if (__young) \
|
||||
flush_tlb_page(__vma, __address); \
|
||||
__young; \
|
||||
})
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
|
||||
static inline int ptep_test_and_clear_dirty(pte_t *ptep)
|
||||
{
|
||||
pte_t pte = *ptep;
|
||||
if (!pte_dirty(pte))
|
||||
return 0;
|
||||
set_pte(ptep, pte_mkclean(pte));
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH
|
||||
#define ptep_clear_flush_dirty(__vma, __address, __ptep) \
|
||||
({ \
|
||||
int __dirty = ptep_test_and_clear_dirty(__ptep); \
|
||||
if (__dirty) \
|
||||
flush_tlb_page(__vma, __address); \
|
||||
__dirty; \
|
||||
})
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR
|
||||
static inline pte_t ptep_get_and_clear(pte_t *ptep)
|
||||
{
|
||||
pte_t pte = *ptep;
|
||||
pte_clear(ptep);
|
||||
return pte;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_CLEAR_FLUSH
|
||||
#define ptep_clear_flush(__vma, __address, __ptep) \
|
||||
({ \
|
||||
pte_t __pte = ptep_get_and_clear(__ptep); \
|
||||
flush_tlb_page(__vma, __address); \
|
||||
__pte; \
|
||||
})
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_SET_WRPROTECT
|
||||
static inline void ptep_set_wrprotect(pte_t *ptep)
|
||||
{
|
||||
pte_t old_pte = *ptep;
|
||||
set_pte(ptep, pte_wrprotect(old_pte));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_MKDIRTY
|
||||
static inline void ptep_mkdirty(pte_t *ptep)
|
||||
{
|
||||
pte_t old_pte = *ptep;
|
||||
set_pte(ptep, pte_mkdirty(old_pte));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PTE_SAME
|
||||
#define pte_same(A,B) (pte_val(A) == pte_val(B))
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY
|
||||
#define page_test_and_clear_dirty(page) (0)
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
|
||||
#define page_test_and_clear_young(page) (0)
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_PGD_OFFSET_GATE
|
||||
#define pgd_offset_gate(mm, addr) pgd_offset(mm, addr)
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_GENERIC_PGTABLE_H */
|
||||
@@ -436,12 +436,31 @@ extern pte_t *lookup_address(unsigned long address);
|
||||
HYPERVISOR_update_va_mapping(address>>PAGE_SHIFT, entry, UVMF_INVLPG); \
|
||||
} else { \
|
||||
xen_l1_entry_update((__ptep), (__entry).pte_low); \
|
||||
flush_tlb_page(__vma, __address); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
#define __HAVE_ARCH_PTEP_ESTABLISH
|
||||
#define ptep_establish(__vma, __address, __ptep, __entry) \
|
||||
do { \
|
||||
ptep_set_access_flags(__vma, __address, __ptep, __entry, 1); \
|
||||
} while (0)
|
||||
|
||||
#define __HAVE_ARCH_PTEP_ESTABLISH_NEW
|
||||
#define ptep_establish_new(__vma, __address, __ptep, __entry) \
|
||||
do { \
|
||||
if ( likely((__vma)->vm_mm == current->mm) ) { \
|
||||
xen_flush_page_update_queue(); \
|
||||
HYPERVISOR_update_va_mapping((__address)>>PAGE_SHIFT, \
|
||||
__entry, 0); \
|
||||
} else { \
|
||||
xen_l1_entry_update((__ptep), (__entry).pte_low); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Encode and de-code a swap entry */
|
||||
#define __swp_type(x) (((x).val >> 1) & 0x1f)
|
||||
#define __swp_offset(x) ((x).val >> 8)
|
||||
|
||||
File diff suppressed because it is too large.
Load diff