Hi David,

Sorry for the confusion of deadlock and Oops. I'm not that familiar with the terms...

here is the disassemble output of gdb:

.....
0x00000f95 <qh_completions+210>:        lock addl $0x0,0x0(%esp,1)
0x00000f9b <qh_completions+216>:        mov    0x8(%esi),%ebx
0x00000f9e <qh_completions+219>:        test   %bl,%bl
0x00000fa0 <qh_completions+221>:        js     0x11be <qh_completions+763>
0x00000fa6 <qh_completions+227>:        test   $0x40,%bl
0x00000fa9 <qh_completions+230>:        je     0x116e <qh_completions+683>
0x00000faf <qh_completions+236>:        movl   $0x1,0xffffffe4(%ebp)
0x00000fb6 <qh_completions+243>:        mov    0xffffffd0(%ebp),%eax
0x00000fb9 <qh_completions+246>:        addl   $0x1,0x14(%eax)
0x00000fbd <qh_completions+250>:        xor    %eax,%eax
0x00000fbf <qh_completions+252>:        xchg   %al,(%edi)
0x00000fc1 <qh_completions+254>:        test   %al,%al
0x00000fc3 <qh_completions+256>:        jle    0x1161 <qh_completions+670>
0x00000fc9 <qh_completions+262>:        mov    %ebx,0xc(%esp,1)
0x00000fcd <qh_completions+266>:        mov    0x8(%ebp),%edx
0x00000fd0 <qh_completions+269>:        mov    0x44(%esi),%eax
0x00000fd3 <qh_completions+272>:        mov    %edx,(%esp,1)
0x00000fd6 <qh_completions+275>:        mov    %edi,0x4(%esp,1)
0x00000fda <qh_completions+279>:        mov    %eax,0x8(%esp,1)
0x00000fde <qh_completions+283>:        call   0xc24 <qtd_copy_status>
0x00000fe3 <qh_completions+288>:        movl   $0x0,0xffffffdc(%ebp)
0x00000fea <qh_completions+295>:        cmpl   $0xffffff87,0x24(%edi)
0x00000fee <qh_completions+299>:        je     0x1147 <qh_completions+644>
0x00000ff4 <qh_completions+305>:        cmpl   $0xdead4ead,0x4(%edi)
0x00000ffb <qh_completions+312>:        jne    0x113a <qh_completions+631>
0x00001001 <qh_completions+318>:        movzbl (%edi),%eax
0x00001004 <qh_completions+321>:        test   %al,%al
0x00001006 <qh_completions+323>:        jg     0x112d <qh_completions+618>
0x0000100c <qh_completions+329>:        movb   $0x1,(%edi)
0x0000100f <qh_completions+332>:        mov    0xffffffd0(%ebp),%ecx
0x00001012 <qh_completions+335>:        mov    0x8(%ecx),%eax
0x00001015 <qh_completions+338>:        subl   $0x1,0x14(%ecx)
0x00001019 <qh_completions+342>:        test   $0x8,%al
0x0000101b <qh_completions+344>:        jne    0x1123 <qh_completions+608>
0x00001021 <qh_completions+350>:        mov    0xffffffe4(%ebp),%eax
-------------  that's the spot (0x162/0x35d)
0x00001024 <qh_completions+353>:        test   %eax,%eax
-------------
0x00001026 <qh_completions+355>:        je     0x1035 <qh_completions+370>
0x00001028 <qh_completions+357>:        mov    0x3c(%esi),%edx
0x0000102b <qh_completions+360>:        cmp    0xffffffd4(%ebp),%edx
0x0000102e <qh_completions+363>:        je     0x1035 <qh_completions+370>
0x00001030 <qh_completions+365>:        mov    (%esi),%eax
0x00001032 <qh_completions+367>:        mov    %eax,0xffffffc8(%edx)
0x00001035 <qh_completions+370>:        lea    0x38(%esi),%ecx
0x00001038 <qh_completions+373>:        mov    0x38(%esi),%eax
0x0000103b <qh_completions+376>:        mov    0x4(%ecx),%edx
0x0000103e <qh_completions+379>:        mov    %edx,0x4(%eax)
0x00001041 <qh_completions+382>:        mov    %eax,(%edx)
0x00001043 <qh_completions+384>:        movl   $0x200200,0x4(%ecx)
0x0000104a <qh_completions+391>:        movl   $0x100100,0x38(%esi)
0x00001051 <qh_completions+398>:        mov    %esi,0xfffffff0(%ebp)
0x00001054 <qh_completions+401>:        mov    0xffffffe8(%ebp),%eax
0x00001057 <qh_completions+404>:        mov    (%eax),%edx
0x00001059 <qh_completions+406>:        cmp    0xffffffd4(%ebp),%eax
0x0000105c <qh_completions+409>:        mov    %edx,0xffffffe8(%ebp)
0x0000105f <qh_completions+412>:        jne    0xf34 <qh_completions+113>
0x00001065 <qh_completions+418>:        mov    0xfffffff0(%ebp),%eax
0x00001068 <qh_completions+421>:        test   %eax,%eax
.....

This seems to be somewhere in this part of the code:

.....
       /* remove it from the queue */
       spin_lock (&urb->lock);
       qtd_copy_status (ehci, urb, qtd->length, token);
       do_status = (urb->status == -EREMOTEIO)
               && usb_pipecontrol (urb->pipe);
       spin_unlock (&urb->lock);

if (stopped && qtd->qtd_list.prev != &qh->qtd_list) {
last = list_entry (qtd->qtd_list.prev,
struct ehci_qtd, qtd_list);
last->hw_next = qtd->hw_next;
}
list_del (&qtd->qtd_list);
last = qtd;
....


Andreas

David Brownell wrote:

Hi Andreas,

These aren't really examples of a "deadlock", they're just oopses.
Can you disassemble the qh_completions() code and find out what
it's trying to execute when it oopses?  Either GDB or "objdump"
can be used.

This is a new one, but at least it looks like it's the same spot
in the code each time ... so maybe it's simple.  I've not done
as much SMP testing with EHCI as I'd like.

- Dave



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to