Eric Saxe wrote:
You mean, the a13fade0 was unpinned due to block on a mutex, and it was in turnstile before. Later, it was placed into run queue, because the the mutex was released by other ?

The clock interrupt was at some pointer pinning a13f7de0 (the priority 105 thread). When it passivated because the adaptive mutex it wanted was already held, it became a regular thread (a13fade0), scheduled just like everyone else. It waited in the sleep queue until the lock was dropped, at which point clock became runnable, and was then
enqueued in CPU 0's run queue.
Good explanation, thanks! :-)
But you mentioned "it waited in the sleep queue until the lock was dropped", but as far as I know, the thread should be in turnstile to wait a mutex, and only if thread wait a condition variable, it would be in the sleep queue. I just get it from book, I'm not sure, do you treat it as the same thing(turnstile and sleep queue)?

If it's a true, why it was not executed onproc immediately? Because it's have highest pri in the run queue.

You can check t_flag for the priority 105 thread, but I think it's because of this code in kpreempt(): http://src.opensolaris.org/source/xref/loficc/crypto/usr/src/uts/i86pc/os/trap.c#1440

So kpreempt() doesn't do much if it's an interrupt thread....likely because it's assumed interrupts are short. :)
OK, thanks for your hints. I'll check it.


The status of a13fade0 thread is run, and I think while system panic, the deadman should be running on CPU0. How can I find the stack of deadman? I know it should be high level interrupt, but I can't get any infomation from cpu_t cpu_intr_stack:
a13fade0 is priority 109, which is PIL 10. This is clock. The deadman cyclic fires at PIL 14, and it will pin whatever thread is running on the CPU. Because you panicked on CPU 0, this is where the deadman cyclic must have fired.
Thanks for your explanation. Yes, deadman paniced on the CPU0, I know that via output of ::msgbuf. But, as far as I known, the stack of hight level interrupts(PIL>10) should be pointed by cpu_intr_stack. I'm tried to get the stack of deadman by using cpu_intr_stack, it should work, but why I failed?

It looks like cpu_intr_stack is used to preserve the interrupt stack when we panic, but I would have to dig
further to know more....

It should be, you can refer to below code, it show that high level interrupts use cpu_intr_stack as stack pointer:

http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/i86pc/ml/interrupt.s#704

   704     /
   705     / Handle high-level nested interrupt on separate interrupt stack
   706     /
   707     testl    $CPU_INTR_ACTV_HIGH_LEVEL_MASK, %esi
   708     jnz    onstack            /* already on interrupt stack */
   709     movl    %esp, %eax
710 movl CPU_INTR_STACK(%ebx), %esp /* get on interrupt stack */
   711     pushl    %eax            /* save the thread stack pointer */

I looked in cbe.c at cbe_set_level(). The low, lock, and high levels, correspond to CBE_LOW_PIL, CBE_LOCK_PIL, and CBE_HIGH_PIL, which are defined in the architecture specific clock.h. Actually, it looks like CBE_LOW_PIL is 1 on
SPARC and 2 on x86.
OK, I see. Thanks a lot!


Sure. Thanks for the great question. By the way, I believe what you are seeing here is:
    6498937 system hang while doing MAX and snoop through bge

Yes, our team's test suite found this bug, but we really need to locate it belong to which subsystem. You know, sometimes, it's not easy to us. :-)


--
Cheers,

----------------------------------------------------------------------
Oliver Yang | OPG Engineering Operation | [EMAIL PROTECTED] | x82229

_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to