[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#409349: usbhid: control queue full; hung apcupsd task



# letting version tracking do its work
tags 409349 - squeeze
tags 409349 + patch moreinfo
quit

Hi again,

Steven Chamberlain wrote:
> On 05/04/12 13:48, hugo vanwoerkom wrote:

>> apcupsd  3.14.10-1 with MODEL: Back-UPS RS 700G and Sid kernel
>> 3.2.0-2-amd64. Can't reproduce problem.
>
> Thanks a lot.  So far I've not experienced this in 3.2.0-2-amd64
> 3.2.12-1 either but I've only been testing for a few hours.

Great, thanks.  If this is still reproducible on 2.6.37, based on

  $ git log --no-merges --oneline v2.6.37..v3.2.12 -- drivers/hid/usbhid/hid-core.c 
  fad9fbe8651e HID: usbhid: cancel timer for retry synchronously
  5b1b0b812a7b PM / Runtime: Add macro to test for runtime PM events
  6dc1418e1314 HID: yurex: recognize GeneralKeys wireless presenter as generic HID
  b4dbde9da8ec HID: Add Support for Setting and Getting Feature Reports from hidraw
  68229689b6dc HID: usbhid: base runtime PM on modern API
  4291ee305e9b HID: Add and use hid_<level>: dev_<level> equivalents

a path-limited bisect[1] to find the fix should not take many
iterations.  Let me know and I can send some commands to try.

The topmost and second-to-bottom commits look especially interesting.
(Unfortunately none of these looks too promising.)  I'm attaching a
copy of the topmost backported to 2.6.32.y.  Results from trying it
against the squeeze kernel, following instructions from [2], would be
interesting, though I am not too optimistic.

Hope that helps.

Grasping at straws,
Jonathan

[1] http://git-htmldocs.googlecode.com/git/git-bisect-lk2009.html
[2] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official
or the corresponding page from the debian-kernel-handbook package
From: Oliver Neukum <oliver@neukum.org>
Date: Thu, 13 Oct 2011 18:21:58 +0200
Subject: HID: usbhid: cancel timer for retry synchronously

commit fad9fbe8651e8abd9794d4b4c4133241aa3093b5 upstream.

This makes sure IO is never restarted while a reset is going on

In particular there seems to be no protection from hid_retry_timeout() calling
hid_start_in() which would start IO after hid_pre_reset() has already called
hid_cease_io() because that uses del_timer(), not del_timer_sync()

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 drivers/hid/usbhid/hid-core.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index e9add5b3481d..a8bdd6bc7ef2 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1216,7 +1216,7 @@ static void hid_cancel_delayed_stuff(struct usbhid_device *usbhid)
 
 static void hid_cease_io(struct usbhid_device *usbhid)
 {
-	del_timer(&usbhid->io_retry);
+	del_timer_sync(&usbhid->io_retry);
 	usb_kill_urb(usbhid->urbin);
 	usb_kill_urb(usbhid->urbctrl);
 	usb_kill_urb(usbhid->urbout);
-- 
1.7.10.2


Reply to: