]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - arch/ia64/kernel/fsys.S
[IA64] fix siglock
[net-next-2.6.git] / arch / ia64 / kernel / fsys.S
index 3544d75e7cbd5f3150f4dfb9bea963f865e82fb1..471a1e783acacb799d0f58538637cde7bee55f1a 100644 (file)
@@ -280,7 +280,7 @@ ENTRY(fsys_gettimeofday)
 (p9)   cmp.eq p13,p0 = 0,r30   // if mmio_ptr, clear p13 jitter control
        ;;
        .pred.rel.mutex p8,p9
-(p8)   mov r2 = ar.itc         // CPU_TIMER. 36 clocks latency!!!
+       MOV_FROM_ITC(p8, p6, r2, r10)   // CPU_TIMER. 36 clocks latency!!!
 (p9)   ld8 r2 = [r30]          // MMIO_TIMER. Could also have latency issues..
 (p13)  ld8 r25 = [r19]         // get itc_lastcycle value
        ld8 r9 = [r22],IA64_TIMESPEC_TV_NSEC_OFFSET     // tv_sec
@@ -424,14 +424,26 @@ EX(.fail_efault, ld8 r14=[r33])                   // r14 <- *set
        andcm r14=r14,r17                       // filter out SIGKILL & SIGSTOP
 
 #ifdef CONFIG_SMP
-       mov r17=1
-       ;;
-       cmpxchg4.acq r18=[r31],r17,ar.ccv       // try to acquire the lock
+       // __ticket_spin_trylock(r31)
+       ld4 r17=[r31]
        mov r8=EINVAL                   // default to EINVAL
        ;;
+       extr r9=r17,17,15
+       ;;
+       xor r18=r17,r9
+       adds r19=1,r17
+       ;;
+       extr.u r18=r18,0,15
+       ;;
+       cmp.eq p0,p7=0,r18
+(p7)   br.cond.spnt.many .lock_contention
+       mov.m ar.ccv=r17
+       ;;
+       cmpxchg4.acq r9=[r31],r19,ar.ccv
+       ;;
+       cmp4.eq p0,p7=r9,r17
+(p7)   br.cond.spnt.many .lock_contention
        ld8 r3=[r2]                     // re-read current->blocked now that we hold the lock
-       cmp4.ne p6,p0=r18,r0
-(p6)   br.cond.spnt.many .lock_contention
        ;;
 #else
        ld8 r3=[r2]                     // re-read current->blocked now that we hold the lock
@@ -490,7 +502,17 @@ EX(.fail_efault, ld8 r14=[r33])                    // r14 <- *set
 (p6)   br.cond.spnt.few 1b                     // yes -> retry
 
 #ifdef CONFIG_SMP
-       st4.rel [r31]=r0                        // release the lock
+       // __ticket_spin_unlock(r31)
+       adds r31=2,r31
+       ;;
+       ld2.bias r2=[r31]
+       mov r3=65534
+       ;;
+       adds r2=2,r2
+       ;;
+       and r3=r3,r2
+       ;;
+       st2.rel [r31]=r3
 #endif
        SSM_PSR_I(p0, p9, r31)
        ;;
@@ -512,7 +534,17 @@ EX(.fail_efault, (p15) st8 [r34]=r3)
 
 .sig_pending:
 #ifdef CONFIG_SMP
-       st4.rel [r31]=r0                        // release the lock
+       // __ticket_spin_unlock(r31)
+       adds r31=2,r31
+       ;;
+       ld2.bias r2=[r31]
+       mov r3=65534
+       ;;
+       adds r2=2,r2
+       ;;
+       and r3=r3,r2
+       ;;
+       st2.rel [r31]=r3
 #endif
        SSM_PSR_I(p0, p9, r17)
        ;;
@@ -684,7 +716,7 @@ GLOBAL_ENTRY(paravirt_fsys_bubble_down)
        ;;
        mov ar.rsc=0                            // M2   set enforced lazy mode, pl 0, LE, loadrs=0
 #ifdef CONFIG_VIRT_CPU_ACCOUNTING
-       mov.m r30=ar.itc                        // M    get cycle for accounting
+       MOV_FROM_ITC(p0, p6, r30, r23)          // M    get cycle for accounting
 #else
        nop.m 0
 #endif