[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