[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2] xen/arm: introduce vwfi parameter



Introduce new Xen command line parameter called "vwfi", which stands for
virtual wfi. The default is "trap": Xen traps the guest wfi instruction
and calls vcpu_block on the guest vcpu. The behavior can be changed
setting vwfi to "native", in that case Xen doesn't trap the instruction
at all, running it 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@xxxxxxxxxx>
CC: dario.faggioli@xxxxxxxxxx
CC: george.dunlap@xxxxxxxxxx
CC: edgar.iglesias@xxxxxxxxxx
---
 docs/misc/xen-command-line.markdown | 12 ++++++++++++
 xen/arch/arm/traps.c                | 17 +++++++++++++++--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/docs/misc/xen-command-line.markdown 
b/docs/misc/xen-command-line.markdown
index c0106fb..6dea172 100644
--- a/docs/misc/xen-command-line.markdown
+++ b/docs/misc/xen-command-line.markdown
@@ -1638,6 +1638,18 @@ 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". This option, which
+is ARM specific, changes the way guest WFI is implemented in Xen. By
+default, Xen traps the instruction, then blocks the guest vcpu. When setting
+vwfi to `native`, Xen doesn't trap the instruction, running it in guest
+context. Setting vwfi to `native` reduces irq latency, but leads to
+suboptimal scheduling decisions.
+
 ### watchdog
 > `= force | <boolean>`
 
diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index 4f96a2b..3a40717 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -102,6 +102,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 init_traps(void)
 {
@@ -128,8 +141,8 @@ void 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 : 0) |HCR_TWE|
+                 HCR_TSC|HCR_TAC|HCR_SWIO|HCR_TIDCP|HCR_FB,HCR_EL2);
     isb();
 }
 
-- 
1.9.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.