Dave Johnson writes: > It appears a0 to detach_pid (*task) points to somewhere wrong as > 'link' (now in a1) is a valid pointer, but points to a bunch of > zeros. I found the issue. This appears to be a compiler bug in __unhash_process(). SMP (works): ----------- ffffffff8013c940: 0220f809 jalr s1 ffffffff8013c944: 0080802d move s0,a0 ffffffff8013c948: 24050001 li a1,1 ffffffff8013c94c: de020170 ld v0,368(s0) ffffffff8013c950: 12020015 beq s0,v0,ffffffff8013c9a8 <$L10> ffffffff8013c954: 0200202d move a0,s0 [...] ffffffff8013c9a8 <$L10>: ffffffff8013c9a8: 0220f809 jalr s1 <<< detach_pid(p, PIDTYPE_PGID); ffffffff8013c9ac: 00000000 nop ffffffff8013c9b0: 0200202d move a0,s0 ffffffff8013c9b4: 0220f809 jalr s1 <<< detach_pid(p, PIDTYPE_SID); ffffffff8013c9b8: 24050002 li a1,2 SMP+PREEMPT (fails): ------------------- ffffffff8013e62c: 0220f809 jalr s1 ffffffff8013e630: 0080802d move s0,a0 ffffffff8013e634: 24050001 li a1,1 ffffffff8013e638: de020170 ld v0,368(s0) ffffffff8013e63c: 12020016 beq s0,v0,ffffffff8013e698 <$L10> ffffffff8013e640: 0200202d move a0,s0 [...] ffffffff8013e698 <$L10>: ffffffff8013e698: 0220f809 jalr s1 <<< detach_pid(p, PIDTYPE_PGID); ffffffff8013e69c: 0200202d move a0,s0 ffffffff8013e6a0: 0220f809 jalr s1 <<< detach_pid(p, PIDTYPE_SID); ffffffff8013e6a4: 24050002 li a1,2 The delay slot is missing after the first call causing a0 to not get set for the second call. -- Dave Johnson Starent Networks