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

[Xen-devel] [RFC PATCH v1 2/2] xen_nopv: Combine a bunch of the PV features that can be disabled



under one parameter. Removes the xen_nopvspin parameter and
makes it part of the xen_nopv.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
 Documentation/kernel-parameters.txt | 15 +++++------
 arch/x86/xen/enlighten.c            | 50 +++++++++++++++++++++++++++++++++----
 arch/x86/xen/spinlock.c             | 18 ++++---------
 arch/x86/xen/xen-ops.h              |  4 +++
 4 files changed, 62 insertions(+), 25 deletions(-)

diff --git a/Documentation/kernel-parameters.txt 
b/Documentation/kernel-parameters.txt
index 22a4b68..73cd745 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -4125,13 +4125,14 @@ bytes respectively. Such letter suffixes can also be 
entirely omitted.
                                the unplug protocol
                        never -- do not unplug even if version check succeeds
 
-       xen_nopvspin    [X86,XEN]
-                       Disables the ticketlock slowpath using Xen PV
-                       optimizations.
-
-       xen_nopv        [X86]
-                       Disables the PV optimizations forcing the HVM guest to
-                       run as generic HVM guest with no PV drivers.
+       xen_nopv=       [X86,XEN]
+                       Disables various (or all) PV optimizations forcing the
+                       HVM (or PV) guest to run without them.
+                       Format: [off0,][off]
+                       all -- every PV feature on HVM.
+                       spin -- Disables the ticketlock slowpath using Xen PV
+                                optimizations (PV and HVM).
+                       ipi - Disable PV event channel IPI (on HVM).
 
        xirc2ps_cs=     [NET,PCMCIA]
                        Format:
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 30d12af..c644d2c 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -1829,17 +1829,57 @@ static void __init xen_hvm_guest_init(void)
 }
 #endif
 
-static bool xen_nopv = false;
+static unsigned int xen_nopv_feat;
+#define XEN_NOPV_SPIN  1<<1
+#define XEN_NOPV_IPI   1<<2
+#define XEN_NOPV_ALL   (XEN_NOPV_SPIN | XEN_NOPV_IPI)
+
+bool xen_no_pvspin(void)
+{
+       return xen_nopv_feat & XEN_NOPV_SPIN;
+}
+
+bool xen_no_pv(void)
+{
+       return xen_nopv_feat & XEN_NOPV_ALL;
+}
+
+bool xen_no_pvipi(void)
+{
+       return xen_nopv_feat & XEN_NOPV_IPI;
+}
+
 static __init int xen_parse_nopv(char *arg)
 {
-       xen_nopv = true;
-       return 0;
+       char *p, *q;
+       int l;
+
+       for (p = arg; p; p = q) {
+               q = strchr(p, ',');
+               if (q) {
+                       l = q - p;
+                       q++;
+               } else {
+                       l = strlen(p);
+               }
+               if (!strncmp(p, "spin", l))
+                       xen_nopv_feat |= XEN_NOPV_SPIN;
+               else if (!strncmp(p, "all", l))
+                       xen_nopv_feat = XEN_NOPV_ALL;
+               else if (!strncmp(p, "ipi", l))
+                       xen_nopv_feat |= XEN_NOPV_IPI;
+               else
+                       printk(KERN_WARNING "unrecognised option '%s' "
+                                "in parameter 'xen_nopv'\n", p);
+       }
+       printk(KERN_DEBUG "xen_nopv_feat = 0x%x\n", xen_nopv_feat);
+       return 0;
 }
 early_param("xen_nopv", xen_parse_nopv);
 
 static uint32_t __init xen_platform(void)
 {
-       if (xen_nopv)
+       if (xen_no_pv())
                return 0;
 
        return xen_cpuid_base();
@@ -1847,7 +1887,7 @@ static uint32_t __init xen_platform(void)
 
 bool xen_hvm_need_lapic(void)
 {
-       if (xen_nopv)
+       if (xen_no_pv())
                return false;
        if (xen_pv_domain())
                return false;
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 9e2ba5c..31b91e9 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -19,7 +19,6 @@
 
 static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
 static DEFINE_PER_CPU(char *, irq_name);
-static bool xen_pvspin = true;
 
 #ifdef CONFIG_QUEUED_SPINLOCKS
 
@@ -277,7 +276,7 @@ void xen_init_lock_cpu(int cpu)
        int irq;
        char *name;
 
-       if (!xen_pvspin)
+       if (!xen_no_pvspin())
                return;
 
        WARN(per_cpu(lock_kicker_irq, cpu) >= 0, "spinlock on CPU%d exists on 
IRQ%d!\n",
@@ -302,7 +301,7 @@ void xen_init_lock_cpu(int cpu)
 
 void xen_uninit_lock_cpu(int cpu)
 {
-       if (!xen_pvspin)
+       if (!xen_no_pvspin())
                return;
 
        unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
@@ -323,7 +322,7 @@ void xen_uninit_lock_cpu(int cpu)
 void __init xen_init_spinlocks(void)
 {
 
-       if (!xen_pvspin) {
+       if (!xen_no_pvspin()) {
                printk(KERN_DEBUG "xen: PV spinlocks disabled\n");
                return;
        }
@@ -348,7 +347,7 @@ void __init xen_init_spinlocks(void)
  */
 static __init int xen_init_spinlocks_jump(void)
 {
-       if (!xen_pvspin)
+       if (!xen_no_pvspin())
                return 0;
 
        if (!xen_domain())
@@ -359,13 +358,6 @@ static __init int xen_init_spinlocks_jump(void)
 }
 early_initcall(xen_init_spinlocks_jump);
 
-static __init int xen_parse_nopvspin(char *arg)
-{
-       xen_pvspin = false;
-       return 0;
-}
-early_param("xen_nopvspin", xen_parse_nopvspin);
-
 #if defined(CONFIG_XEN_DEBUG_FS) && !defined(CONFIG_QUEUED_SPINLOCKS)
 
 static struct dentry *d_spin_debug;
@@ -377,7 +369,7 @@ static int __init xen_spinlock_debugfs(void)
        if (d_xen == NULL)
                return -ENOMEM;
 
-       if (!xen_pvspin)
+       if (xen_no_pvspin())
                return 0;
 
        d_spin_debug = debugfs_create_dir("spinlocks", d_xen);
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
index 1399423..3652d38 100644
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@ -149,4 +149,8 @@ __visible void xen_adjust_exception_frame(void);
 extern int xen_panic_handler_init(void);
 
 void xen_pvh_secondary_vcpu_init(int cpu);
+
+bool xen_no_pvspin(void);
+bool xen_no_pvipi(void);
+bool xen_no_pv(void);
 #endif /* XEN_OPS_H */
-- 
2.4.3


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


 


Rackspace

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