touch-packages team mailing list archive
-
touch-packages team
-
Mailing list archive
-
Message #78548
[Bug 1455924] Re: libusb occasionally hungs after suspend/resume
Please note that debug message about lost URB is not 100% accurate in
multi-threaded code because of harmless race condition.
** Description changed:
I'm trying to make g15daemon correctly recover after suspend/resume and found that it occasionally hungs after resume in libusb's usb_urb_transfer() (linux.c) on this line:
ioctl(dev->fd, IOCTL_USB_REAPURB, &context);
After some research I found that linux kernel internally has lists of
pending and completed requests. All requests - successful or not - are
moved from pending list to completed list, no requests should be lost.
But it looks like after suspend/resume some request may be lost (may be
a kernel bug). It that case IOCTL_USB_REAPURB would hung forever since
request it's waiting for will never appear on completed list.
There is simple workaround. After preceding IOCTL_USB_DISCARDURB call
our request is guaranteed to be completed, so there is no need to use
blocking IOCTL_USB_DISCARDURB, we may use non-blocking
IOCTL_USB_REAPURBNDELAY instead.
- I've attached path for this workaround. It also fixes race condition
+ I've attached patch with this workaround. It also fixes race condition
existed in original code, which may cause corruption of stack.
ProblemType: Bug
DistroRelease: Ubuntu 15.04
Package: libusb-0.1-4 2:0.1.12-25 [modified: lib/x86_64-linux-gnu/libusb-0.1.so.4.4.4]
ProcVersionSignature: Ubuntu 3.19.0-16.16-generic 3.19.3
Uname: Linux 3.19.0-16-generic x86_64
NonfreeKernelModules: fglrx
ApportVersion: 2.17.2-0ubuntu1
Architecture: amd64
CurrentDesktop: KDE
Date: Sun May 17 13:11:00 2015
Dependencies:
- gcc-5-base 5.1~rc1-0ubuntu1
- libc6 2.21-0ubuntu4
- libgcc1 1:5.1~rc1-0ubuntu1
- multiarch-support 2.21-0ubuntu4
+ gcc-5-base 5.1~rc1-0ubuntu1
+ libc6 2.21-0ubuntu4
+ libgcc1 1:5.1~rc1-0ubuntu1
+ multiarch-support 2.21-0ubuntu4
SourcePackage: libusb
UpgradeStatus: Upgraded to vivid on 2015-04-26 (21 days ago)
--
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to libusb in Ubuntu.
https://bugs.launchpad.net/bugs/1455924
Title:
libusb occasionally hungs after suspend/resume
Status in libusb package in Ubuntu:
New
Bug description:
I'm trying to make g15daemon correctly recover after suspend/resume and found that it occasionally hungs after resume in libusb's usb_urb_transfer() (linux.c) on this line:
ioctl(dev->fd, IOCTL_USB_REAPURB, &context);
After some research I found that linux kernel internally has lists of
pending and completed requests. All requests - successful or not - are
moved from pending list to completed list, no requests should be lost.
But it looks like after suspend/resume some request may be lost (may
be a kernel bug). It that case IOCTL_USB_REAPURB would hung forever
since request it's waiting for will never appear on completed list.
There is simple workaround. After preceding IOCTL_USB_DISCARDURB call
our request is guaranteed to be completed, so there is no need to use
blocking IOCTL_USB_DISCARDURB, we may use non-blocking
IOCTL_USB_REAPURBNDELAY instead.
I've attached patch with this workaround. It also fixes race condition
existed in original code, which may cause corruption of stack.
ProblemType: Bug
DistroRelease: Ubuntu 15.04
Package: libusb-0.1-4 2:0.1.12-25 [modified: lib/x86_64-linux-gnu/libusb-0.1.so.4.4.4]
ProcVersionSignature: Ubuntu 3.19.0-16.16-generic 3.19.3
Uname: Linux 3.19.0-16-generic x86_64
NonfreeKernelModules: fglrx
ApportVersion: 2.17.2-0ubuntu1
Architecture: amd64
CurrentDesktop: KDE
Date: Sun May 17 13:11:00 2015
Dependencies:
gcc-5-base 5.1~rc1-0ubuntu1
libc6 2.21-0ubuntu4
libgcc1 1:5.1~rc1-0ubuntu1
multiarch-support 2.21-0ubuntu4
SourcePackage: libusb
UpgradeStatus: Upgraded to vivid on 2015-04-26 (21 days ago)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libusb/+bug/1455924/+subscriptions
References