[parisc-linux] Re:[parisc-linux-cvs] linux-2.6 kyle

Joel Soete soete.joel at tiscali.be
Sun Aug 6 12:26:37 MDT 2006



Joel Soete wrote:
> 
> 
[snip]
>>
> :_( (I have hoping but) that doesn't fix the soft lockup pb:
> patst007 login: BUG: soft lockup detected on CPU#0!
> show_stack(1).
> Backtrace:
>  [<101560d8>] softlockup_tick+0xd4/0x148
>  [<1013be90>] update_process_times+0x3c/0x88
>  [<101091dc>] timer_interrupt+0xd0/0x1b0
>  [<10156534>] handle_IRQ_event+0x5c/0xa4
>  [<10156614>] __do_IRQ+0x98/0x1d0
>  [<10109960>] do_cpu_irq_mask+0xdc/0x194
>  [<1010c068>] intr_return+0x0/0x1c
> 
> 
Anyway this time on this 32bit smp kernel I reach to grab some interesting stuff from toc:
in summary :
on cpu#0:
rp ==> _raw_read_lock()

iaoq ==> generic__raw_read_trylock()

GR[26] == arg0 = 00000000104a3e40

while on cpu#1

rp ==> copy_process()

iaoq ==> _raw_write_lock()

GR[26] == arg0 = 00000000104a3e40


btw i am a bit confused by this first fnct:

the .s file shows me
         .type   _raw_read_lock, @function
_raw_read_lock:
         .PROC
         .CALLINFO FRAME=128,CALLS,SAVE_RP,ENTRY_GR=8
         .ENTRY
         stw %r2,-20(%r30)
         ldil L'-558956544,%r28
         ldo 7917(%r28),%r28
         stw,ma %r8,128(%r30)
         stw %r5,-116(%r30)
         stw %r7,-124(%r30)
         stw %r6,-120(%r30)
         stw %r4,-112(%r30)
         stw %r3,-108(%r30)
         ldw 8(%r26),%r19
         cmpb,<> %r28,%r19,.L123
         copy %r26,%r5
         copy %r5,%r26
.L127:
         b,l generic__raw_read_trylock,%r2
         ldi 1,%r6
         addil LR'loops_per_jiffy-$global$,%r27
         cmpib,= 0,%r28,.L121
         copy %r1,%r7
.L110:
         ldw -148(%r30),%r2
         ldw -124(%r30),%r7
         ldw -120(%r30),%r6
         ldw -116(%r30),%r5
         ldw -112(%r30),%r4
         ldw -108(%r30),%r3
         bve (%r2)
         ldw,mb -128(%r30),%r8
.L126:
#APP
         mfctl 30,%r28
         mfctl 30,%r19
         mfctl 30,%r20
#NO_APP
         ldil LR'.LC8,%r26
         ldw 16(%r28),%r25
         ldw 0(%r19),%r24
         ldo RR'.LC8(%r26),%r26
         ldw 0(%r20),%r28
         ldo 396(%r24),%r24
         ldw 168(%r28),%r23
         ldi 0,%r6
         b,l printk,%r2
         stw %r5,-52(%r30)
         b,l dump_stack,%r2
         nop
.L121:
         ldw RR'loops_per_jiffy-$global$(%r7),%r19
.L128:
         ldi 0,%r3
         ldi 0,%r4
         depw,z %r19,26,27,%r28
         sub %r28,%r19,%r28
         shladd,l %r28,2,%r19,%r19
         depw,z %r19,28,29,%r19
         cmpib,= 0,%r19,.L104
         ldi 1,%r8
.L122:
         b,l generic__raw_read_trylock,%r2
         copy %r5,%r26
         cmpib,<> 0,%r28,.L110
         copy %r8,%r28
#APP
                 .balignl        64,0x34000034
         addib,UV -1,%r28,.
         nop

#NO_APP
         ldw RR'loops_per_jiffy-$global$(%r7),%r28
         depw,z %r28,26,27,%r19
         sub %r19,%r28,%r19
         addi 1,%r4,%r4
         add,c %r3,%r0,%r3
         shladd,l %r19,2,%r28,%r28
         ldi 0,%r19
         cmpb,<< %r3,%r19,.L122
         depw,z %r28,28,29,%r28
         cmpb,=,n %r3,%r19,.L124
.L104:
         cmpib,= 0,%r6,.L128
         ldw RR'loops_per_jiffy-$global$(%r7),%r19
         b,n .L126
.L124:
         cmpb,<< %r4,%r28,.L122
         nop
         b,n .L104
.L123:
         ldil LR'.LC1,%r25
         b,l rwlock_bug,%r2
         ldo RR'.LC1(%r25),%r25
         b .L127
         copy %r5,%r26
         .EXIT
         .PROCEND
         .size   _raw_read_lock, .-_raw_read_lock

and the objdump tells me what are the actual insn:
10249e00 <_raw_read_lock>:
10249e00:       6b c2 3f d9     stw rp,-14(sp)
10249e04:       23 98 cb d5     ldil L%-21510000,ret0
10249e08:       37 9c 3d da     ldo 1eed(ret0),ret0
10249e0c:       6f c8 01 00     stw,ma r8,80(sp)
10249e10:       6b c5 3f 19     stw r5,-74(sp)
10249e14:       6b c7 3f 09     stw r7,-7c(sp)
10249e18:       6b c6 3f 11     stw r6,-78(sp)
10249e1c:       6b c4 3f 21     stw r4,-70(sp)
10249e20:       6b c3 3f 29     stw r3,-6c(sp)
10249e24:       0f 50 10 93     ldw 8(r26),r19
10249e28:       8a 7c 22 30     cmpb,<> ret0,r19,10249f48 <_raw_read_lock+0x148>
10249e2c:       08 1a 02 45     copy r26,r5
10249e30:       08 05 02 5a     copy r5,r26
10249e34:       eb 5d bc 99     b,l 10104c88 <generic__raw_read_trylock>,rp
10249e38:       34 06 00 02     ldi 1,r6
10249e3c:       2b 60 00 00     addil L%0,dp,r1
10249e40:       87 80 20 b8     cmpib,= 0,ret0,10249ea4 <_raw_read_lock+0xa4>
10249e44:       08 01 02 47     copy r1,r7
10249e48:       4b c2 3e d9     ldw -94(sp),rp
10249e4c:       4b c7 3f 09     ldw -7c(sp),r7
10249e50:       4b c6 3f 11     ldw -78(sp),r6
10249e54:       4b c5 3f 19     ldw -74(sp),r5
10249e58:       4b c4 3f 21     ldw -70(sp),r4
10249e5c:       4b c3 3f 29     ldw -6c(sp),r3
10249e60:       e8 40 d0 00     bve (rp)
10249e64:       4f c8 3f 01     ldw,mb -80(sp),r8
10249e68:       03 c0 08 bc     mfctl tr6,ret0
10249e6c:       03 c0 08 b3     mfctl tr6,r19
10249e70:       03 c0 08 b4     mfctl tr6,r20
10249e74:       23 58 c2 06     ldil L%103f0000,r26
10249e78:       4b 99 00 20     ldw 10(ret0),r25
10249e7c:       0e 60 10 98     ldw 0(r19),r24
10249e80:       37 5a 0b c0     ldo 5e0(r26),r26
10249e84:       0e 80 10 9c     ldw 0(r20),ret0
10249e88:       37 18 03 18     ldo 18c(r24),r24
10249e8c:       4b 97 01 50     ldw a8(ret0),r23
10249e90:       34 06 00 00     ldi 0,r6
10249e94:       eb 71 bc 75     b,l 1012dcd4 <printk>,rp
10249e98:       6b c5 3f 99     stw r5,-34(sp)
10249e9c:       eb 5f a7 01     b,l 10108224 <dump_stack>,rp
10249ea0:       08 00 02 40     nop
10249ea4:       48 f3 01 18     ldw 8c(r7),r19
10249ea8:       34 03 00 00     ldi 0,r3
10249eac:       34 04 00 00     ldi 0,r4
10249eb0:       d7 93 08 a5     depw,z r19,26,27,ret0
10249eb4:       0a 7c 04 3c     sub ret0,r19,ret0
10249eb8:       0a 7c 0a b3     shladd,l ret0,2,r19,r19
10249ebc:       d6 73 08 63     depw,z r19,28,29,r19
10249ec0:       86 60 20 d0     cmpib,= 0,r19,10249f30 <_raw_read_lock+0x130>
10249ec4:       34 08 00 02     ldi 1,r8
10249ec8:       eb 5d bb 71     b,l 10104c88 <generic__raw_read_trylock>,rp
10249ecc:       08 05 02 5a     copy r5,r26
10249ed0:       8f 80 3e e5     cmpib,<> 0,ret0,10249e48 <_raw_read_lock+0x48>
10249ed4:       08 08 02 5c     copy r8,ret0
10249ed8:       34 00 00 34     ldi 1a,r0
10249edc:       34 00 00 34     ldi 1a,r0
10249ee0:       34 00 00 34     ldi 1a,r0
10249ee4:       34 00 00 34     ldi 1a,r0
10249ee8:       34 00 00 34     ldi 1a,r0
10249eec:       34 00 00 34     ldi 1a,r0
10249ef0:       34 00 00 34     ldi 1a,r0
10249ef4:       34 00 00 34     ldi 1a,r0
10249ef8:       34 00 00 34     ldi 1a,r0
10249efc:       34 00 00 34     ldi 1a,r0
10249f00:       af 9f 9f f5     addib,uv -1,ret0,10249f00 <_raw_read_lock+0x100>
10249f04:       08 00 02 40     nop
10249f08:       48 fc 01 18     ldw 8c(r7),ret0
10249f0c:       d6 7c 08 a5     depw,z ret0,26,27,r19
10249f10:       0b 93 04 33     sub r19,ret0,r19
10249f14:       b4 84 00 02     addi 1,r4,r4
10249f18:       08 03 07 03     add,c r3,r0,r3
10249f1c:       0b 93 0a bc     shladd,l r19,2,ret0,ret0
10249f20:       34 13 00 00     ldi 0,r19
10249f24:       82 63 9f 3d     cmpb,<< r3,r19,10249ec8 <_raw_read_lock+0xc8>
10249f28:       d7 9c 08 63     depw,z ret0,28,29,ret0
10249f2c:       82 63 20 12     cmpb,=,n r3,r19,10249f3c <_raw_read_lock+0x13c>
10249f30:       84 c0 3e e5     cmpib,= 0,r6,10249ea8 <_raw_read_lock+0xa8>
10249f34:       48 f3 01 18     ldw 8c(r7),r19
10249f38:       e8 1f 1e 57     b,l,n 10249e68 <_raw_read_lock+0x68>,r0
10249f3c:       83 84 9f 0d     cmpb,<< r4,ret0,10249ec8 <_raw_read_lock+0xc8>
10249f40:       08 00 02 40     nop
10249f44:       e8 1f 1f cf     b,l,n 10249f30 <_raw_read_lock+0x130>,r0
10249f48:       23 38 c2 06     ldil L%103f0000,r25
10249f4c:       eb ff b6 ad     b,l 10249aa8 <rwlock_bug>,rp
10249f50:       37 39 0a 78     ldo 53c(r25),r25
10249f54:       e8 1f 1d b5     b,l 10249e34 <_raw_read_lock+0x34>,r0
10249f58:       08 05 02 5a     copy r5,r26
         ...

specialy around the toc info:
--- snip ---
10249e2c:       08 1a 02 45     copy r26,r5
10249e30:       08 05 02 5a     copy r5,r26
10249e34:       eb 5d bc 99     b,l 10104c88 <generic__raw_read_trylock>,rp
10249e38:       34 06 00 02     ldi 1,r6
10249e3c:       2b 60 00 00     addil L%0,dp,r1
10249e40:       87 80 20 b8     cmpib,= 0,ret0,10249ea4 <_raw_read_lock+0xa4>
10249e44:       08 01 02 47     copy r1,r7
--- snip ---

which came from .s file:
--- snip ---
         copy %r26,%r5
         copy %r5,%r26
.L127:
         b,l generic__raw_read_trylock,%r2
         ldi 1,%r6
         addil LR'loops_per_jiffy-$global$,%r27
         cmpib,= 0,%r28,.L121
         copy %r1,%r7
--- snip ---

where 'addil i,r,r1 "add the upper portion of a 32bit immediate value to a general register"'

Back to C code:
void _raw_read_lock(rwlock_t *lock)
{
         RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");
         if (unlikely(!__raw_read_trylock(&lock->raw_lock)))
                 __read_lock_debug(lock);
}

which is precompiled like:
void _raw_read_lock(rwlock_t *lock)
{
  if (__builtin_expect(!!(lock->magic != 0xdeaf1eed), 0)) rwlock_bug(lock, "bad magic");
  if (__builtin_expect(!!(!generic__raw_read_trylock(&lock->raw_lock)), 0))
   __read_lock_debug(lock);
}

and
static void __read_lock_debug(rwlock_t *lock)
{
         int print_once = 1;
         u64 i;

         for (;;) {
                 for (i = 0; i < loops_per_jiffy * HZ; i++) {
                         if (__raw_read_trylock(&lock->raw_lock))
                                 return;
                         __delay(1);
                 }
                 /* lockup suspected: */
                 if (print_once) {
                         print_once = 0;
                         printk(KERN_EMERG "BUG: read-lock lockup on CPU#%d, "
                                         "%s/%d, %p\n",
                                 raw_smp_processor_id(), current->comm,
                                 current->pid, lock);
                         dump_stack();
                 }
         }
}

in turn precompiled like:
static void __read_lock_debug(rwlock_t *lock)
{
  int print_once = 1;
  u64 i;

  for (;;) {
   for (i = 0; i < loops_per_jiffy * 1000; i++) {
    if (generic__raw_read_trylock(&lock->raw_lock))
     return;
    __delay(1);
   }

   if (print_once) {
    print_once = 0;
    printk("<0>" "BUG: read-lock lockup on CPU#%d, "
      "%s/%d, %p\n",
     (((struct thread_info *)({ unsigned long cr; __asm__ __volatile__( "mfctl " "30" ",%0" : "=r" (cr) ); cr; }))->cpu), 
get_current()->comm,
     get_current()->pid, lock);
    dump_stack();
   }
  }
}

as the only loops_per_jiffy ref is in the for loop:
   for (i = 0; i < loops_per_jiffy * HZ; i++) {

and looking for HZ and loops_per_jiffy:

include/asm-parisc/param.h:
#ifdef __KERNEL__
# ifdef CONFIG_PA20
#  define HZ            1000            /* Faster machines */
# else
#  define HZ            100             /* Internal kernel timer frequency */
# endif

here 1000 because I choose PA8000 as cpu

init/main.c:unsigned long loops_per_jiffy = (1<<12);

confirm by objdump of vmlinux:
1044a09c <loops_per_jiffy>:
1044a09c:       00 00 10 00     #    1000

i.e. (1<<12) == 0x1000 == 4096

4096 * 1000 == 0x3e8000

bringing the upper portion still stay 0x3e.

What's wrong in this reasoning?

TIA,
     Joel



More information about the parisc-linux mailing list