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

[Xen-devel] [Patch 2 of 2]: PV-domain SMP performance Linux-part


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Juergen Gross <juergen.gross@xxxxxxxxxxxxxxxxxxx>
  • Date: Wed, 17 Dec 2008 13:22:35 +0100
  • Delivery-date: Wed, 17 Dec 2008 04:23:11 -0800
  • Domainkey-signature: s=s768; d=fujitsu-siemens.com; c=nofws; q=dns; h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV: Received:Received:Message-ID:Date:From:Organization: User-Agent:MIME-Version:To:Subject:X-Enigmail-Version: Content-Type; b=e4PqTas8UhVL7O2Z0du+9xLHGOHjzCP8jxFaqv2ztquKDpw2F2d+bDUK SOLnZcjBBbASEDKaSyIF5DvjFk/yAtJCo1Rb/0+wnwei5HcdO2CxKmjdE iWiLmt8cSgziVEE;
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

-- 
Juergen Gross                             Principal Developer
IP SW OS6                      Telephone: +49 (0) 89 636 47950
Fujitsu Siemens Computers         e-mail: juergen.gross@xxxxxxxxxxxxxxxxxxx
Otto-Hahn-Ring 6                Internet: www.fujitsu-siemens.com
D-81739 Muenchen         Company details: www.fujitsu-siemens.com/imprint.html
Mark vcpu as no_desched when interrupts are disabled.

Signed-off-by: juergen.gross@xxxxxxxxxxxxxxxxxxx

# HG changeset patch
# User juergen.gross@xxxxxxxxxxxxxxxxxxx
# Date 1229515973 -3600
# Node ID b5bbaec70b34d990e64e730caf712bb236490f95
# Parent  ff9683032b76f533509191bb9532df10cbb9830b
added support of vcpu preempt disable

diff -r ff9683032b76 -r b5bbaec70b34 arch/x86_64/kernel/xen_entry.S
--- a/arch/x86_64/kernel/xen_entry.S    Sat Dec 13 16:00:43 2008 +0000
+++ b/arch/x86_64/kernel/xen_entry.S    Wed Dec 17 13:12:53 2008 +0100
@@ -4,6 +4,7 @@
 /* Offsets into shared_info_t. */                
 #define evtchn_upcall_pending          /* 0 */
 #define evtchn_upcall_mask             1
+#define no_desched                     2
 
 #define sizeof_vcpu_shift              6
 
@@ -25,8 +26,10 @@
 #define XEN_PUT_VCPU_INFO_fixup
 #endif
 
-#define XEN_LOCKED_BLOCK_EVENTS(reg)   movb $1,evtchn_upcall_mask(reg)
-#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg)
+#define XEN_LOCKED_BLOCK_EVENTS(reg)   movb $1,evtchn_upcall_mask(reg) ; \
+                                       movb $1,no_desched(reg)
+#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) ; \
+                                       movb $0,no_desched(reg)
 #define XEN_BLOCK_EVENTS(reg)  XEN_GET_VCPU_INFO(reg)                  ; \
                                XEN_LOCKED_BLOCK_EVENTS(reg)            ; \
                                XEN_PUT_VCPU_INFO(reg)
diff -r ff9683032b76 -r b5bbaec70b34 include/asm-x86_64/mach-xen/asm/irqflags.h
--- a/include/asm-x86_64/mach-xen/asm/irqflags.h        Sat Dec 13 16:00:43 
2008 +0000
+++ b/include/asm-x86_64/mach-xen/asm/irqflags.h        Wed Dec 17 13:12:53 
2008 +0100
@@ -33,8 +33,12 @@ do {                                                         
        \
        vcpu_info_t *_vcpu;                                             \
        barrier();                                                      \
        _vcpu = current_vcpu_info();            \
-       if ((_vcpu->evtchn_upcall_mask = (x)) == 0) {                   \
+       if ( !(x) ) {                                                   \
+               _vcpu->no_desched = 0;                                  \
+               _vcpu->evtchn_upcall_mask = 0;                          \
                barrier(); /* unmask then check (avoid races) */        \
+               if ( unlikely(_vcpu->desched_delay) )                   \
+                       (void)((HYPERVISOR_sched_op(SCHEDOP_yield, _vcpu))?:0); 
\
                if ( unlikely(_vcpu->evtchn_upcall_pending) )           \
                        force_evtchn_callback();                        \
        }                                                               \
@@ -69,7 +73,10 @@ static inline int raw_irqs_disabled_flag
 
 #define raw_local_irq_disable()                                                
\
 do {                                                                   \
-       current_vcpu_info()->evtchn_upcall_mask = 1;                            
        \
+       vcpu_info_t *_vcpu;                                             \
+       _vcpu = current_vcpu_info();            \
+       _vcpu->evtchn_upcall_mask = 1;                                  \
+       _vcpu->no_desched = 1;                                          \
        barrier();                                                      \
 } while (0)
 
@@ -78,8 +85,11 @@ do {                                                         
        \
        vcpu_info_t *_vcpu;                                             \
        barrier();                                                      \
        _vcpu = current_vcpu_info();            \
+       _vcpu->no_desched = 0;                                          \
        _vcpu->evtchn_upcall_mask = 0;                                  \
        barrier(); /* unmask then check (avoid races) */                \
+       if ( unlikely(_vcpu->desched_delay) )                           \
+               (void)((HYPERVISOR_sched_op(SCHEDOP_yield, _vcpu))?:0); \
        if ( unlikely(_vcpu->evtchn_upcall_pending) )                   \
                force_evtchn_callback();                                \
 } while (0)
diff -r ff9683032b76 -r b5bbaec70b34 include/xen/interface/xen.h
--- a/include/xen/interface/xen.h       Sat Dec 13 16:00:43 2008 +0000
+++ b/include/xen/interface/xen.h       Wed Dec 17 13:12:53 2008 +0100
@@ -434,9 +434,18 @@ struct vcpu_info {
      * non-zero mask therefore guarantees that the VCPU will not receive
      * an upcall activation. The mask is cleared when the VCPU requests
      * to block: this avoids wakeup-waiting races.
+     *
+     * The guest can set 'no_desched' to a non-zero value to avoid being
+     * descheduled. If the hypervisor didn't deschedule the VCPU due to
+     * 'no_desched' being set, it will itself set 'desched_delay' to inform
+     * the guest to give up control voluntaryly later. This is just a wish
+     * of the guest which the hypervisor may not obey (and it will deschedule
+     * the guest after a reasonable time anyway).
      */
     uint8_t evtchn_upcall_pending;
     uint8_t evtchn_upcall_mask;
+    uint8_t no_desched;
+    uint8_t desched_delay;
     unsigned long evtchn_pending_sel;
     struct arch_vcpu_info arch;
     struct vcpu_time_info time;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

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