--
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
|