xen/arm: introduce vwfi parameter

Introduce new Xen command line parameter called "vwfi", which stands for
virtual wfi. The default is "trap": Xen traps guest wfi and wfe
instructions. In the case of wfi, Xen calls vcpu_block on the guest
vcpu; in the case of guest wfe, Xen calls vcpu_yield on the guest vcpu.
The behavior can be changed by setting vwfi to "native", in that case
Xen doesn't trap neither wfi nor wfe, running them in guest context.

The result is strong reduction in irq latency (from 5000ns to 2000ns,
measured using https://github.com/edgarigl/tbm, the physical timer, and
1 pcpu dedicated to 1 vcpu). The downside is that the scheduler thinks
that the guest is busy when actually is sleeping, leading to suboptimal
scheduling decisions.

Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Dario Faggioli <dario.faggioli@citrix.com>
Reviewed-by: Julien Grall <julien.grall@arm.com>
This commit is contained in:
Stefano Stabellini committed 2017-03-07 11:26:58 -08:00
1 parent abb5a12915
commit 82fde4fa36
2 files changed
+30 -2

No files matched your search

+15
View File
@@ -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 | <boolean>`
+15 -2
View File
@@ -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();
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.