ChangeSet 1.1509.1.2, 2005/05/23 17:05:04-06:00, djm@xxxxxxxxxxxxxxx
Fix multi-domain scheduling bug
Signed-off by: Dan Magenheimer <dan.magenheimer@xxxxxx>
Makefile | 3 +++
domain.c | 1 +
hypercall.c | 4 ++++
patch/linux-2.6.11/entry.S | 25 ++++++++++++-------------
tools/mkbuildtree | 1 -
vcpu.c | 29 +++++++++++++++++++++++++++--
xenmisc.c | 9 ++++++---
7 files changed, 53 insertions(+), 19 deletions(-)
diff -Nru a/xen/arch/ia64/Makefile b/xen/arch/ia64/Makefile
--- a/xen/arch/ia64/Makefile 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/Makefile 2005-05-26 14:01:26 -04:00
@@ -29,6 +29,9 @@
$(LD) $(LDFLAGS) -T $(BASEDIR)/arch/$(TARGET_ARCH)/xen.lds.s -N \
-Map map.out head.o $(ALL_OBJS) -o $(TARGET)-syms
$(OBJCOPY) -R .note -R .comment -S $(TARGET)-syms $(TARGET)
+ $(NM) -n $(TARGET)-syms | grep -v '\( [aUw] \)\|\(__crc_\)\|\(
\$[adt]\)'\
+ > $(BASEDIR)/System.map
+
asm-offsets.s: asm-offsets.c $(BASEDIR)/include/asm-ia64/.offsets.h.stamp
$(CC) $(CFLAGS) -S -o $@ $<
diff -Nru a/xen/arch/ia64/domain.c b/xen/arch/ia64/domain.c
--- a/xen/arch/ia64/domain.c 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/domain.c 2005-05-26 14:01:26 -04:00
@@ -116,6 +116,7 @@
#endif
while ( !softirq_pending(cpu) )
default_idle();
+ raise_softirq(SCHEDULE_SOFTIRQ);
do_softirq();
}
}
diff -Nru a/xen/arch/ia64/hypercall.c b/xen/arch/ia64/hypercall.c
--- a/xen/arch/ia64/hypercall.c 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/hypercall.c 2005-05-26 14:01:26 -04:00
@@ -41,6 +41,10 @@
ed->vcpu_info->arch.pending_interruption = 1;
#endif
x = pal_emulator_static(regs->r28);
+ if (regs->r28 == PAL_HALT_LIGHT) {
+ do_sched_op(SCHEDOP_yield);
+ //break;
+ }
regs->r8 = x.status; regs->r9 = x.v0;
regs->r10 = x.v1; regs->r11 = x.v2;
break;
diff -Nru a/xen/arch/ia64/patch/linux-2.6.11/entry.S
b/xen/arch/ia64/patch/linux-2.6.11/entry.S
--- a/xen/arch/ia64/patch/linux-2.6.11/entry.S 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/patch/linux-2.6.11/entry.S 2005-05-26 14:01:26 -04:00
@@ -1,5 +1,5 @@
----
/home/adsharma/disk2/xen-ia64/xeno-unstable-rebase.bk/xen/../../linux-2.6.11/arch/ia64/kernel/entry.S
2005-03-01 23:37:50.000000000 -0800
-+++
/home/adsharma/disk2/xen-ia64/xeno-unstable-rebase.bk/xen/arch/ia64/entry.S
2005-05-18 12:40:51.000000000 -0700
+--- ../../linux-2.6.11/arch/ia64/kernel/entry.S 2005-03-02
00:37:50.000000000 -0700
++++ arch/ia64/entry.S 2005-05-23 16:49:23.000000000 -0600
@@ -46,6 +46,7 @@
#include "minstate.h"
@@ -97,11 +97,13 @@
;; // added stop bits to prevent
r8 dependency
END(ia64_ret_from_clone)
// fall through
-@@ -700,19 +732,25 @@
+@@ -700,19 +732,27 @@
.work_processed_syscall:
adds r2=PT(LOADRS)+16,r12
adds r3=PT(AR_BSPSTORE)+16,r12
-+#ifndef XEN
++#ifdef XEN
++ ;;
++#else
adds r18=TI_FLAGS+IA64_TASK_SIZE,r13
;;
(p6) ld4 r31=[r18] // load
current_thread_info()->flags
@@ -123,7 +125,7 @@
;;
// start restoring the state saved on the kernel stack (struct pt_regs):
ld8 r9=[r2],PT(CR_IPSR)-PT(R9)
-@@ -757,7 +795,11 @@
+@@ -757,7 +797,11 @@
;;
ld8.fill r12=[r2] // restore r12 (sp)
ld8.fill r15=[r3] // restore r15
@@ -135,7 +137,7 @@
;;
(pUStk) ld4 r3=[r3] // r3 = cpu_data->phys_stacked_size_p8
(pUStk) st1 [r14]=r17
-@@ -814,9 +856,18 @@
+@@ -814,9 +858,18 @@
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
#endif
.work_processed_kernel:
@@ -154,7 +156,7 @@
adds r21=PT(PR)+16,r12
;;
-@@ -828,17 +879,20 @@
+@@ -828,17 +881,20 @@
ld8 r28=[r2],8 // load b6
adds r29=PT(R24)+16,r12
@@ -176,7 +178,7 @@
;;
ld8 r31=[r2],16 // load ar.ssd
ld8.fill r8=[r3],16
-@@ -934,7 +988,11 @@
+@@ -934,7 +990,11 @@
shr.u r18=r19,16 // get byte size of existing "dirty" partition
;;
mov r16=ar.bsp // get existing backing store pointer
@@ -188,7 +190,7 @@
;;
ld4 r17=[r17] // r17 = cpu_data->phys_stacked_size_p8
(pKStk) br.cond.dpnt skip_rbs_switch
-@@ -1069,6 +1127,7 @@
+@@ -1069,6 +1129,7 @@
mov pr=r31,-1 // I0
rfi // B
@@ -196,7 +198,7 @@
/*
* On entry:
* r20 = ¤t->thread_info->pre_count (if CONFIG_PREEMPT)
-@@ -1130,6 +1189,7 @@
+@@ -1130,6 +1191,7 @@
ld8 r8=[r2]
ld8 r10=[r3]
br.cond.sptk.many .work_processed_syscall // re-check
@@ -204,7 +206,7 @@
END(ia64_leave_kernel)
-@@ -1166,6 +1226,7 @@
+@@ -1166,6 +1228,7 @@
br.ret.sptk.many rp
END(ia64_invoke_schedule_tail)
@@ -212,7 +214,7 @@
/*
* Setup stack and call do_notify_resume_user(). Note that pSys and
pNonSys need to
* be set up by the caller. We declare 8 input registers so the system
call
-@@ -1264,6 +1325,7 @@
+@@ -1264,6 +1327,7 @@
mov ar.unat=r9
br.many b7
END(sys_rt_sigreturn)
@@ -220,7 +222,7 @@
GLOBAL_ENTRY(ia64_prepare_handle_unaligned)
.prologue
-@@ -1278,6 +1340,7 @@
+@@ -1278,6 +1342,7 @@
br.cond.sptk.many rp // goes to
ia64_leave_kernel
END(ia64_prepare_handle_unaligned)
@@ -228,7 +230,7 @@
//
// unw_init_running(void (*callback)(info, arg), void *arg)
//
-@@ -1585,3 +1648,4 @@
+@@ -1585,3 +1650,4 @@
data8 sys_ni_syscall
.org sys_call_table + 8*NR_syscalls // guard against failures to
increase NR_syscalls
diff -Nru a/xen/arch/ia64/tools/mkbuildtree b/xen/arch/ia64/tools/mkbuildtree
--- a/xen/arch/ia64/tools/mkbuildtree 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/tools/mkbuildtree 2005-05-26 14:01:26 -04:00
@@ -307,7 +307,6 @@
softlink include/linux/topology.h include/asm-ia64/linux/topology.h
softlink include/linux/seqlock.h include/asm-ia64/linux/seqlock.h
softlink include/linux/jiffies.h include/asm-ia64/linux/jiffies.h
-softlink include/linux/jiffies.h include/asm-ia64/linux/jiffies.h
null include/asm-ia64/linux/file.h
null include/asm-ia64/linux/module.h
diff -Nru a/xen/arch/ia64/vcpu.c b/xen/arch/ia64/vcpu.c
--- a/xen/arch/ia64/vcpu.c 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/vcpu.c 2005-05-26 14:01:27 -04:00
@@ -638,7 +638,15 @@
{
int i;
UINT64 vector, mask;
-#if 1
+
+#define HEARTBEAT_FREQ 16 // period in seconds
+#ifdef HEARTBEAT_FREQ
+#define N_DOMS 16 // period in seconds
+ static long count[N_DOMS] = { 0 };
+ REGS *regs = vcpu_regs(vcpu);
+ unsigned domid = vcpu->domain->domain_id;
+#endif
+#ifdef IRQ_DEBUG
static char firstivr = 1;
static char firsttime[256];
if (firstivr) {
@@ -654,9 +662,21 @@
*pval = vector;
return IA64_NO_FAULT;
}
+#ifdef HEARTBEAT_FREQ
+ if (domid >= N_DOMS) domid = N_DOMS-1;
+ if (vector == (PSCB(vcpu,itv) & 0xff) &&
+ !(++count[domid] & ((HEARTBEAT_FREQ*1024)-1))) {
+ printf("Dom%d heartbeat... iip=%p,psr.i=%d,pend=%d\n",
+ domid, regs->cr_iip,
+ current->vcpu_info->arch.interrupt_delivery_enabled,
+ current->vcpu_info->arch.pending_interruption);
+ count[domid] = 0;
+ dump_runq();
+ }
+#endif
// now have an unmasked, pending, deliverable vector!
// getting ivr has "side effects"
-#if 0
+#ifdef IRQ_DEBUG
if (firsttime[vector]) {
printf("*** First get_ivr on vector=%d,itc=%lx\n",
vector,ia64_get_itc());
@@ -989,6 +1009,10 @@
UINT64 newnow = val, min_delta;
+#define DISALLOW_SETTING_ITC_FOR_NOW
+#ifdef DISALLOW_SETTING_ITC_FOR_NOW
+printf("vcpu_set_itc: Setting ar.itc is currently disabled\n");
+#else
local_irq_disable();
if (olditm) {
printf("**** vcpu_set_itc(%lx): vitm changed to %lx\n",val,newnow+d);
@@ -1008,6 +1032,7 @@
//using_xen_as_itm++;
}
local_irq_enable();
+#endif
return (IA64_NO_FAULT);
}
diff -Nru a/xen/arch/ia64/xenmisc.c b/xen/arch/ia64/xenmisc.c
--- a/xen/arch/ia64/xenmisc.c 2005-05-26 14:01:26 -04:00
+++ b/xen/arch/ia64/xenmisc.c 2005-05-26 14:01:26 -04:00
@@ -262,8 +262,8 @@
static long cnt[16] = { 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50};
static int i = 100;
int id = ((struct exec_domain *)current)->domain->domain_id & 0xf;
-if (!cnt[id]--) { printk("%x",id); cnt[id] = 50; }
-if (!i--) { printk("+",id); cnt[id] = 100; }
+if (!cnt[id]--) { printk("%x",id); cnt[id] = 500; }
+if (!i--) { printk("+",id); cnt[id] = 1000; }
}
clear_bit(_VCPUF_running, &prev->vcpu_flags);
//if (!is_idle_task(next->domain) )
@@ -273,7 +273,10 @@
vmx_load_all_rr(current);
return;
#else // CONFIG_VTI
- load_region_regs(current);
+ if (!is_idle_task(current->domain)) {
+ load_region_regs(current);
+ if (vcpu_timer_expired(current)) vcpu_pend_timer(current);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|