f4f97b3ea9
Xen requires all active pagetables to be marked read-only. When the base of the pagetable is loaded into %cr3, the hypervisor validates the entire pagetable and only allows the load to proceed if it all checks out. This is pretty slow, so to mitigate this cost Xen has a notion of pinned pagetables. Pinned pagetables are pagetables which are considered to be active even if no processor's cr3 is pointing to is. This means that it must remain read-only and all updates are validated by the hypervisor. This makes context switches much cheaper, because the hypervisor doesn't need to revalidate the pagetable each time. This also adds a new paravirt hook which is called during setup once the zones and memory allocator have been initialized. When the init_mm pagetable is first built, the struct page array does not yet exist, and so there's nowhere to put he init_mm pagetable's PG_pinned flags. Once the zones are initialized and the struct page array exists, we can set the PG_pinned flags for those pages. This patch also adds the Xen support for pte pages allocated out of highmem (highpte) by implementing xen_kmap_atomic_pte. Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Chris Wright <chrisw@sous-sol.org> Cc: Zach Amsden <zach@vmware.com>
34 lines
777 B
C
34 lines
777 B
C
#ifndef XEN_OPS_H
|
|
#define XEN_OPS_H
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/clocksource.h>
|
|
|
|
DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
|
|
DECLARE_PER_CPU(unsigned long, xen_cr3);
|
|
|
|
extern struct start_info *xen_start_info;
|
|
extern struct shared_info *HYPERVISOR_shared_info;
|
|
|
|
char * __init xen_memory_setup(void);
|
|
void __init xen_arch_setup(void);
|
|
void __init xen_init_IRQ(void);
|
|
|
|
unsigned long xen_cpu_khz(void);
|
|
void __init xen_time_init(void);
|
|
unsigned long xen_get_wallclock(void);
|
|
int xen_set_wallclock(unsigned long time);
|
|
cycle_t xen_clocksource_read(void);
|
|
|
|
void xen_mark_init_mm_pinned(void);
|
|
|
|
DECLARE_PER_CPU(enum paravirt_lazy_mode, xen_lazy_mode);
|
|
|
|
static inline unsigned xen_get_lazy_mode(void)
|
|
{
|
|
return x86_read_percpu(xen_lazy_mode);
|
|
}
|
|
|
|
|
|
#endif /* XEN_OPS_H */
|