diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index b8f5f67810..d99a20a44b 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -1491,6 +1491,21 @@ Note that if **watchdog** option is also specified vpmu will be turned off. As the virtualisation is not 100% safe, don't use the vpmu flag on production systems (see http://xenbits.xen.org/xsa/advisory-163.html)! +### vwfi +> `= trap | native + +> Default: `trap` + +WFI is the ARM instruction to "wait for interrupt". WFE is similar and +means "wait for event". This option, which is ARM specific, changes the +way guest WFI and WFE are implemented in Xen. By default, Xen traps both +instructions. In the case of WFI, Xen blocks the guest vcpu; in the case +of WFE, Xen yield the guest vcpu. When setting vwfi to `native`, Xen +doesn't trap either instruction, running them in guest context. Setting +vwfi to `native` reduces irq latency significantly. It can also lead to +suboptimal scheduling decisions, but only when the system is +oversubscribed (i.e., in total there are more vCPUs than pCPUs). + ### watchdog > `= force | ` diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 1c13b05d00..5dbc8be003 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -98,6 +98,19 @@ static int debug_stack_lines = 40; integer_param("debug_stack_lines", debug_stack_lines); +static enum { + TRAP, + NATIVE, +} vwfi; + +static void __init parse_vwfi(const char *s) +{ + if ( !strcmp(s, "native") ) + vwfi = NATIVE; + else + vwfi = TRAP; +} +custom_param("vwfi", parse_vwfi); void __cpuinit init_traps(void) { @@ -124,8 +137,8 @@ void __cpuinit init_traps(void) /* Setup hypervisor traps */ WRITE_SYSREG(HCR_PTW|HCR_BSU_INNER|HCR_AMO|HCR_IMO|HCR_FMO|HCR_VM| - HCR_TWE|HCR_TWI|HCR_TSC|HCR_TAC|HCR_SWIO|HCR_TIDCP|HCR_FB, - HCR_EL2); + (vwfi != NATIVE ? (HCR_TWI|HCR_TWE) : 0) | + HCR_TSC|HCR_TAC|HCR_SWIO|HCR_TIDCP|HCR_FB,HCR_EL2); isb(); }