[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] USB2.0 disk format failure in windows guest
From: |
Gonglei (Arei) |
Subject: |
Re: [Qemu-devel] USB2.0 disk format failure in windows guest |
Date: |
Tue, 16 Apr 2013 03:40:25 +0000 |
> -----Original Message-----
> From: Alan Stern [mailto:address@hidden
> Sent: Tuesday, April 16, 2013 1:44 AM
> To: Gonglei (Arei)
> Cc: address@hidden; Yanqiangjun; Hanweidong; Luonengjun;
> address@hidden; address@hidden; address@hidden
> Subject: RE: USB2.0 disk format failure in windows guest
>
> On Sun, 14 Apr 2013, Gonglei (Arei) wrote:
>
> > > > Hi Alan,
> > > > We pass-throughed USB 2.0 disk to guest using usb-host (qemu option:
> > > -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=2,hostport=1)
> on
> > > KVM(on linux-3.8.3 or linux-3.0.13) and qemu 1.4.0 ,
> > >
> > > Are you sure this disk was using EHCI? The attached log shows bulk
> > > packet sizes that aren't multiples of 512, which isn't possible in the
> > > middle of a high-speed transfer.
> >
> > Yes, this disk was using EHCI, since guest QEMU and Linux kernel both
> > prints matching EHCI logs, such as transfer types and transfer sizes.
> > There are many buck-out URBs whose sizes are 31 or 4064 that are not
> > multiples of 512. Since URB size 31 does occur without guest format
> > USB 2.0 disk sceneiro, did you mean that buck-out size 4064 should
> > not occur? /* EHCI spec version 1.0 Section 4.10.6 */
>
> That's right; it should not occur.
>
> It's okay to have an URB size that isn't a multiple of 512 if that URB
> is the last one in a transfer. For example, the 31-byte URBs were the
> only URBs in their transfers, so they were okay. But the 4064-byte
> URBs occurred at the start and in the middle of their transfers, so
> they were wrong.
>
Alan, the code which get the virtual machine USB packet in the Qemu is as
follows:
# /qemu-1.4.0/hw/usb/hcd-ehci.c
static int ehci_init_transfer(EHCIPacket *p)
{
uint32_t cpage, offset, bytes, plen;
dma_addr_t page;
cpage = get_field(p->qtd.token, QTD_TOKEN_CPAGE);
bytes = get_field(p->qtd.token, QTD_TOKEN_TBYTES);
offset = p->qtd.bufptr[0] & ~QTD_BUFPTR_MASK;
pci_dma_sglist_init(&p->sgl, &p->queue->ehci->dev, 5);
while (bytes > 0) {
if (cpage > 4) {
fprintf(stderr, "cpage out of range (%d)\n", cpage);
return USB_RET_PROCERR;
}
page = p->qtd.bufptr[cpage] & QTD_BUFPTR_MASK;
page += offset;
plen = bytes;
if (plen > 4096 - offset) {
plen = 4096 - offset;
offset = 0;
cpage++;
}
qemu_sglist_add(&p->sgl, page, plen);
bytes -= plen;
}
return 0;
}
After our repeated verification and debug, we found that windows virtual
machine USB disk format will send a 64Kbits's URB packet which was divided into
four QTD (Size: 19968,16384,16384,12800):
The first QTD offset is 32, split into five URB 4064/4096/4096/4096/3616 bits (
we don't understand why the offset is always 32, but the linux virtual machine
is always 0)
The second QTD offset 3616, split into five URB 480/4096/4096/4096/3616 bits
Third QTD offset is 3616, split into five URB 480/4096/4096/4096/3616 bits
Fourth QTD offset is 3616, split into five URB 480/4096/4096/4096/32 bits
> > > What kernel version did you use while recording this log?
> >
> > We tested KVM on Linux 3.8.3 and Linux 3.0.13, and the problem exists
> > on both kernels.
>
> But which kernel version did you use while recording the log that you
> posted?
Sorry, the kernel version is Linux-3.8.3 while recording the log.
>
> Also, what type of computer is your host?
The host's system Information:
Manufacturer: Huawei Technologies Co., Ltd.
Product Name: Tecal RH2285
BTW, we tested on the IBM Server (IBM System X iDataPlex dx360 M4 Server
-[7912FT1]-), and got the same results.
>
> > This time we attached a usbmon USB disk format failed log and
> > USBlyzer' logs for another test. Would you give us some advice,
> > thanks a lot!
> >
> > Something look like:
> >
> > ffff88180b974600 480512312 S Bo:6:009:2 -115 31 = 55534243 50599784
> 00000100 00000a2a 00000008 de000080 00000000 000000
> > ffff88180b974600 480512375 C Bo:6:009:2 0 31 >
> > ffff88180b974600 480513372 S Bo:6:009:2 -115 4064 = f8ffff0f ffffff0f
> > ffffff0f
> 00000000 00000000 00000000 00000000 00000000
>
> This is a lot more concise than the other log, but it still shows the
> same problem: the 4064-byte URB.
>
> Can you post the contents of the /sys/kernel/debug/usb/devices file?
>
OK, it looks like
$ cat /sys/kernel/debug/usb/devices
T: Bus=06 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev= 3.08
S: Manufacturer=Linux 3.8.3-0.27-gonglei ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:00:1d.7
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms
T: Bus=06 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 9 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=136b ProdID=0003 Rev= 1.00
S: Manufacturer=STEC
S: Product=STEC USB 2.0
S: SerialNumber=86C7150011163C1E
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=300mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
T: Bus=06 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 8 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0781 ProdID=5571 Rev= 1.26
S: Manufacturer=SanDisk
S: Product=Cruzer Fit
S: SerialNumber=4C532000060611107175
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=125us
T: Bus=05 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 2
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev= 3.08
S: Manufacturer=Linux 3.8.3-0.27-gonglei ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:00:1a.7
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms
T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 3.08
S: Manufacturer=Linux 3.8.3-0.27-gonglei uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:1d.2
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 3.08
S: Manufacturer=Linux 3.8.3-0.27-gonglei uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:1d.1
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 3.08
S: Manufacturer=Linux 3.8.3-0.27-gonglei uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:1d.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 4/900 us ( 0%), #Int= 1, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 3.08
S: Manufacturer=Linux 3.8.3-0.27-gonglei uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:1a.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=12d1 ProdID=0003 Rev= 1.00
S: Manufacturer=Huawei Technologies
S: Product=HUAWEI Keyboard/Mouse KVM 1.1.0
C:* #Ifs= 2 Cfg#= 1 Atr=40 MxPwr= 2mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=5ms
I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=usbhid
E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=5ms
Thanks for your help!
-Gonglei