Re: USB audio w/ "D" state

Albert D. Cahalan (acahalan@cs.uml.edu)
Thu, 6 Dec 2001 00:34:01 -0500 (EST)


> I did "cat /bin/sh >> /dev/audio" and hit ^C to stop the noise.
> The "cat" process gets stuck in "D" state with the WCHAN indicating
> that the process is stuck 1/3 the way through the usbout_stop()
> function.
>
> hardware: Mac Cube and the normal spherical speakers (OHCI USB)
> kernel: plain 2.4.16 from www.kernel.org
> compiler: gcc version 2.95.4 20011006 (Debian prerelease)
>
> In case PPC assembly is useful to somebody, I've marked the instruction
> where the process gets stuck. The surrounding "bl" instructions look
> like infinite loops to me, but maybe I'm reading this wrong. The assembly
> is from: objdump -dl --start-address=0x1728 audio.o

I added --reloc to that. Since I had to copy by hand, I put the
branch targets on the right. I marked the WCHAN with '*' chars.
For those not used to PowerPC, "bl foo" is a function call to foo().

So here is a bit of the assembly:

1790: 38 60 00 01 li r3,1
1794: 48 00 00 01 bl schedule_timeout
*** 1798: ***** 7f a3 eb 78 *** mr **** r3,r29 ****************
179c: 48 00 00 01 bl __save_flags_ptr
17a0: 48 00 00 01 bl __cli

...and here is the C code for that:

schedule_timeout(1);
spin_lock_irqsave(&as->lock, flags);

The full disassembly:

usbout_stop():
1728: 94 21 ff d0 stwu r1,-48(r1)
172c: 7c 08 02 a6 mflr r0
1730: 7d 80 00 26 mfcr r12
1734: bf 81 00 20 stmw r28,32(r1)
1738: 90 01 00 34 stw r0,52(r1)
173c: 91 81 00 1c stw r12,28(r1)
1740: 3b e3 03 98 addi r31,r3,920
1744: 3b c0 00 01 li r30,1
1748: 3b a1 00 08 addi r29,r1,8
174c: 7f a3 eb 78 mr r3,r29
1750: 48 00 00 01 bl __save_flags_ptr
1754: 48 00 00 01 bl __cli
1758: 83 9f 00 24 lwz r28,36(r31)
175c: 57 80 07 34 rlwinm r0,r28,0,28,26
1760: 90 1f 00 24 stw r0,36(r31)
1764: 80 61 00 08 lwz r3,8(r1)
1768: 48 00 00 01 bl __restore_flags
176c: 73 80 00 0f andi. r0,r28,15
1770: 41 82 00 98 beq 1808 <usbout_stop+0xe0>
1774: 31 3e ff ff addic r9,r30,-1
1778: 7d 29 49 10 subfe r9,r9,r9
177c: 38 09 00 01 addi r0,r9,1
1780: 55 29 07 bc rlwinm r9,r9,0,30,30
1784: 2e 1e 00 00 cmpwi cr4,r30,0
1788: 7d 29 03 78 or r9,r9,r0
178c: 91 22 00 00 stw r9,0(r2)
1790: 38 60 00 01 li r3,1
1794: 48 00 00 01 bl schedule_timeout
*** 1798: ***** 7f a3 eb 78 *** mr **** r3,r29 ****************
179c: 48 00 00 01 bl __save_flags_ptr
17a0: 48 00 00 01 bl __cli
17a4: 83 9f 00 24 lwz r28,36(r31)
17a8: 80 61 00 08 lwz r3,8(r1)
17ac: 48 00 00 01 bl __restore_flags
17b0: 41 92 ff bc beq cr4,176c <usbout_stop+0x44>
17b4: 80 02 00 08 lwz r0,8(r2)
17b8: 2c 00 00 00 cmpwi r0,0
17bc: 41 82 ff b0 beq 176c <usbout_stop+0x44>
17c0: 73 80 00 01 andi. r0,r28,1
17c4: 41 82 00 0c beq 17d0 <usbout_stop+0xa8>
17c8: 38 7f 00 28 addi r3,r31,40
17cc: 48 00 00 01 bl usb_unlink_urb
17d0: 73 80 00 02 andi. r0,r28,2
17d4: 41 82 00 0c beq 17e0 <usbout_stop+0xb8>
17d8: 38 7f 00 cc addi r3,r31,204
17dc: 48 00 00 01 bl usb_unlink_urb
17e0: 73 80 00 04 andi. r0,r28,4
17e4: 41 82 00 0c beq 17f0 <usbout_stop+0xc8>
17e8: 38 7f 01 70 addi r3,r31,368
17ec: 48 00 00 01 bl usb_unlink_urb
17f0: 73 80 00 08 andi. r0,r28,8
17f4: 41 82 00 0c beq 1800 <usbout_stop+0xd8>
17f8: 38 7f 02 14 addi r3,r31,532
17fc: 48 00 00 01 bl usb_unlink_urb
1800: 3b c0 00 00 li r30,0
1804: 4b ff ff 68 b 176c <usbout_stop+0x44>
1808: 3b a0 00 00 li r29,0
180c: 93 a2 00 00 stw r29,0(r2)
1810: 80 7f 00 4c lwz r3,76(r31)
1814: 2c 03 00 00 cmpwi r3,0
1818: 41 82 00 08 beq 1820 <usbout_stop+0xf8>
181c: 48 00 00 01 bl kfree
1820: 80 7f 00 f0 lwz r3,240(r31)
1824: 2c 03 00 00 cmpwi r3,0
1828: 41 82 00 08 beq 1830 <usbout_stop+0x108>
182c: 48 00 00 01 bl kfree
1830: 80 7f 01 94 lwz r3,404(r31)
1834: 2c 03 00 00 cmpwi r3,0
1838: 41 82 00 08 beq 1840 <usbout_stop+0x118>
183c: 48 00 00 01 bl kfree
1840: 80 7f 02 38 lwz r3,568(r31)
1844: 2c 03 00 00 cmpwi r3,0
1848: 41 82 00 08 beq 1850 <usbout_stop+0x128>
184c: 48 00 00 01 bl kfree
1850: 93 bf 00 4c stw r29,76(r31)
1854: 93 bf 02 38 stw r29,568(r31)
1858: 93 bf 01 94 stw r29,404(r31)
185c: 93 bf 00 f0 stw r29,240(r31)
1860: 80 01 00 34 lwz r0,52(r1)
1864: 81 81 00 1c lwz r12,28(r1)
1868: 7c 08 03 a6 mtlr r0
186c: bb 81 00 20 lmw r28,32(r1)
1870: 7d 80 81 20 mtcrf 8,r12
1874: 38 21 00 30 addi r1,r1,48
1878: 4e 80 00 20 blr
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/