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

[Xen-changelog] Handle dup tick in hyper_get_ivr



ChangeSet 1.1713.2.15, 2005/06/21 10:14:17-06:00, djm@xxxxxxxxxxxxxxx

        Handle dup tick in hyper_get_ivr
        Signed-off-by: Dan Magenheimer <dan.magenheimer@xxxxxx>



 asm-offsets.c |    2 +
 hyperprivop.S |   62 +++++++++++++---------------------------------------------
 2 files changed, 16 insertions(+), 48 deletions(-)


diff -Nru a/xen/arch/ia64/asm-offsets.c b/xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c       2005-06-23 07:04:16 -04:00
+++ b/xen/arch/ia64/asm-offsets.c       2005-06-23 07:04:16 -04:00
@@ -61,6 +61,7 @@
        DEFINE(XSI_PEND_OFS, offsetof(vcpu_info_t, arch.pending_interruption));
        DEFINE(XSI_RR0_OFS, offsetof(vcpu_info_t, arch.rrs[0]));
        DEFINE(XSI_TPR_OFS, offsetof(vcpu_info_t, arch.tpr));
+       DEFINE(XSI_ITV_OFS, offsetof(vcpu_info_t, arch.itv));
        //DEFINE(IA64_TASK_BLOCKED_OFFSET,offsetof (struct task_struct, 
blocked));
        //DEFINE(IA64_TASK_CLEAR_CHILD_TID_OFFSET,offsetof (struct task_struct, 
clear_child_tid));
        //DEFINE(IA64_TASK_GROUP_LEADER_OFFSET, offsetof (struct task_struct, 
group_leader));
@@ -83,6 +84,7 @@
        DEFINE(IA64_VCPU_STARTING_RID_OFFSET, offsetof (struct vcpu, 
arch.starting_rid));
        DEFINE(IA64_VCPU_ENDING_RID_OFFSET, offsetof (struct vcpu, 
arch.ending_rid));
        DEFINE(IA64_VCPU_DOMAIN_ITM_OFFSET, offsetof (struct vcpu, 
arch.domain_itm));
+       DEFINE(IA64_VCPU_DOMAIN_ITM_LAST_OFFSET, offsetof (struct vcpu, 
arch.domain_itm_last));
 
        BLANK();
        DEFINE(IA64_CPUINFO_ITM_NEXT_OFFSET, offsetof (struct cpuinfo_ia64, 
itm_next));
diff -Nru a/xen/arch/ia64/hyperprivop.S b/xen/arch/ia64/hyperprivop.S
--- a/xen/arch/ia64/hyperprivop.S       2005-06-23 07:04:16 -04:00
+++ b/xen/arch/ia64/hyperprivop.S       2005-06-23 07:04:16 -04:00
@@ -606,11 +606,6 @@
        ;;
 END(hyper_set_tpr)
 
-#if 1
-// This seems to work, but I saw a flurry of "timer tick before it's due"
-// so will leave the old version around until this gets understood/tracked down
-// Also, vcpu_get_ivr provides a domain "heartbeat" for debugging, so we
-// need to be able to easily turn that back on.
 ENTRY(hyper_get_ivr)
 #ifdef FAST_HYPERPRIVOP_CNT
        movl r22=fast_hyperpriv_cnt+(8*XEN_HYPER_GET_IVR);;
@@ -618,17 +613,16 @@
        adds r21=1,r21;;
        st8 [r22]=r21;;
 #endif
-       mov r30=r0;;
        mov r8=15;;
        // when we get to here r20=~=interrupts pending
        cmp.eq p7,p0=r20,r0;;
 (p7)   adds r20=XSI_PEND_OFS-XSI_PSR_IC_OFS,r18 ;;
-(p7)   st4 [r20]=r30;;
+(p7)   st4 [r20]=r0;;
 (p7)   br.spnt.many 1f ;;
-       mov r22=IA64_KR(CURRENT);;
-       adds r24=IA64_VCPU_INSVC3_OFFSET,r22;;
+       mov r30=IA64_KR(CURRENT);;
+       adds r24=IA64_VCPU_INSVC3_OFFSET,r30;;
        mov r25=192
-       adds r22=IA64_VCPU_IRR3_OFFSET,r22;;
+       adds r22=IA64_VCPU_IRR3_OFFSET,r30;;
        ld8 r23=[r22];;
        cmp.eq p6,p0=r23,r0;;
 (p6)   adds r22=-8,r22;;
@@ -693,6 +687,16 @@
        andcm r25=r25,r27;;
        st8 [r22]=r25;;
        mov r8=r26;;
+       // if its a clock tick, remember itm to avoid delivering it twice
+       adds r20=XSI_ITV_OFS-XSI_PSR_IC_OFS,r18 ;;
+       ld8 r20=[r20];;
+       extr.u r20=r20,0,8;;
+       cmp.eq p6,p0=r20,r8
+       adds r22=IA64_VCPU_DOMAIN_ITM_LAST_OFFSET,r30
+       adds r23=IA64_VCPU_DOMAIN_ITM_OFFSET,r30;;
+       ld8 r23=[r23];;
+(p6)   st8 [r22]=r23;;
+       // all done
 1:     mov r24=cr.ipsr
        mov r25=cr.iip;;
        extr.u r26=r24,41,2 ;;
@@ -709,44 +713,6 @@
        rfi
        ;;
 END(hyper_get_ivr)
-#else
-// This version goes to slow path unless all irr bits are zero, in which
-// case it simply returns SPURIOUS and sets pending to zero.  Since a domain
-// gets cr.ivr approx twice per interrupt (once to get the vector and
-// once to see if there are any more), this version still gets used
-// for approximately half of all gets of cr.ivr
-ENTRY(hyper_get_ivr)
-       // when we get to here r20=~=interrupts pending
-       cmp.ne p7,p0=r20,r0
-(p7)   br.spnt.many dispatch_break_fault ;;
-#ifdef FAST_HYPERPRIVOP_CNT
-       movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_GET_IVR);;
-       ld8 r21=[r20];;
-       adds r21=1,r21;;
-       st8 [r20]=r21;;
-#endif
-// if we get to here, there are no interrupts pending so we
-// force pending to zero and return SPURIOUS_VECTOR
-       adds r20=XSI_PEND_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r20]=r0;;
-       mov r8=15;;
-       mov r24=cr.ipsr
-       mov r25=cr.iip;;
-       extr.u r26=r24,41,2 ;;
-       cmp.eq p6,p7=2,r26 ;;
-(p6)   mov r26=0
-(p6)   adds r25=16,r25
-(p7)   adds r26=1,r26
-       ;;
-       dep r24=r26,r24,41,2
-       ;;
-       mov cr.ipsr=r24
-       mov cr.iip=r25
-       mov pr=r31,-1 ;;
-       rfi
-       ;;
-END(hyper_get_ivr)
-#endif
 
 ENTRY(hyper_eoi)
        // when we get to here r20=~=interrupts pending

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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