Hi!

I've run two high speed iso streams (in/out) at the same time with quad buffering and everything went well. I'm impressed.

/Bernd
P.S.: there's only the one thing that the kernel hangs after disconnect... :-(



Alan Stern wrote:
On Fri, 23 Jan 2004, Greg KH wrote:


On Fri, Jan 23, 2004 at 02:51:16PM -0500, Alan Stern wrote:

Really? I didn't see any problems in it. Do you remember just what was wrong with the patch?

Did you try it? It dies horribly. Now that means either that we have our reference counting all wrong, or the patch isn't sane. I didn't take the time to check out either.


I thought I had tried it, but apparently not. Now that I have, I see what you mean.

However the basic principle is sound; it's just the implementation that
was a little off. You were waiting on a struct completion for the bus to
be deleted, but the completion was itself embedded in the bus! The patch
below should work better; it puts the completion on the stack instead. It applies against your gregkh-2.6 tree as of Sunday noon.


I tried the patch on my system and it worked okay, but my system was not a virgin kernel. In particular, it wouldn't be surprising if trying to unload an HCD module caused the rmmod process to hang, thanks to that outstanding issue of not releasing a kobject before all its children have been released. My test was done with patch as163 loaded; see

http://marc.theaimsgroup.com/?l=linux-usb-devel&m=107177993125318&w=2

http://marc.theaimsgroup.com/?l=linux-usb-devel&m=107178202227877&w=2

and the ensuing thread.

Alan Stern


===== drivers/usb/core/hcd.c 1.124 vs edited =====
--- 1.124/drivers/usb/core/hcd.c Tue Dec 30 13:25:12 2003
+++ edited/drivers/usb/core/hcd.c Sun Jan 25 12:33:22 2004
@@ -585,9 +585,11 @@
static void usb_host_release(struct class_device *class_dev)
{
struct usb_bus *bus = to_usb_bus(class_dev);
+ struct completion *released = bus->released;
if (bus->release)
bus->release(bus);
+ complete(released);
}
static struct class usb_host_class = {
@@ -709,6 +711,8 @@
*/
void usb_deregister_bus (struct usb_bus *bus)
{
+ struct completion released;
+
dev_info (bus->controller, "USB bus %d deregistered\n", bus->busnum);
/*
@@ -724,7 +728,10 @@
clear_bit (bus->busnum, busmap.busmap);
+ init_completion(&released);
+ bus->released = &released;
class_device_unregister(&bus->class_dev);
+ wait_for_completion(&released);
}
EXPORT_SYMBOL (usb_deregister_bus);
===== include/linux/usb.h 1.166 vs edited =====
--- 1.166/include/linux/usb.h Tue Dec 30 13:25:15 2003
+++ edited/include/linux/usb.h Sun Jan 25 12:33:22 2004
@@ -210,6 +210,7 @@
struct class_device class_dev; /* class device for this bus */
void (*release)(struct usb_bus *bus); /* function to destroy this bus's memory */
+ struct completion *released; /* wait for release */
};
#define to_usb_bus(d) container_of(d, struct usb_bus, class_dev)




-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel



------------------------------------------------------- The SF.Net email is sponsored by EclipseCon 2004 Premiere Conference on Open Tools Development and Integration See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. http://www.eclipsecon.org/osdn _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to