[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/monitor: add option to disable Xen's pagetable walking on events
Add option to the monitor interface to disable walking of the guest pagetable on certain events. This is a performance optimization for tools that never require that information or prefer to do it themselves. For example LibVMI maintains a virtual TLB which is faster to lookup then what Xen does here. Signed-off-by: Tamas K Lengyel <tamas@xxxxxxxxxxxxx> --- xen/arch/x86/hvm/monitor.c | 3 +++ xen/common/monitor.c | 3 +++ xen/include/asm-arm/monitor.h | 7 +++++++ xen/include/asm-x86/domain.h | 1 + xen/include/asm-x86/monitor.h | 6 ++++++ xen/include/public/domctl.h | 1 + 6 files changed, 21 insertions(+) diff --git a/xen/arch/x86/hvm/monitor.c b/xen/arch/x86/hvm/monitor.c index e4a09964a0..4c8272ab11 100644 --- a/xen/arch/x86/hvm/monitor.c +++ b/xen/arch/x86/hvm/monitor.c @@ -124,6 +124,9 @@ static inline unsigned long gfn_of_rip(unsigned long rip) struct segment_register sreg; uint32_t pfec = PFEC_page_present | PFEC_insn_fetch; + if ( curr->domain->arch.monitor.disable_ptwalks ) + return 0; + if ( hvm_get_cpl(curr) == 3 ) pfec |= PFEC_user_mode; diff --git a/xen/common/monitor.c b/xen/common/monitor.c index d5c9ff1cbf..3a808ae7e3 100644 --- a/xen/common/monitor.c +++ b/xen/common/monitor.c @@ -58,6 +58,9 @@ int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *mop) mop->event = arch_monitor_get_capabilities(d); return 0; + case XEN_DOMCTL_MONITOR_OP_DISABLE_PTWALKS: + return arch_monitor_disable_ptwalks(d); + default: /* The monitor op is probably handled on the arch-side. */ return arch_monitor_domctl_op(d, mop); diff --git a/xen/include/asm-arm/monitor.h b/xen/include/asm-arm/monitor.h index 7567be66bd..1398a3ee26 100644 --- a/xen/include/asm-arm/monitor.h +++ b/xen/include/asm-arm/monitor.h @@ -63,6 +63,13 @@ static inline uint32_t arch_monitor_get_capabilities(struct domain *d) return capabilities; } +static inline +int arch_monitor_disable_ptwalks(struct domain *d) +{ + /* Not supported on ARM. */ + return -EOPNOTSUPP; +} + int monitor_smc(void); #endif /* __ASM_ARM_MONITOR_H__ */ diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 3900d7b48b..83f210c750 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -430,6 +430,7 @@ struct arch_domain */ unsigned int inguest_pagefault_disabled : 1; unsigned int control_register_values : 1; + unsigned int disable_ptwalks : 1; struct monitor_msr_bitmap *msr_bitmap; uint64_t write_ctrlreg_mask[4]; } monitor; diff --git a/xen/include/asm-x86/monitor.h b/xen/include/asm-x86/monitor.h index 01c6d63bb9..d9e53a0499 100644 --- a/xen/include/asm-x86/monitor.h +++ b/xen/include/asm-x86/monitor.h @@ -100,6 +100,12 @@ static inline uint32_t arch_monitor_get_capabilities(struct domain *d) return capabilities; } +static inline int arch_monitor_disable_ptwalks(struct domain *d) +{ + d->arch.monitor.disable_ptwalks = true; + return 0; +} + int arch_monitor_domctl_event(struct domain *d, struct xen_domctl_monitor_op *mop); diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 666aeb71bf..a75b731a57 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -1028,6 +1028,7 @@ struct xen_domctl_psr_cmt_op { * to ensure all vCPUs have resumed before it is safe to turn it off. */ #define XEN_DOMCTL_MONITOR_OP_CONTROL_REGISTERS 4 +#define XEN_DOMCTL_MONITOR_OP_DISABLE_PTWALKS 5 #define XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG 0 #define XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR 1 -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |